Jenkins Security
Last updated
Last updated
Το Jenkins είναι ένα εργαλείο που προσφέρει μια απλή μέθοδο για τη δημιουργία ενός περιβάλλοντος συνεχούς ενσωμάτωσης ή συνεχούς παράδοσης (CI/CD) για σχεδόν οποιαδήποτε συνδυασμός γλωσσών προγραμματισμού και αποθετηρίων κώδικα χρησιμοποιώντας αγωγούς (pipelines). Επιπλέον, αυτοματοποιεί διάφορες καθημερινές αναπτυξιακές εργασίες. Αν και το Jenkins δεν εξαλείφει την ανάγκη δημιουργίας σεναρίων για κάθε βήμα, παρέχει έναν πιο γρήγορο και αξιόπιστο τρόπο για την ενσωμάτωση ολόκληρης της ακολουθίας εργαλείων κατασκευής, δοκιμής και αναπτυξιακών εργαλείων από αυτόν που μπορεί κανείς να κατασκευάσει εύκολα με το χέρι.
Basic Jenkins InformationΓια να αναζητήσετε ενδιαφέρουσες σελίδες Jenkins χωρίς πιστοποίηση όπως (/people ή /asynchPeople, που αναφέρει τους τρέχοντες χρήστες) μπορείτε να χρησιμοποιήσετε:
Ελέγξτε εάν μπορείτε να εκτελέσετε εντολές χωρίς να χρειάζεται επαλήθευση ταυτότητας:
Χωρίς διαπιστευτήρια μπορείτε να κοιτάξετε μέσα στη διαδρομή /asynchPeople/ ή /securityRealm/user/admin/search/index?q= για ονόματα χρηστών.
Μπορείτε να πάρετε την έκδοση του Jenkins από τη διαδρομή /oops ή /error
Στις βασικές πληροφορίες μπορείτε να ελέγξετε όλους τους τρόπους για να συνδεθείτε στο Jenkins:
Basic Jenkins InformationΘα μπορείτε να βρείτε περιπτώσεις Jenkins που σας επιτρέπουν να δημιουργήσετε ένα λογαριασμό και να συνδεθείτε μέσα σε αυτό. Τόσο απλά.
Επίσης, αν υπήρχε λειτουργία SSO/plugins, θα πρέπει να προσπαθήσετε να συνδεθείτε στην εφαρμογή χρησιμοποιώντας έναν δοκιμαστικό λογαριασμό (π.χ., έναν δοκιμαστικό λογαριασμό Github/Bitbucket). Κόλπο από εδώ.
Το Jenkins δεν έχει πολιτική κωδικού πρόσβασης και προστασία από βίαιη δοκιμή ονομάτων χρηστών. Είναι απαραίτητο να δοκιμάσετε βίαια τους χρήστες, καθώς μπορεί να χρησιμοποιούνται αδύναμοι κωδικοί πρόσβασης ή ονόματα χρηστών ως κωδικοί πρόσβασης, ακόμη και αντιστραμμένα ονόματα χρηστών ως κωδικοί πρόσβασης.
Χρησιμοποιήστε αυτό το python script ή αυτό το powershell script.
Πολλές οργανώσεις συνδυάζουν SaaS-based συστήματα διαχείρισης πηγαίου κώδικα (SCM) όπως το GitHub ή το GitLab με μια εσωτερική, αυτο-φιλοξενούμενη CI λύση όπως το Jenkins ή το TeamCity. Αυτή η ρύθμιση επιτρέπει στα CI συστήματα να λαμβάνουν webhook events από προμηθευτές SaaS πηγαίου κώδικα, κυρίως για την ενεργοποίηση των pipeline jobs.
Για να επιτευχθεί αυτό, οι οργανώσεις επιτρέπουν τις IP εύρους των πλατφορμών SCM, επιτρέποντάς τους να έχουν πρόσβαση στο εσωτερικό σύστημα CI μέσω webhooks. Ωστόσο, είναι σημαντικό να σημειωθεί ότι οποιοσδήποτε μπορεί να δημιουργήσει έναν λογαριασμό στο GitHub ή το GitLab και να τον ρυθμίσει για να ενεργοποιήσει ένα webhook, πιθανώς αποστέλλοντας αιτήματα στο εσωτερικό σύστημα CI.
Σε αυτά τα σενάρια θα υποθέσουμε ότι έχετε έναν έγκυρο λογαριασμό για πρόσβαση στο Jenkins.
Ανάλογα με τον μηχανισμό Εξουσιοδότησης που έχει ρυθμιστεί στο Jenkins και την άδεια του παραβιασμένου χρήστη, ενδέχεται να μπορείτε ή όχι να πραγματοποιήσετε τις παρακάτω επιθέσεις.
Για περισσότερες πληροφορίες, ελέγξτε τις βασικές πληροφορίες:
Basic Jenkins InformationΑν έχετε πρόσβαση στο Jenkins, μπορείτε να δείτε τους άλλους εγγεγραμμένους χρήστες στο http://127.0.0.1:8080/asynchPeople/
Χρησιμοποιήστε αυτό το script για να αποθηκεύσετε τις καταγραφές των build και τις μεταβλητές περιβάλλοντος των build, ελπίζοντας να βρείτε κείμενο σε καθαρή μορφή.
Εάν ο παραβιασμένος χρήστης έχει επαρκή δικαιώματα για να δημιουργήσει/τροποποιήσει έναν νέο κόμβο Jenkins και τα διαπιστευτήρια SSH έχουν ήδη αποθηκευτεί για πρόσβαση σε άλλους κόμβους, μπορεί να κλέψει αυτά τα διαπιστευτήρια δημιουργώντας/τροποποιώντας έναν κόμβο και ορίζοντας έναν κεντρικό υπολογιστή που θα καταγράψει τα διαπιστευτήρια χωρίς να επαληθεύει το κλειδί του κεντρικού υπολογιστή:
Συνήθως θα βρείτε τα διαπιστευτήρια ssh του Jenkins σε έναν παγκόσμιο πάροχο (/credentials/
), οπότε μπορείτε επίσης να τα αποθηκεύσετε όπως θα αποθηκεύατε οποιοδήποτε άλλο μυστικό. Περισσότερες πληροφορίες στην ενότητα Αποθήκευση μυστικών.
Η απόκτηση ενός κέλυφους στον διακομιστή Jenkins δίνει στον επιτιθέμενο τη δυνατότητα να διαρρεύσει όλα τα μυστικά και τις μεταβλητές περιβάλλοντος και να εκμεταλλευτεί άλλες μηχανές που βρίσκονται στο ίδιο δίκτυο ή ακόμα και να συλλέξει διαπιστευτήρια cloud.
Από προεπιλογή, το Jenkins θα τρέξει ως SYSTEM. Έτσι, η παραβίασή του θα δώσει στον επιτιθέμενο δικαιώματα SYSTEM.
Η δημιουργία/τροποποίηση ενός έργου είναι ένας τρόπος να αποκτήσετε RCE στον διακομιστή Jenkins:
Jenkins RCE Creating/Modifying ProjectΜπορείτε επίσης να αποκτήσετε RCE εκτελώντας ένα Groovy script, το οποίο μπορεί να είναι πιο αόρατο από τη δημιουργία ενός νέου έργου:
Jenkins RCE with Groovy ScriptΜπορείτε επίσης να αποκτήσετε RCE δημιουργώντας/τροποποιώντας ένα pipeline:
Jenkins RCE Creating/Modifying PipelineΓια να εκμεταλλευτείτε τα pipelines, πρέπει να έχετε πρόσβαση στο Jenkins.
Τα pipelines μπορούν επίσης να χρησιμοποιηθούν ως μηχανισμός κατασκευής σε έργα, σε αυτήν την περίπτωση μπορεί να διαμορφωθεί ένα αρχείο μέσα στο αποθετήριο που θα περιέχει τη σύνταξη του pipeline. Από προεπιλογή χρησιμοποιείται το /Jenkinsfile
:
Είναι επίσης δυνατόν να αποθηκεύσετε αρχεία διαμόρφωσης pipeline σε άλλα μέρη (σε άλλα αποθετήρια, για παράδειγμα) με σκοπό τον διαχωρισμό της πρόσβασης στο αποθετήριο και της πρόσβασης στο pipeline.
Εάν ένας επιτιθέμενος έχει δικαιώματα εγγραφής σε αυτό το αρχείο, θα μπορεί να το τροποποιήσει και ενδεχομένως να ενεργοποιήσει το pipeline χωρίς καν να έχει πρόσβαση στο Jenkins. Είναι δυνατόν ο επιτιθέμενος να χρειαστεί να παρακάμψει ορισμένες προστασίες κλαδιού (ανάλογα με την πλατφόρμα και τα δικαιώματα του χρήστη, μπορεί να παρακαμφθούν ή όχι).
Οι πιο συνηθισμένες ενέργειες για να εκτελέσετε ένα προσαρμοσμένο pipeline είναι:
Αίτηση ενσωμάτωσης (pull request) στο κύριο κλαδί (ή ενδεχομένως σε άλλα κλαδιά)
Πίεση στο κύριο κλαδί (ή ενδεχομένως σε άλλα κλαδιά)
Ενημέρωση του κύριου κλαδιού και αναμονή μέχρι να εκτελεστεί κάποια ενέργεια
Εάν είστε εξωτερικός χρήστης, δεν πρέπει να αναμένετε να δημιουργήσετε μια αίτηση ενσωμάτωσης στο κύριο κλαδί του αποθετηρίου ενός άλλου χρήστη/οργανισμού και να ενεργοποιήσετε το pipeline... αλλά αν είναι κακά διαμορφωμένο, μπορείτε πλήρως να παραβιάσετε εταιρείες αξιοποιώντας αυτό.
Στην προηγούμενη ενότητα RCE αναφέρθηκε ήδη μια τεχνική για απόκτηση RCE τροποποιώντας ένα pipeline.
Είναι δυνατόν να δηλώσετε μεταβλητές περιβάλλοντος σε απλό κείμενο για ολόκληρο το pipeline ή για συγκεκριμένα στάδια. Αυτές οι μεταβλητές περιβάλλοντος δεν πρέπει να περιέχουν ευαίσθητες πληροφορίες, αλλά ένας επιτιθέμενος μπορεί πάντα να ελέγξει όλες τις διαμορφώσεις/αρχεία Jenkins του pipeline:
Για πληροφορίες σχετικά με το πώς χειρίζεται συνήθως τα μυστικά το Jenkins, ανατρέξτε στις βασικές πληροφορίες:
Basic Jenkins InformationΟι διαπιστευτήρια μπορούν να είναι περιορισμένα σε παγκόσμιους παρόχους (/credentials/
) ή σε συγκεκριμένα έργα (/job/<project-name>/configure
). Επομένως, για να αποκτήσετε πρόσβαση σε όλα τα μυστικά, πρέπει να παραβιάσετε τουλάχιστον όλα τα έργα που περιέχουν μυστικά και να εκτελέσετε προσαρμοσμένες/μολυσμένες αγωγές.
Υπάρχει ένα άλλο πρόβλημα, για να αποκτήσετε ένα μυστικό μέσα στο περιβάλλον ενός αγωγού, πρέπει να γνωρίζετε το όνομα και τον τύπο του μυστικού. Για παράδειγμα, αν προσπαθήσετε να φορτώσετε ένα μυστικό usernamePassword
ως ένα μυστικό τύπου string
, θα λάβετε αυτό το σφάλμα:
Εδώ έχετε τον τρόπο για να φορτώσετε μερικούς κοινούς τύπους μυστικών:
Εδώ έχετε τον τρόπο για να φορτώσετε μερικούς κοινούς τύπους μυστικών:
Στο τέλος αυτής της σελίδας μπορείτε να βρείτε όλους τους τύπους διαπιστευτηρίων: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Ο καλύτερος τρόπος για να αποκτήσετε όλα τα μυστικά μαζί είναι να παραβιάσετε τη μηχανή Jenkins (τρέχοντας ένα αντίστροφο κέλυφος στον ενσωματωμένο κόμβο για παράδειγμα) και στη συνέχεια να διαρρεύσετε τα κλειδιά του διαχειριστή και τα κρυπτογραφημένα μυστικά και να τα αποκρυπτογραφήσετε εκτός σύνδεσης. Περισσότερα για το πώς να το κάνετε αυτό στην ενότητα Κόμβοι και Πράκτορες και στην ενότητα Μετά την Εκμετάλλευση.
Από την τεκμηρίωση: Η οδηγία triggers
καθορίζει τους αυτοματοποιημένους τρόπους με τους οποίους θα επανεκκινηθεί η Σειρά Ενεργειών. Για Σειρές Ενεργειών που είναι ενσωματωμένες με μια πηγή όπως το GitHub ή το BitBucket, οι triggers
μπορεί να μην είναι απαραίτητοι καθώς η ενσωμάτωση βασισμένη σε webhooks θα είναι ήδη παρούσα. Οι διαθέσιμοι ενεργοποιητές αυτή τη στιγμή είναι οι cron
, pollSCM
και upstream
.
Παράδειγμα cron:
Ελέγξτε άλλα παραδείγματα στα έγγραφα.
Ένα παράδειγμα Jenkins μπορεί να έχει διάφορους πράκτορες που τρέχουν σε διάφορες μηχανές. Από την οπτική γωνία ενός επιτιθέμενου, η πρόσβαση σε διάφορες μηχανές σημαίνει διαφορετικές δυνατότητες κλειδιών πρόσβασης στο cloud που μπορούν να κλαπούν ή διαφορετική πρόσβαση στο δίκτυο που μπορεί να καταχραστεί για εκμετάλλευση άλλων μηχανών.
Για περισσότερες πληροφορίες, ελέγξτε τις βασικές πληροφορίες:
Basic Jenkins InformationΜπορείτε να απαριθμήσετε τους διαμορφωμένους κόμβους στο /computer/
, συνήθως θα βρείτε τον Built-In Node
(που είναι ο κόμβος που εκτελεί το Jenkins) και πιθανώς και άλλους:
Είναι ιδιαίτερα ενδιαφέρον να παραβιάσετε τον ενσωματωμένο κόμβο επειδή περιέχει ευαίσθητες πληροφορίες του Jenkins.
Για να υποδείξετε ότι θέλετε να εκτελέσετε τη διαδικασία στον ενσωματωμένο κόμβο του Jenkins, μπορείτε να καθορίσετε μέσα στη διαδικασία την ακόλουθη διαμόρφωση:
Αγωγή σε ένα συγκεκριμένο πράκτορα, με έναν προγραμματισμένο χρονοδιακόπτη, με μεταβλητές περιβάλλοντος αγωγής και σταδίου, φόρτωση 2 μεταβλητών σε ένα βήμα και αποστολή αντίστροφου κελύφους:
Ο Metasploit είναι ένα εργαλείο ανοικτού κώδικα που χρησιμοποιείται για εκμετάλλευση ευπαθειών σε συστήματα υπολογιστών. Μπορεί να χρησιμοποιηθεί για να εκτελέσει επιθέσεις μετά την εκμετάλλευση, όπως η λήψη ελέγχου του συστήματος, η προσθήκη χρηστών, η κατάκτηση προνομίων και η συλλογή πληροφοριών από τον στόχο. Ο Metasploit παρέχει ένα ευέλικτο περιβάλλον για την εκτέλεση επιθέσεων και την ανάπτυξη εξατομικευμένων επιθέσεων. Μπορεί να χρησιμοποιηθεί είτε από τη γραμμή εντολών είτε μέσω του γραφικού περιβάλλοντος Armitage.
Μπορείτε να καταλογογραφήσετε τα μυστικά προσπελαύνοντας το /credentials/
αν έχετε αρκετές άδειες. Σημειώστε ότι αυτό θα καταλογογραφήσει μόνο τα μυστικά μέσα στο αρχείο credentials.xml
, αλλά τα αρχεία διαμόρφωσης της διαδικασίας κατασκευής μπορεί επίσης να έχουν περισσότερα μυστικά.
Αν μπορείτε να δείτε τη διαμόρφωση κάθε έργου, μπορείτε επίσης να δείτε εκεί τα ονόματα των μυστικών (μυστικά) που χρησιμοποιούνται για την πρόσβαση στο αποθετήριο και άλλα μυστικά του έργου.
Αυτά τα αρχεία απαιτούνται για την αποκρυπτογράφηση των μυστικών του Jenkins:
secrets/master.key
secrets/hudson.util.Secret
Τέτοια μυστικά συνήθως μπορούν να βρεθούν στα:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Εδώ υπάρχει ένας κανόνας για να τα βρείτε:
Εάν έχετε αντιγράψει τους απαραίτητους κωδικούς για την αποκρυπτογράφηση των μυστικών, χρησιμοποιήστε αυτό το σενάριο για να αποκρυπτογραφήσετε αυτά τα μυστικά.
Για να αποκρυπτογραφήσετε τα μυστικά του Jenkins από το Groovy, μπορείτε να χρησιμοποιήσετε την ακόλουθη μέθοδο:
Αυτός ο κώδικας χρησιμοποιεί την κλάση CredentialsProvider
για να αναζητήσει και να αποκτήσει πρόσβαση στα μυστικά του Jenkins. Στη συνέχεια, ελέγχει αν το μυστικό είναι τύπου UsernamePasswordCredentialsImpl
και αποκτά τον κωδικό πρόσβασης από αυτό.
Για να εκτελέσετε αυτόν τον κώδικα, μπορείτε να τον προσθέσετε σε ένα script στο Jenkins ή να τον εκτελέσετε από το Groovy Console Plugin. Με αυτόν τον τρόπο, θα μπορέσετε να αποκτήσετε πρόσβαση στα μυστικά του Jenkins και να τα αποκρυπτογραφήσετε για περαιτέρω ανάλυση ή χρήση.
Αποκτήστε πρόσβαση στο αρχείο config.xml του Jenkins στη διαδρομή /var/lib/jenkins/config.xml
ή C:\Program Files (x86)\Jenkis\
.
Αναζητήστε τη λέξη <useSecurity>true</useSecurity>
και αλλάξτε τη λέξη true
σε false
.
sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Επανεκκινήστε τον διακομιστή Jenkins: service jenkins restart
Τώρα πηγαίνετε ξανά στην πύλη του Jenkins και αυτή τη φορά ο Jenkins δεν θα ζητήσει κανένα διαπιστευτήριο. Μεταβείτε στην επιλογή "Διαχείριση Jenkins" για να ορίσετε ξανά τον κωδικό διαχειριστή.
Ενεργοποιήστε ξανά την ασφάλεια αλλάζοντας τις ρυθμίσεις σε <useSecurity>true</useSecurity>
και επανεκκινήστε ξανά τον Jenkins.