Jenkins Security
Last updated
Last updated
Jenkins je alat koji nudi jednostavan način za uspostavljanje kontinualne integracije ili kontinualne isporuke (CI/CD) okruženja za gotovo bilo koju kombinaciju programskih jezika i repozitorijuma izvornog koda koristeći tokove. Osim toga, automatizuje različite rutinske razvojne zadatke. Iako Jenkins ne eliminiše potrebu za kreiranjem skripti za pojedinačne korake, pruža brži i pouzdaniji 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 tražili zanimljive Jenkins stranice bez autentifikacije poput (/people ili /asynchPeople, koje prikazuju trenutne korisnike) možete koristiti:
Proverite da li možete izvršiti komande bez potrebe za autentifikacijom:
Bez akreditacija 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 sa putanje /oops ili /error
U osnovnim informacijama možete proveriti sve načine za prijavu u Jenkins:
Basic Jenkins InformationMoći ćete da pronađete instance Jenkins-a koje omogućavaju kreiranje naloga i prijavu unutar njih. Tako jednostavno.
Takođe, ako su SSO funkcionalnosti/plugini prisutni, trebalo bi da pokušate da se prijavite na aplikaciju koristeći testni nalog (npr. testni Github/Bitbucket nalog). Trik sa ovde.
Jenkins nema polisu lozinke 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 sisteme za upravljanje izvornim kodom (SCM) poput GitHub-a ili GitLab-a sa internim, samohostovanim CI rešenjem poput Jenkins-a ili TeamCity-ja. Ova postavka omogućava CI sistemima da primate webhook događaje od SaaS provajdera za upravljanje izvornim kodom, uglavnom radi pokretanja pipeline poslova.
Da bi postigli ovo, organizacije daju dozvolu za IP opsege SCM platformi, omogućavajući im pristup internom CI sistemu putem webhook-ova. Međutim, važno je napomenuti da bilo ko može kreirati nalog na GitHub-u ili GitLab-u i konfigurisati ga da pokrene webhook, potencijalno šaljući zahteve internom CI sistemu.
U ovim scenarijima pretpostavljamo da imate validan nalog za pristup Jenkins-u.
Zavisno od konfigurisanog mehanizma Autorizacije u Jenkins-u i dozvola kompromitovanog korisnika, možda ćete moći ili nećete moći izvršiti sledeće napade.
Za više informacija pogledajte osnovne informacije:
Basic Jenkins InformationAko ste pristupili Jenkins-u, možete videti listu drugih registrovanih korisnika na http://127.0.0.1:8080/asynchPeople/
Koristite ovaj skript da biste dumpovali konzolne izlaze izgradnje i promenljive okruženja izgradnje kako biste eventualno pronašli tajne informacije u čistom tekstu.
Ako kompromitovani korisnik ima dovoljno privilegija da kreira/modifikuje novi Jenkins čvor i SSH akreditacije već su sačuvane za pristup drugim čvorovima, mogao bi ukrasti te akreditacije kreiranjem/modifikovanjem čvora i postavljanjem domaćina koji će zabeležiti akreditacije bez provere ključa domaćina:
Obično ćete pronaći Jenkins SSH akreditacije u globalnom provajderu (/credentials/
), pa ih možete i izlistati kao što biste izlistali bilo koju drugu tajnu. Više informacija u odeljku o izlistavanju tajni.
Dobijanje ljuske na Jenkins serveru daje napadaču mogućnost da otkrije sve tajne i env promenljive i da iskoristi druge mašine koje se nalaze u istoj mreži ili čak prikupi kredencijale za oblak.
Po podrazumevanim podešavanjima, Jenkins će raditi kao SISTEM. Dakle, kompromitovanje će dati napadaču SISTEM privilegije.
Kreiranje/Modifikovanje projekta je način da se dobije RCE na Jenkins serveru:
Jenkins RCE Creating/Modifying ProjectTakođe možete dobiti RCE izvršavanjem Groovy skripte, što može biti prikrivenije 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, i dalje morate imati pristup Jenkins-u.
Pipeline-ovi takođe mogu biti korišćeni kao mehanizam izgradnje u projektima, u tom slučaju može biti konfigurisan fajl unutar repozitorijuma koji će sadržati sintaksu pipeline-a. Podrazumevano se koristi /Jenkinsfile
:
Takođe je moguće čuvati fajlove konfiguracije pipeline-a na drugim mestima (u drugim repozitorijumima na primer) sa ciljem razdvajanja pristupa repozitorijumu i pristupa pipeline-u.
Ako napadač ima pristup za pisanje nad tim fajlom biće u mogućnosti da ga modifikuje i potencijalno pokrene pipeline čak i bez pristupa Jenkins-u. Moguće je da će napadač morati da zaobiđe neka ograničenja grane (zavisno od platforme i privilegija korisnika, moguće je da će biti zaobiđena ili ne).
Najčešći okidači za izvršavanje prilagođenog pipeline-a su:
Pull zahtev ka glavnoj grani (ili potencijalno ka drugim granama)
Pritisak na glavnu granu (ili potencijalno na druge grane)
Ažuriranje glavne grane i čekanje dok se na neki način izvrši
Ako ste spoljni korisnik ne biste trebali očekivati da kreirate PR ka glavnoj grani repozitorijuma drugog korisnika/organizacije i pokrenete pipeline... ali ako je loše konfigurisano možete potpuno kompromitovati kompanije samo eksploatišući ovo.
U prethodnom odeljku o RCE-u već je naznačena tehnika za dobijanje RCE-a modifikujući pipeline.
Moguće je deklarisati env promenljive u čistom tekstu za ceo pipeline ili za specifične faze. Ove env promenljive ne bi trebalo da sadrže 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 InformationPoverilačke informacije mogu biti ograničene na globalne provajdere (/credentials/
) ili na specifične projekte (/job/<project-name>/configure
). Stoga, kako biste izvukli sve od njih, morate kompromitovati barem sve projekte koji sadrže tajne i izvršiti prilagođene/zatrovane tokove rada.
Postoji još jedan problem, da biste dobili tajnu unutar env-a tokom rada, morate znati ime i tip tajne. Na primer, ako pokušate da učitate tajnu usernamePassword
kao string
tajnu, dobićete ovu grešku:
Evo kako da učitate neke uobičajene vrste tajni:
Na kraju ove stranice možete pronaći sve vrste akreditiva: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Najbolji način da izvučete sve tajne odjednom je kompromitovanje Jenkins mašine (pokretanje reverznog šella na ugrađenom čvoru na primer) i zatim procurenje master ključeva i šifrovanih tajni i dešifrovanje offline. Više o tome kako to uraditi možete pronaći u odeljku Čvorovi i agenti i u odeljku Post eksploatacija.
Iz dokumenata: Direktiva triggers
definiše automatizovane načine ponovnog pokretanja Pipeline-a. Za Pipeline-ove koji su integrisani sa izvorom poput GitHub-a ili BitBucket-a, triggers
možda nisu potrebni jer će već verovatno postojati integracija zasnovana na webhook-ovima. Trenutno dostupni okidači su cron
, pollSCM
i upstream
.
Primer koda za cron:
Proverite druge primere u dokumentaciji.
Jenkins instanca može imati različite agente koji se izvršavaju na različitim mašinama. Sa perspektive napadača, pristup različitim mašinama znači različite potencijalne cloud akreditive za krađu ili različit pristup mreži koji se može zloupotrebiti za eksploataciju drugih mašina.
Za više informacija pogledajte osnovne informacije:
Basic Jenkins InformationMožete nabrojati konfigurisane čvorove u /computer/
, obično ćete pronaći **Ugrađeni čvor
** (koji je čvor na kojem se izvršava Jenkins) i potencijalno više:
Posebno je interesantno kompromitovati Ugrađeni čvor jer sadrži osetljive informacije o Jenkins-u.
Da biste naznačili da želite pokrenuti pipelinu na ugrađenom Jenkins čvoru, možete specificirati sledeću konfiguraciju unutar pipeline-a:
Pipeline u određenom agentu, sa cron okidačem, sa promenljivama okruženja za ceo pipeline i fazu, učitavanje 2 promenljive u koraku i slanje reverznog šella:
Možete izlistati tajne pristupanjem /credentials/
ako imate dovoljno dozvola. Imajte na umu da će ovo samo izlistati tajne unutar datoteke credentials.xml
, ali datoteke konfiguracije izgradnje takođe mogu imati više tajni.
Ako možete videti konfiguraciju svakog projekta, možete takođe videti tamo imena tajni (tajni) koje se koriste za pristupanje repozitorijumu i druge tajne projekta.
Ove datoteke su potrebne za dekripciju Jenkins tajni:
secrets/master.key
secrets/hudson.util.Secret
Takve tajne obično se mogu pronaći u:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Evo regexa za njihovo pronalaženje:
Ako ste preuzeli potrebne lozinke za dekripciju tajnih informacija, koristite ovaj skript za dekripciju tih tajni.
Pristupite Jenkins config.xml fajlu 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 akreditive ovog puta. Idite na "Manage Jenkins" da ponovo postavite administrator šifru.
Ponovo omogućite bezbednost tako što ćete promeniti podešavanja u <useSecurity>true</useSecurity>
i ponovo restartujte Jenkins.