Jenkins Security
Βασικές Πληροφορίες
Το Jenkins είναι ένα εργαλείο που προσφέρει μια απλή μέθοδο για τη δημιουργία ενός περιβάλλοντος συνεχούς ενσωμάτωσης ή συνεχούς παράδοσης (CI/CD) για σχεδόν οποιαδήποτε συνδυασμός γλωσσών προγραμματισμού και αποθετηρίων κώδικα χρησιμοποιώντας αγωγούς (pipelines). Επιπλέον, αυτοματοποιεί διάφορες καθημερινές αναπτυξιακές εργασίες. Αν και το Jenkins δεν εξαλείφει την ανάγκη δημιουργίας σεναρίων για κάθε βήμα, παρέχει έναν πιο γρήγορο και αξιόπιστο τρόπο για την ενσωμάτωση ολόκληρης της ακολουθίας εργαλείων κατασκευής, δοκιμής και αναπτυξιακών εργαλείων από αυτόν που μπορεί κανείς να κατασκευάσει εύκολα με το χέρι.
pageBasic Jenkins InformationΜη εξουσιοδοτημένη Απαρίθμηση
Για να αναζητήσετε ενδιαφέρουσες σελίδες Jenkins χωρίς πιστοποίηση όπως (/people ή /asynchPeople, που αναφέρει τους τρέχοντες χρήστες) μπορείτε να χρησιμοποιήσετε:
Ελέγξτε εάν μπορείτε να εκτελέσετε εντολές χωρίς να χρειάζεται επαλήθευση ταυτότητας:
Χωρίς διαπιστευτήρια μπορείτε να κοιτάξετε μέσα στη διαδρομή /asynchPeople/ ή /securityRealm/user/admin/search/index?q= για ονόματα χρηστών.
Μπορείτε να πάρετε την έκδοση του Jenkins από τη διαδρομή /oops ή /error
Γνωστές Ευπάθειες
Σύνδεση
Στις βασικές πληροφορίες μπορείτε να ελέγξετε όλους τους τρόπους για να συνδεθείτε στο Jenkins:
pageBasic Jenkins InformationΕγγραφή
Θα μπορείτε να βρείτε περιπτώσεις Jenkins που σας επιτρέπουν να δημιουργήσετε ένα λογαριασμό και να συνδεθείτε μέσα σε αυτό. Τόσο απλά.
SSO Σύνδεση
Επίσης, αν υπήρχε λειτουργία SSO/plugins, θα πρέπει να προσπαθήσετε να συνδεθείτε στην εφαρμογή χρησιμοποιώντας έναν δοκιμαστικό λογαριασμό (π.χ., έναν δοκιμαστικό λογαριασμό Github/Bitbucket). Κόλπο από εδώ.
Βίαιη Δοκιμή
Το Jenkins δεν έχει πολιτική κωδικού πρόσβασης και προστασία από βίαιη δοκιμή ονομάτων χρηστών. Είναι απαραίτητο να δοκιμάσετε βίαια τους χρήστες, καθώς μπορεί να χρησιμοποιούνται αδύναμοι κωδικοί πρόσβασης ή ονόματα χρηστών ως κωδικοί πρόσβασης, ακόμη και αντιστραμμένα ονόματα χρηστών ως κωδικοί πρόσβασης.
Επίθεση με password spraying
Χρησιμοποιήστε αυτό το python script ή αυτό το powershell script.
Παράκαμψη IP Whitelisting
Πολλές οργανώσεις συνδυάζουν SaaS-based συστήματα διαχείρισης πηγαίου κώδικα (SCM) όπως το GitHub ή το GitLab με μια εσωτερική, αυτο-φιλοξενούμενη CI λύση όπως το Jenkins ή το TeamCity. Αυτή η ρύθμιση επιτρέπει στα CI συστήματα να λαμβάνουν webhook events από προμηθευτές SaaS πηγαίου κώδικα, κυρίως για την ενεργοποίηση των pipeline jobs.
Για να επιτευχθεί αυτό, οι οργανώσεις επιτρέπουν τις IP εύρους των πλατφορμών SCM, επιτρέποντάς τους να έχουν πρόσβαση στο εσωτερικό σύστημα CI μέσω webhooks. Ωστόσο, είναι σημαντικό να σημειωθεί ότι οποιοσδήποτε μπορεί να δημιουργήσει έναν λογαριασμό στο GitHub ή το GitLab και να τον ρυθμίσει για να ενεργοποιήσει ένα webhook, πιθανώς αποστέλλοντας αιτήματα στο εσωτερικό σύστημα CI.
Κατάχρηση εσωτερικού Jenkins
Σε αυτά τα σενάρια θα υποθέσουμε ότι έχετε έναν έγκυρο λογαριασμό για πρόσβαση στο Jenkins.
Ανάλογα με τον μηχανισμό Εξουσιοδότησης που έχει ρυθμιστεί στο Jenkins και την άδεια του παραβιασμένου χρήστη, ενδέχεται να μπορείτε ή όχι να πραγματοποιήσετε τις παρακάτω επιθέσεις.
Για περισσότερες πληροφορίες, ελέγξτε τις βασικές πληροφορίες:
pageBasic Jenkins InformationΛίστα χρηστών
Αν έχετε πρόσβαση στο Jenkins, μπορείτε να δείτε τους άλλους εγγεγραμμένους χρήστες στο http://127.0.0.1:8080/asynchPeople/
Αποθήκευση καταγραφών για εύρεση κειμένου σε καθαρή μορφή
Χρησιμοποιήστε αυτό το script για να αποθηκεύσετε τις καταγραφές των build και τις μεταβλητές περιβάλλοντος των build, ελπίζοντας να βρείτε κείμενο σε καθαρή μορφή.
Κλοπή διαπιστευτηρίων SSH
Εάν ο παραβιασμένος χρήστης έχει επαρκή δικαιώματα για να δημιουργήσει/τροποποιήσει έναν νέο κόμβο Jenkins και τα διαπιστευτήρια SSH έχουν ήδη αποθηκευτεί για πρόσβαση σε άλλους κόμβους, μπορεί να κλέψει αυτά τα διαπιστευτήρια δημιουργώντας/τροποποιώντας έναν κόμβο και ορίζοντας έναν κεντρικό υπολογιστή που θα καταγράψει τα διαπιστευτήρια χωρίς να επαληθεύει το κλειδί του κεντρικού υπολογιστή:
Συνήθως θα βρείτε τα διαπιστευτήρια ssh του Jenkins σε έναν παγκόσμιο πάροχο (/credentials/
), οπότε μπορείτε επίσης να τα αποθηκεύσετε όπως θα αποθηκεύατε οποιοδήποτε άλλο μυστικό. Περισσότερες πληροφορίες στην ενότητα Αποθήκευση μυστικών.
RCE στο Jenkins
Η απόκτηση ενός κέλυφους στον διακομιστή Jenkins δίνει στον επιτιθέμενο τη δυνατότητα να διαρρεύσει όλα τα μυστικά και τις μεταβλητές περιβάλλοντος και να εκμεταλλευτεί άλλες μηχανές που βρίσκονται στο ίδιο δίκτυο ή ακόμα και να συλλέξει διαπιστευτήρια cloud.
Από προεπιλογή, το Jenkins θα τρέξει ως SYSTEM. Έτσι, η παραβίασή του θα δώσει στον επιτιθέμενο δικαιώματα SYSTEM.
RCE Δημιουργία/Τροποποίηση ενός έργου
Η δημιουργία/τροποποίηση ενός έργου είναι ένας τρόπος να αποκτήσετε RCE στον διακομιστή Jenkins:
pageJenkins RCE Creating/Modifying ProjectRCE Εκτέλεση Groovy script
Μπορείτε επίσης να αποκτήσετε RCE εκτελώντας ένα Groovy script, το οποίο μπορεί να είναι πιο αόρατο από τη δημιουργία ενός νέου έργου:
pageJenkins RCE with Groovy ScriptRCE Δημιουργία/Τροποποίηση Pipeline
Μπορείτε επίσης να αποκτήσετε RCE δημιουργώντας/τροποποιώντας ένα pipeline:
pageJenkins RCE Creating/Modifying PipelineΕκμετάλλευση Pipeline
Για να εκμεταλλευτείτε τα pipelines, πρέπει να έχετε πρόσβαση στο Jenkins.
Κατασκευή Pipelines
Τα pipelines μπορούν επίσης να χρησιμοποιηθούν ως μηχανισμός κατασκευής σε έργα, σε αυτήν την περίπτωση μπορεί να διαμορφωθεί ένα αρχείο μέσα στο αποθετήριο που θα περιέχει τη σύνταξη του pipeline. Από προεπιλογή χρησιμοποιείται το /Jenkinsfile
:
Είναι επίσης δυνατόν να αποθηκεύσετε αρχεία διαμόρφωσης pipeline σε άλλα μέρη (σε άλλα αποθετήρια, για παράδειγμα) με σκοπό τον διαχωρισμό της πρόσβασης στο αποθετήριο και της πρόσβασης στο pipeline.
Εάν ένας επιτιθέμενος έχει δικαιώματα εγγραφής σε αυτό το αρχείο, θα μπορεί να το τροποποιήσει και ενδεχομένως να ενεργοποιήσει το pipeline χωρίς καν να έχει πρόσβαση στο Jenkins. Είναι δυνατόν ο επιτιθέμενος να χρειαστεί να παρακάμψει ορισμένες προστασίες κλαδιού (ανάλογα με την πλατφόρμα και τα δικαιώματα του χρήστη, μπορεί να παρακαμφθούν ή όχι).
Οι πιο συνηθισμένες ενέργειες για να εκτελέσετε ένα προσαρμοσμένο pipeline είναι:
Αίτηση ενσωμάτωσης (pull request) στο κύριο κλαδί (ή ενδεχομένως σε άλλα κλαδιά)
Πίεση στο κύριο κλαδί (ή ενδεχομένως σε άλλα κλαδιά)
Ενημέρωση του κύριου κλαδιού και αναμονή μέχρι να εκτελεστεί κάποια ενέργεια
Εάν είστε εξωτερικός χρήστης, δεν πρέπει να αναμένετε να δημιουργήσετε μια αίτηση ενσωμάτωσης στο κύριο κλαδί του αποθετηρίου ενός άλλου χρήστη/οργανισμού και να ενεργοποιήσετε το pipeline... αλλά αν είναι κακά διαμορφωμένο, μπορείτε πλήρως να παραβιάσετε εταιρείες αξιοποιώντας αυτό.
Pipeline RCE
Στην προηγούμενη ενότητα RCE αναφέρθηκε ήδη μια τεχνική για απόκτηση RCE τροποποιώντας ένα pipeline.
Έλεγχος μεταβλητών περιβάλλοντος
Είναι δυνατόν να δηλώσετε μεταβλητές περιβάλλοντος σε απλό κείμενο για ολόκληρο το pipeline ή για συγκεκριμένα στάδια. Αυτές οι μεταβλητές περιβάλλοντος δεν πρέπει να περιέχουν ευαίσθητες πληροφορίες, αλλά ένας επιτιθέμενος μπορεί πάντα να ελέγξει όλες τις διαμορφώσεις/αρχεία Jenkins του pipeline:
Διαρροή μυστικών
Για πληροφορίες σχετικά με το πώς χειρίζεται συνήθως τα μυστικά το Jenkins, ανατρέξτε στις βασικές πληροφορίες:
pageBasic 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 που μπορούν να κλαπούν ή διαφορετική πρόσβαση στο δίκτυο που μπορεί να καταχραστεί για εκμετάλλευση άλλων μηχανών.
Για περισσότερες πληροφορίες, ελέγξτε τις βασικές πληροφορίες:
pageBasic Jenkins InformationΜπορείτε να απαριθμήσετε τους διαμορφωμένους κόμβους στο /computer/
, συνήθως θα βρείτε τον Built-In Node
(που είναι ο κόμβος που εκτελεί το Jenkins) και πιθανώς και άλλους:
Είναι ιδιαίτερα ενδιαφέρον να παραβιάσετε τον ενσωματωμένο κόμβο επειδή περιέχει ευαίσθητες πληροφορίες του Jenkins.
Για να υποδείξετε ότι θέλετε να εκτελέσετε τη διαδικασία στον ενσωματωμένο κόμβο του Jenkins, μπορείτε να καθορίσετε μέσα στη διαδικασία την ακόλουθη διαμόρφωση:
Πλήρης παράδειγμα
Αγωγή σε ένα συγκεκριμένο πράκτορα, με έναν προγραμματισμένο χρονοδιακόπτη, με μεταβλητές περιβάλλοντος αγωγής και σταδίου, φόρτωση 2 μεταβλητών σε ένα βήμα και αποστολή αντίστροφου κελύφους:
Ο Metasploit είναι ένα εργαλείο ανοικτού κώδικα που χρησιμοποιείται για εκμετάλλευση ευπαθειών σε συστήματα υπολογιστών. Μπορεί να χρησιμοποιηθεί για να εκτελέσει επιθέσεις μετά την εκμετάλλευση, όπως η λήψη ελέγχου του συστήματος, η προσθήκη χρηστών, η κατάκτηση προνομίων και η συλλογή πληροφοριών από τον στόχο. Ο Metasploit παρέχει ένα ευέλικτο περιβάλλον για την εκτέλεση επιθέσεων και την ανάπτυξη εξατομικευμένων επιθέσεων. Μπορεί να χρησιμοποιηθεί είτε από τη γραμμή εντολών είτε μέσω του γραφικού περιβάλλοντος Armitage.
Μυστικά του Jenkins
Μπορείτε να καταλογογραφήσετε τα μυστικά προσπελαύνοντας το /credentials/
αν έχετε αρκετές άδειες. Σημειώστε ότι αυτό θα καταλογογραφήσει μόνο τα μυστικά μέσα στο αρχείο credentials.xml
, αλλά τα αρχεία διαμόρφωσης της διαδικασίας κατασκευής μπορεί επίσης να έχουν περισσότερα μυστικά.
Αν μπορείτε να δείτε τη διαμόρφωση κάθε έργου, μπορείτε επίσης να δείτε εκεί τα ονόματα των μυστικών (μυστικά) που χρησιμοποιούνται για την πρόσβαση στο αποθετήριο και άλλα μυστικά του έργου.
Από Groovy
pageJenkins Dumping Secrets from GroovyΑπό τον δίσκο
Αυτά τα αρχεία απαιτούνται για την αποκρυπτογράφηση των μυστικών του Jenkins:
secrets/master.key
secrets/hudson.util.Secret
Τέτοια μυστικά συνήθως μπορούν να βρεθούν στα:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Εδώ υπάρχει ένας κανόνας για να τα βρείτε:
Αποκρυπτογράφηση μυστικών του Jenkins εκτός σύνδεσης
Εάν έχετε αντιγράψει τους απαραίτητους κωδικούς για την αποκρυπτογράφηση των μυστικών, χρησιμοποιήστε αυτό το σενάριο για να αποκρυπτογραφήσετε αυτά τα μυστικά.
Αποκρυπτογράφηση μυστικών του Jenkins από το Groovy
Για να αποκρυπτογραφήσετε τα μυστικά του 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.
Αναφορές
Last updated