Βασικές πληροφορίες για το Jenkins
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Πρόσβαση
Όνομα χρήστη + Κωδικός
Ο πιο συνηθισμένος τρόπος για να συνδεθείς στο Jenkins είναι με όνομα χρήστη ή κωδικό πρόσβασης
Cookie
Αν ένα αποκρυπτογραφημένο/εξουσιοδοτημένο cookie κλαπεί, μπορεί να χρησιμοποιηθεί για πρόσβαση στη συνεδρία του χρήστη. Το cookie συνήθως ονομάζεται JSESSIONID.*. (Ένας χρήστης μπορεί να τερματίσει όλες τις συνεδρίες του, αλλά πρέπει πρώτα να ανακαλύψει ότι ένα cookie κλάπηκε).
SSO/Plugins
Το Jenkins μπορεί να ρυθμιστεί με plugins ώστε να είναι προσβάσιμο μέσω τρίτου μέρους SSO.
Tokens
Οι χρήστες μπορούν να δημιουργήσουν tokens για να δώσουν πρόσβαση σε εφαρμογές ώστε να τους μιμηθούν μέσω CLI ή REST API.
SSH Keys
Αυτό το component παρέχει ενσωματωμένο SSH server για το Jenkins. Είναι μια εναλλακτική διεπαφή για το Jenkins CLI, και εντολές μπορούν να κληθούν με αυτόν τον τρόπο χρησιμοποιώντας οποιονδήποτε SSH client. (Από τα docs)
Εξουσιοδότηση
Στο /configureSecurity είναι δυνατό να διαμορφωθεί η μέθοδος εξουσιοδότησης του Jenkins. Υπάρχουν αρκετές επιλογές:
- Anyone can do anything: Ακόμα και η ανώνυμη πρόσβαση μπορεί να διαχειριστεί τον server
- Legacy mode: Ίδιο με το Jenkins <1.164. Αν έχεις το “admin” role, θα σου δοθεί πλήρης έλεγχος του συστήματος, ενώ διαφορετικά (συμπεριλαμβανομένων των anonymous χρηστών) θα έχεις πρόσβαση ανάγνωσης.
- Logged-in users can do anything: Σε αυτή τη λειτουργία, κάθε συνδεδεμένος χρήστης αποκτά πλήρη έλεγχο του Jenkins. Ο μόνος χρήστης που δεν θα έχει πλήρη έλεγχο είναι ο anonymous user, που έχει μόνο πρόσβαση ανάγνωσης.
- Matrix-based security: Μπορείς να διαμορφώσεις ποιος μπορεί να κάνει τι σε έναν πίνακα. Κάθε στήλη αντιπροσωπεύει μια άδεια. Κάθε γραμμή αντιπροσωπεύει έναν χρήστη ή μια ομάδα/ρόλο. Αυτό περιλαμβάνει έναν ειδικό χρήστη ‘anonymous’, που αντιπροσωπεύει μη-επαληθευμένους χρήστες, καθώς και ‘authenticated’, που αντιπροσωπεύει όλους τους επαληθευμένους χρήστες.
.png)
- Project-based Matrix Authorization Strategy: Αυτή η λειτουργία είναι μια επέκταση της “Matrix-based security” που επιτρέπει πρόσθετους ACL matrix να οριστούν για κάθε project ξεχωριστά.
- Role-Based Strategy: Επιτρέπει τον ορισμό εξουσιοδοτήσεων χρησιμοποιώντας μια στρατηγική βασισμένη σε ρόλους. Διαχειρίσου τους ρόλους στο
/role-strategy.
Security Realm
Στο /configureSecurity είναι δυνατό να διαμορφωθεί το security realm. Από προεπιλογή το Jenkins υποστηρίζει μερικά διαφορετικά Security Realms:
- Delegate to servlet container: Για ανάθεση authentication σε ένα servlet container που τρέχει τον Jenkins controller, όπως το Jetty.
- Jenkins’ own user database: Χρήση της ενσωματωμένης βάσης χρηστών του Jenkins για authentication αντί να γίνει ανάθεση σε εξωτερικό σύστημα. Αυτό είναι ενεργοποιημένο από προεπιλογή.
- LDAP: Ανάθεση όλου του authentication σε διαμορφωμένο LDAP server, συμπεριλαμβανομένων χρηστών και ομάδων.
- Unix user/group database: Αναθέτει το authentication στη βασική Unix OS-level βάση χρηστών στον Jenkins controller. Αυτή η λειτουργία επιτρέπει επίσης την επαναχρησιμοποίηση των Unix groups για εξουσιοδότηση.
Plugins μπορούν να παρέχουν επιπλέον security realms που μπορεί να είναι χρήσιμα για ενσωμάτωση του Jenkins σε υπάρχοντα identity systems, όπως:
Jenkins Nodes, Agents & Executors
Ορισμοί από τα docs:
Nodes είναι οι μηχανές στις οποίες τρέχουν οι build agents. Το Jenkins παρακολουθεί κάθε προσαρτημένο node για χώρο στο δίσκο, ελεύθερο temp space, ελεύθερο swap, συγχρονισμό/χρόνο ρολογιού και χρόνο απόκρισης. Ένα node τίθεται offline αν οποιαδήποτε από αυτές τις τιμές βγει εκτός των ρυθμισμένων ορίων.
Agents διαχειρίζονται την εκτέλεση εργασιών εκ μέρους του Jenkins controller χρησιμοποιώντας executors. Ένας agent μπορεί να χρησιμοποιεί οποιοδήποτε λειτουργικό σύστημα που υποστηρίζει Java. Τα εργαλεία που απαιτούνται για builds και tests εγκαθίστανται στον κόμβο όπου τρέχει ο agent· μπορούν να εγκατασταθούν απευθείας ή σε container (Docker ή Kubernetes). Κάθε agent είναι ουσιαστικά μια διεργασία με το δικό της PID στη host μηχανή.
Ένας executor είναι μια θέση για εκτέλεση εργασιών· ουσιαστικά, είναι ένα thread στον agent. Ο αριθμός executors σε έναν node ορίζει τον αριθμό παράλληλων εργασιών που μπορούν να εκτελεστούν στον node την ίδια στιγμή. Με άλλα λόγια, αυτό καθορίζει τον αριθμό ταυτόχρονων Pipeline stages που μπορούν να εκτελούνται σε αυτόν τον node την ίδια στιγμή.
Jenkins Secrets
Encryption of Secrets and Credentials
Ορισμός από τα docs: Το Jenkins χρησιμοποιεί AES για να κρυπτογραφήσει και να προστατέψει μυστικά, credentials, και τα αντίστοιχα κλειδιά κρυπτογράφησης. Αυτά τα κλειδιά κρυπτογράφησης αποθηκεύονται στο $JENKINS_HOME/secrets/ μαζί με το master key που χρησιμοποιείται για την προστασία αυτών των κλειδιών. Αυτός ο κατάλογος θα πρέπει να ρυθμιστεί έτσι ώστε μόνο ο χρήστης του λειτουργικού συστήματος που τρέχει ο Jenkins controller να έχει δικαίωμα ανάγνωσης και εγγραφής σε αυτόν τον κατάλογο (π.χ. μια τιμή chmod 0700 ή χρησιμοποιώντας κατάλληλα file attributes). Το master key (που μερικές φορές αναφέρεται ως “key encryption key”) είναι αποθηκευμένο _μη κρυπτογραφημένο_ στο filesystem του Jenkins controller στο $JENKINS_HOME/secrets/master.key, που δεν προστατεύει από επιτιθέμενους με άμεση πρόσβαση σε αυτό το αρχείο. Οι περισσότεροι χρήστες και developers θα χρησιμοποιήσουν αυτά τα κλειδιά κρυπτογράφησης έμμεσα είτε μέσω του Secret API για κρυπτογράφηση γενικών μυστικών είτε μέσω του credentials API. Για τους κρυπτο-ενδιαφερόμενους, το Jenkins χρησιμοποιεί AES σε cipher block chaining (CBC) mode με PKCS#5 padding και τυχαία IVs για να κρυπτογραφήσει instances του CryptoConfidentialKey που αποθηκεύονται στο $JENKINS_HOME/secrets/ με όνομα αρχείου που αντιστοιχεί στο id του CryptoConfidentialKey. Κοινά ids κλειδιών περιλαμβάνουν:
hudson.util.Secret: χρησιμοποιείται για γενικά μυστικά;com.cloudbees.plugins.credentials.SecretBytes.KEY: χρησιμοποιείται για κάποιους τύπους credentials;jenkins.model.Jenkins.crumbSalt: χρησιμοποιείται από τον μηχανισμό CSRF protection; και
Credentials Access
Τα credentials μπορούν να οριστούν για global providers (/credentials/) που μπορούν να προσπελαστούν από οποιοδήποτε project είναι διαμορφωμένο, ή μπορούν να οριστούν για συγκεκριμένα projects (/job/<project-name>/configure) και επομένως να είναι προσβάσιμα μόνο από το συγκεκριμένο project.
Σύμφωνα με τα docs: Τα credentials που είναι εντός scope γίνονται διαθέσιμα στο pipeline χωρίς περιορισμό. Για να αποτραπεί η τυχαία αποκάλυψη στο build log, τα credentials κρύβονται (masked) από κανονική έξοδο, έτσι μια κλήση env (Linux) ή set (Windows), ή προγράμματα που εκτυπώνουν το περιβάλλον ή τις παραμέτρους τους δεν θα τα αποκαλύψουν στο build log σε χρήστες που διαφορετικά δεν θα είχαν πρόσβαση σε αυτά.
Γι’ αυτό, για να εξάγει ένας επιτιθέμενος τα credentials, χρειάζεται για παράδειγμα να τα μετατρέψει σε base64.
Secrets in plugin/job configs on disk
Μην υποθέτεις ότι τα μυστικά είναι μόνο σε credentials.xml. Πολλά plugins αποθηκεύουν μυστικά στο δικό τους global XML κάτω από $JENKINS_HOME/*.xml ή σε ανά-job $JENKINS_HOME/jobs/<JOB>/config.xml, μερικές φορές ακόμη και σε απλό κείμενο (η απόκρυψη στο UI δεν εγγυάται κρυπτογραφημένη αποθήκευση). Αν αποκτήσεις πρόσβαση ανάγνωσης στο filesystem, ανέγραψε αυτά τα XML και ψάξε για εμφανή tags με μυστικά.
# Global plugin configs
ls -l /var/lib/jenkins/*.xml
grep -R "password\\|token\\|SecretKey\\|credentialId" /var/lib/jenkins/*.xml
# Per-job configs
find /var/lib/jenkins/jobs -maxdepth 2 -name config.xml -print -exec grep -H "password\\|token\\|SecretKey" {} \\;
References
- https://www.jenkins.io/doc/book/security/managing-security/
- https://www.jenkins.io/doc/book/managing/nodes/
- https://www.jenkins.io/doc/developer/security/secrets/
- https://www.jenkins.io/blog/2019/02/21/credentials-masking/
- https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery
- https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials
- https://www.jenkins.io/doc/book/managing/nodes/
- https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

