Jenkins Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jenkins 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 repozitorija 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.
Basic Jenkins InformationDa biste pretraživali zanimljive Jenkins stranice bez autentifikacije kao što su (/people ili /asynchPeople, ovo prikazuje trenutne korisnike) možete koristiti:
Proverite da li možete izvršavati komande bez potrebe za autentifikacijom:
Bez kredencijala možete pogledati unutar /asynchPeople/ putanje ili /securityRealm/user/admin/search/index?q= za korisnička imena.
Možda ćete moći da dobijete verziju Jenkins-a iz putanje /oops ili /error
U osnovnim informacijama možete proveriti sve načine za prijavu unutar Jenkins-a:
Basic Jenkins InformationMoći ćete da pronađete Jenkins instance koje omogućavaju da kreirate nalog i prijavite se u njega. Tako jednostavno.
Takođe, ako su SSO funkcionalnosti/pluginovi prisutni, trebali biste pokušati da se prijavite u aplikaciju koristeći test nalog (npr., test Github/Bitbucket nalog). Trik iz ovde.
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.
Koristite ovaj python skript ili ovaj powershell skript.
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 dobavljača kontrole verzija, prvenstveno za pokretanje pipeline poslova.
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.
U ovim scenarijima pretpostavljamo da imate važeći nalog za pristup Jenkins-u.
U zavisnosti od Authorization mehanizma konfiguranog u Jenkins-u i dozvola kompromitovanog korisnika možda ćete moći ili ne moći da izvršite sledeće napade.
Za više informacija proverite osnovne informacije:
Basic Jenkins InformationAko ste pristupili Jenkins-u, možete da navedete druge registrovane korisnike na http://127.0.0.1:8080/asynchPeople/
Koristite ovaj skript da izbacite izlaze konzole gradnje i varijable okruženja gradnje kako biste se nadali da ćete pronaći tajne u čistom tekstu.
Ako kompromitovani korisnik ima dovoljno privilegija da kreira/modifikuje novi Jenkins čvor i SSH kredencijali su već sačuvani za pristup drugim čvorovima, on bi mogao ukrasti te kredencijale kreiranjem/modifikovanjem čvora i postavljanjem hosta koji će snimati kredencijale bez verifikacije host ključa:
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.
Dobijanje shell-a na Jenkins serveru daje napadaču priliku da ukrade sve tajne i env varijable i da iskoristi druge mašine locirane u istoj mreži ili čak prikupi cloud kredencijale.
Podrazumevano, Jenkins će raditi kao SYSTEM. Tako da, kompromitovanje njega će napadaču dati SYSTEM privilegije.
Kreiranje/Modifikovanje projekta je način da se dobije RCE nad Jenkins serverom:
Jenkins RCE Creating/Modifying ProjectTakođe možete dobiti RCE izvršavanjem Groovy skripte, koja može biti manje uočljiva od kreiranja novog projekta:
Jenkins RCE with Groovy ScriptTakođe možete dobiti RCE kreiranjem/modifikovanjem pipeline-a:
Jenkins RCE Creating/Modifying PipelineDa biste eksploatisali pipeline-ove, još uvek morate imati pristup Jenkins-u.
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
:
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.
Ako napadač ima pravo pisanja nad tim fajlom, moći će da modifikuje i potencijalno pokrene pipeline bez čak i da ima pristup 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).
Najčešći okidači za izvršavanje prilagođenog 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 izvrši na neki način
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 eksploatacijom ovoga.
U prethodnom RCE odeljku već je naznačena tehnika za dobijanje RCE modifikovanjem pipeline-a.
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-ova:
Za informacije o tome kako se tajne obično tretiraju u Jenkinsu, pogledajte osnovne informacije:
Basic Jenkins InformationAkreditivi 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.
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:
Evo kako da učitate neke uobičajene tipove tajni:
Na kraju ove stranice možete pronaći sve tipove kredencijala: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Najbolji način da izvučete sve tajne odjednom je da kompromitujete Jenkins mašinu (na primer, pokretanjem obrnute ljuske u ugrađenom čvoru) i zatim procurite master ključeve i šifrovane tajne i dešifrujete ih offline. Više o tome kako to uraditi u odeljku Čvorovi i Agenti i u odeljku Post Eksploatacija.
Iz dokumentacije: 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
.
Primer crona:
Check other examples in the docs.
A Jenkins instance might have different agents running in different machines. From an attacker perspective, access to different machines means different potential cloud credentials to steal or different network access that could be abuse to exploit other machines.
For more information check the basic information:
Basic Jenkins InformationMož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:
Posebno je zanimljivo kompromitovati Built-In čvor jer sadrži osetljive Jenkins informacije.
Da biste naznačili da želite da pokrenete pipeline u ugrađenom Jenkins čvoru, možete navesti sledeću konfiguraciju unutar pipeline-a:
Pipeline u specifičnom agentu, sa cron okidačem, sa pipeline i stage env varijablama, učitavajući 2 varijable u koraku i šaljući reverznu ljusku:
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.
Ako možete videti konfiguraciju svakog projekta, takođe možete videti u njoj imena kredencijala (tajni) koji se koriste za pristup repozitorijumu i druge kredencijale projekta.
Ove datoteke su potrebne za dešifrovanje Jenkins tajni:
secrets/master.key
secrets/hudson.util.Secret
Takve tajne se obično mogu naći u:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Evo regex-a da ih pronađete:
Ako ste izvadili potrebne lozinke za dešifrovanje tajni, koristite ovaj skript da dešifrujete te tajne.
Pristupite Jenkins config.xml datoteci u /var/lib/jenkins/config.xml
ili C:\Program Files (x86)\Jenkins\
Potražite reč <useSecurity>true</useSecurity>
i promenite reč true
u false
.
sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Restartujte Jenkins server: service jenkins restart
Sada ponovo idite na Jenkins portal i Jenkins neće tražiti nikakve kredencijale ovaj put. Navigirajte do "Manage Jenkins" da ponovo postavite administrator lozinku.
Ponovo omogućite bezbednost promenom podešavanja na <useSecurity>true</useSecurity>
i ponovo restartujte Jenkins.
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)