Jenkins Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jenkins είναι ένα εργαλείο που προσφέρει μια απλή μέθοδο για τη δημιουργία ενός continuous integration ή continuous delivery (CI/CD) περιβάλλοντος για σχεδόν οποιονδήποτε συνδυασμό γλωσσών προγραμματισμού και αποθετηρίων πηγαίου κώδικα χρησιμοποιώντας pipelines. Επιπλέον, αυτοματοποιεί διάφορες ρουτίνες ανάπτυξης. Ενώ το Jenkins δεν εξαλείφει την ανάγκη δημιουργίας scripts για μεμονωμένα βήματα, παρέχει μια ταχύτερη και πιο αξιόπιστη μέθοδο για την ενσωμάτωση ολόκληρης της ακολουθίας εργαλείων κατασκευής, δοκιμής και ανάπτυξης από ό,τι μπορεί κανείς να κατασκευάσει εύκολα χειροκίνητα.
Για να αναζητήσετε ενδιαφέροντες σελίδες Jenkins χωρίς αυθεντικοποίηση όπως (/people ή /asynchPeople, αυτή η λίστα περιλαμβάνει τους τρέχοντες χρήστες) μπορείτε να χρησιμοποιήσετε:
Ελέγξτε αν μπορείτε να εκτελέσετε εντολές χωρίς να χρειάζεται αυθεντικοποίηση:
Χωρίς διαπιστευτήρια μπορείτε να κοιτάξετε μέσα στο /asynchPeople/ path ή /securityRealm/user/admin/search/index?q= για ονόματα χρηστών.
Μπορείτε να αποκτήσετε την έκδοση του Jenkins από το path /oops ή /error
Στις βασικές πληροφορίες μπορείτε να ελέγξετε όλους τους τρόπους σύνδεσης μέσα στο Jenkins:
Θα μπορείτε να βρείτε παραδείγματα Jenkins που επιτρέπουν να δημιουργήσετε έναν λογαριασμό και να συνδεθείτε σε αυτόν. Όσο απλό και αν ακούγεται.
Επίσης, αν η λειτουργικότητα SSO/πρόσθετα ήταν παρούσα, τότε θα πρέπει να προσπαθήσετε να συνδεθείτε στην εφαρμογή χρησιμοποιώντας έναν δοκιμαστικό λογαριασμό (π.χ., έναν δοκιμαστικό λογαριασμό Github/Bitbucket). Κόλπο από εδώ.
Jenkins στερείται πολιτικής κωδικών πρόσβασης και μετριασμού brute-force ονομάτων χρηστών. Είναι απαραίτητο να brute-force τους χρήστες καθώς αδύναμοι κωδικοί πρόσβασης ή ονόματα χρηστών ως κωδικοί πρόσβασης μπορεί να είναι σε χρήση, ακόμη και αντίστροφα ονόματα χρηστών ως κωδικοί πρόσβασης.
Use this python script or this powershell script.
Πολλές οργανώσεις συνδυάζουν SaaS-based source control management (SCM) systems όπως το GitHub ή το GitLab με μια εσωτερική, self-hosted CI λύση όπως το Jenkins ή το TeamCity. Αυτή η ρύθμιση επιτρέπει στα CI συστήματα να λαμβάνουν webhook events από SaaS source control vendors, κυρίως για την ενεργοποίηση pipeline jobs.
Για να το επιτύχουν αυτό, οι οργανώσεις whitelist τις IP ranges των SCM platforms, επιτρέποντάς τους να έχουν πρόσβαση στο internal CI system μέσω webhooks. Ωστόσο, είναι σημαντικό να σημειωθεί ότι οποιοσδήποτε μπορεί να δημιουργήσει έναν λογαριασμό στο GitHub ή το GitLab και να τον ρυθμίσει ώστε να ενεργοποιεί ένα webhook, πιθανώς στέλνοντας αιτήματα στο internal CI system.
Σε αυτά τα σενάρια θα υποθέσουμε ότι έχετε έναν έγκυρο λογαριασμό για πρόσβαση στο Jenkins.
Ανάλογα με τον Authorization μηχανισμό που έχει ρυθμιστεί στο Jenkins και την άδεια του παραβιασμένου χρήστη, μπορεί να είστε σε θέση ή όχι να εκτελέσετε τις παρακάτω επιθέσεις.
For more information check the basic information:
Αν έχετε αποκτήσει πρόσβαση στο Jenkins, μπορείτε να καταγράψετε άλλους καταχωρημένους χρήστες στο http://127.0.0.1:8080/asynchPeople/
Use this script to dump build console outputs and build environment variables to hopefully find cleartext secrets.
Εάν ο συμβιβασμένος χρήστης έχει αρκετά δικαιώματα για να δημιουργήσει/τροποποιήσει έναν νέο κόμβο Jenkins και τα διαπιστευτήρια SSH είναι ήδη αποθηκευμένα για πρόσβαση σε άλλους κόμβους, θα μπορούσε να κλέψει αυτά τα διαπιστευτήρια δημιουργώντας/τροποποιώντας έναν κόμβο και ορίζοντας έναν διακομιστή που θα καταγράψει τα διαπιστευτήρια χωρίς να επαληθεύσει το κλειδί του διακομιστή:
Συνήθως θα βρείτε τα διαπιστευτήρια ssh του Jenkins σε έναν παγκόσμιο πάροχο (/credentials/
), οπότε μπορείτε επίσης να τα εκφορτώσετε όπως θα εκφορτώνατε οποιοδήποτε άλλο μυστικό. Περισσότερες πληροφορίες στην Ενότητα Εκφόρτωσης μυστικών.
Η απόκτηση ενός shell στον διακομιστή Jenkins δίνει στον επιτιθέμενο την ευκαιρία να διαρρεύσει όλα τα μυστικά και μεταβλητές περιβάλλοντος και να εκμεταλλευτεί άλλες μηχανές που βρίσκονται στο ίδιο δίκτυο ή ακόμα και να συγκεντρώσει διαπιστευτήρια cloud.
Από προεπιλογή, το Jenkins θα τρέχει ως SYSTEM. Έτσι, η συμβιβασμένη του κατάσταση θα δώσει στον επιτιθέμενο δικαιώματα SYSTEM.
Η δημιουργία/τροποποίηση ενός έργου είναι ένας τρόπος για να αποκτήσετε RCE πάνω στον διακομιστή Jenkins:
Μπορείτε επίσης να αποκτήσετε RCE εκτελώντας ένα σενάριο Groovy, το οποίο μπορεί να είναι πιο διακριτικό από τη δημιουργία ενός νέου έργου:
Μπορείτε επίσης να αποκτήσετε RCE δημιουργώντας/τροποποιώντας ένα pipeline:
Για να εκμεταλλευτείτε τα pipelines, πρέπει ακόμα να έχετε πρόσβαση στο Jenkins.
Pipelines μπορούν επίσης να χρησιμοποιηθούν ως μηχανισμός κατασκευής σε έργα, σε αυτή την περίπτωση μπορεί να ρυθμιστεί ένα αρχείο μέσα στο αποθετήριο που θα περιέχει τη σύνταξη του pipeline. Από προεπιλογή χρησιμοποιείται το /Jenkinsfile
:
Είναι επίσης δυνατή η αποθήκευση αρχείων ρύθμισης pipeline σε άλλες τοποθεσίες (σε άλλα αποθετήρια για παράδειγμα) με στόχο την διαχωριστική πρόσβαση στο αποθετήριο και την πρόσβαση στο pipeline.
Εάν ένας επιτιθέμενος έχει δικαιώματα εγγραφής σε αυτό το αρχείο, θα είναι σε θέση να τροποποιήσει και πιθανώς να ενεργοποιήσει το pipeline χωρίς καν να έχει πρόσβαση στο Jenkins. Είναι πιθανό ο επιτιθέμενος να χρειαστεί να παρακάμψει κάποιες προστασίες κλάδου (ανάλογα με την πλατφόρμα και τα δικαιώματα του χρήστη, αυτές μπορεί να παρακαμφθούν ή όχι).
Οι πιο συνηθισμένοι ενεργοποιητές για την εκτέλεση ενός προσαρμοσμένου pipeline είναι:
Αίτημα έλξης προς τον κύριο κλάδο (ή πιθανώς προς άλλους κλάδους)
Προώθηση στον κύριο κλάδο (ή πιθανώς προς άλλους κλάδους)
Ενημέρωση του κύριου κλάδου και αναμονή μέχρι να εκτελεστεί με κάποιο τρόπο
Εάν είστε εξωτερικός χρήστης, δεν θα πρέπει να περιμένετε να δημιουργήσετε ένα PR στον κύριο κλάδο του αποθετηρίου άλλου χρήστη/οργάνωσης και να ενεργοποιήσετε το pipeline... αλλά αν είναι κακώς ρυθμισμένο, θα μπορούσατε να συμβιβάσετε πλήρως εταιρείες απλά εκμεταλλευόμενοι αυτό.
Στην προηγούμενη ενότητα RCE, είχε ήδη υποδειχθεί μια τεχνική για να αποκτήσετε RCE τροποποιώντας ένα pipeline.
Είναι δυνατή η δήλωση μεταβλητών περιβάλλοντος σε καθαρό κείμενο για ολόκληρο το pipeline ή για συγκεκριμένα στάδια. Αυτές οι μεταβλητές περιβάλλοντος δεν θα πρέπει να περιέχουν ευαίσθητες πληροφορίες, αλλά ένας επιτιθέμενος θα μπορούσε πάντα να ελέγξει όλες τις ρυθμίσεις του pipeline/Jenkinsfiles:
Για πληροφορίες σχετικά με το πώς συνήθως αντιμετωπίζονται τα μυστικά από τον Jenkins, ρίξτε μια ματιά στις βασικές πληροφορίες:
Οι πιστοποιήσεις μπορούν να είναι περιορισμένες σε παγκόσμιους παρόχους (/credentials/
) ή σε συγκεκριμένα έργα (/job/<project-name>/configure
). Επομένως, για να εξάγετε όλα αυτά, πρέπει να συμβιβάσετε τουλάχιστον όλα τα έργα που περιέχουν μυστικά και να εκτελέσετε προσαρμοσμένες/μολυσμένες ροές εργασίας.
Υπάρχει ένα άλλο πρόβλημα, για να αποκτήσετε ένα μυστικό μέσα στο env μιας ροής εργασίας, πρέπει να γνωρίζετε το όνομα και τον τύπο του μυστικού. Για παράδειγμα, αν προσπαθήσετε να φορτώσετε ένα usernamePassword
μυστικό ως string
μυστικό, θα λάβετε αυτό το σφάλμα:
Εδώ έχετε τον τρόπο να φορτώσετε μερικούς κοινούς τύπους μυστικών:
Στο τέλος αυτής της σελίδας μπορείτε να βρείτε όλους τους τύπους διαπιστευτηρίων: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Ο καλύτερος τρόπος για να ξεφορτώσετε όλα τα μυστικά ταυτόχρονα είναι να παραβιάσετε τη μηχανή Jenkins (τρέχοντας ένα reverse shell στον ενσωματωμένο κόμβο για παράδειγμα) και στη συνέχεια να διαρρεύσετε τα κύρια κλειδιά και τα κρυπτογραφημένα μυστικά και να τα αποκρυπτογραφήσετε εκτός σύνδεσης. Περισσότερα σχετικά με το πώς να το κάνετε αυτό στην ενότητα Nodes & Agents και στην ενότητα Post Exploitation.
Από την τεκμηρίωση: Η οδηγία triggers
ορίζει τους αυτοματοποιημένους τρόπους με τους οποίους η Pipeline θα πρέπει να επαναληφθεί. Για Pipelines που είναι ενσωματωμένες με μια πηγή όπως το GitHub ή το BitBucket, οι triggers
μπορεί να μην είναι απαραίτητοι καθώς η ενσωμάτωσή τους με webhooks πιθανόν να είναι ήδη παρούσα. Οι διαθέσιμοι triggers αυτή τη στιγμή είναι οι cron
, pollSCM
και upstream
.
Παράδειγμα cron:
Check other examples in the docs.
A Jenkins instance might have different agents running in different machines. From an attacker perspective, access to different machines means different potential cloud credentials to steal or different network access that could be abuse to exploit other machines.
For more information check the basic information:
You can enumerate the configured nodes in /computer/
, you will usually find the Built-In Node
(which is the node running Jenkins) and potentially more:
It is συγκεκριμένα ενδιαφέρον να συμβιβαστεί ο Built-In node γιατί περιέχει ευαίσθητες πληροφορίες Jenkins.
To indicate you want to run the pipeline in the built-in Jenkins node you can specify inside the pipeline the following config:
Pipeline σε έναν συγκεκριμένο πράκτορα, με έναν cron trigger, με μεταβλητές περιβάλλοντος pipeline και stage, φορτώνοντας 2 μεταβλητές σε ένα βήμα και στέλνοντας ένα reverse shell:
Μπορείτε να καταγράψετε τα μυστικά προσβάλλοντας το /credentials/
αν έχετε αρκετές άδειες. Σημειώστε ότι αυτό θα καταγράψει μόνο τα μυστικά μέσα στο αρχείο credentials.xml
, αλλά τα αρχεία διαμόρφωσης κατασκευής μπορεί επίσης να έχουν περισσότερα διαπιστευτήρια.
Αν μπορείτε να δείτε τη διαμόρφωση κάθε έργου, μπορείτε επίσης να δείτε εκεί τα ονόματα των διαπιστευτηρίων (μυστικών) που χρησιμοποιούνται για την πρόσβαση στο αποθετήριο και άλλα διαπιστευτήρια του έργου.
Αυτά τα αρχεία είναι απαραίτητα για να αποκρυπτογραφήσετε τα μυστικά του Jenkins:
secrets/master.key
secrets/hudson.util.Secret
Τέτοια μυστικά μπορούν συνήθως να βρεθούν σε:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Ακολουθεί μια regex για να τα βρείτε:
Εάν έχετε εξάγει τα απαραίτητα κωδικούς πρόσβασης για την αποκρυπτογράφηση των μυστικών, χρησιμοποιήστε αυτό το σενάριο για να αποκρυπτογραφήσετε αυτά τα μυστικά.
Πρόσβαση στο αρχείο Jenkins config.xml στο /var/lib/jenkins/config.xml
ή C:\Program Files (x86)\Jenkins\
Αναζητήστε τη λέξη <useSecurity>true</useSecurity>
και αλλάξτε τη λέξη true
σε false
.
sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Επανεκκινήστε τον Jenkins server: service jenkins restart
Τώρα πηγαίνετε ξανά στην πύλη Jenkins και ο Jenkins δεν θα ζητήσει καμία πιστοποίηση αυτή τη φορά. Πλοηγηθείτε στο "Manage Jenkins" για να ρυθμίσετε ξανά τον κωδικό πρόσβασης διαχειριστή.
Ενεργοποιήστε ξανά την ασφάλεια αλλάζοντας τις ρυθμίσεις σε <useSecurity>true</useSecurity>
και επανεκκινήστε ξανά τον Jenkins.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)