Concourse Enumeration & Attacks
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)
Concourse dolazi sa pet uloga:
Concourse Admin: Ova uloga se dodeljuje samo vlasnicima glavnog tima (podrazumevani inicijalni concourse tim). Admini mogu konfigurisati druge timove (npr.: fly set-team
, fly destroy-team
...). Dozvole ove uloge ne mogu biti pogođene RBAC-om.
owner: Vlasnici tima mogu modifikovati sve unutar tima.
member: Članovi tima mogu čitati i pisati unutar sredstava tima ali ne mogu modifikovati postavke tima.
pipeline-operator: Operatori pipeline-a mogu izvoditi operacije pipeline-a kao što su pokretanje gradnji i pinovanje resursa, međutim ne mogu ažurirati konfiguracije pipeline-a.
viewer: Gledaoci tima imaju "samo za čitanje" pristup timu i njegovim pipeline-ima.
Pored toga, dozvole uloga owner, member, pipeline-operator i viewer mogu biti modifikovane konfigurišući RBAC (konfigurišući preciznije njegove akcije). Pročitajte više o tome na: https://concourse-ci.org/user-roles.html
Napomena da Concourse grupiše pipeline-e unutar timova. Stoga, korisnici koji pripadaju timu će moći da upravljaju tim pipeline-ima i several Teams može postojati. Korisnik može pripadati više timova i imati različite dozvole unutar svakog od njih.
U YAML konfiguracijama možete konfigurisati vrednosti koristeći sintaksu ((_source-name_:_secret-path_._secret-field_))
.
Iz dokumenata: source-name je opcionalan, i ako se izostavi, koristiće se cluster-wide credential manager, ili se vrednost može pružiti statički.
Opcionalni _secret-field_ specificira polje na preuzetom tajnom podatku koje treba pročitati. Ako se izostavi, menadžer kredencijala može izabrati da pročita 'podrazumevano polje' iz preuzetog kredencijala ako polje postoji.
Pored toga, secret-path i secret-field mogu biti okruženi dvostrukim navodnicima "..."
ako sadrže specijalne karaktere kao što su .
i :
. Na primer, ((source:"my.secret"."field:1"))
će postaviti secret-path na my.secret
i secret-field na field:1
.
Statičke varijable mogu biti specificirane u koracima zadataka:
Or korišćenjem sledećih fly
argumenata:
-v
ili --var
NAME=VALUE
postavlja string VALUE
kao vrednost za var NAME
.
-y
ili --yaml-var
NAME=VALUE
parsira VALUE
kao YAML i postavlja ga kao vrednost za var NAME
.
-i
ili --instance-var
NAME=VALUE
parsira VALUE
kao YAML i postavlja ga kao vrednost za instancu var NAME
. Pogledajte Grouping Pipelines da biste saznali više o instancama var.
-l
ili --load-vars-from
FILE
učitava FILE
, YAML dokument koji sadrži mapiranje imena var na vrednosti, i postavlja ih sve.
Postoje različiti načini na koje se Upravljač akreditivima može specificirati u pipeline-u, pročitajte kako na https://concourse-ci.org/creds.html. Pored toga, Concourse podržava različite upravljače akreditivima:
Napomena da ako imate neku vrstu pristupa za pisanje Concourse-u možete kreirati poslove za ekstrakciju tih tajni jer Concourse mora imati mogućnost pristupa njima.
Da biste enumerisali Concourse okruženje, prvo morate prikupiti važeće akreditive ili pronaći autentifikovani token, verovatno u .flyrc
konfiguracionom fajlu.
Da biste se prijavili, morate znati endpoint, ime tima (podrazumevano je main
) i tim kojem korisnik pripada:
fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]
Dobijte konfigurirane ciljeve:
fly targets
Proverite da li je konfigurisana veza sa ciljem još uvek važeća:
fly -t <target> status
Dobijte ulogu korisnika u odnosu na navedeni cilj:
fly -t <target> userinfo
Napomena da je API token sačuvan u $HOME/.flyrc
podrazumevano, ako pretražujete mašine, mogli biste tamo pronaći akreditive.
Dobijte listu timova
fly -t <target> teams
Dobijte uloge unutar tima
fly -t <target> get-team -n <team-name>
Dobijte listu korisnika
fly -t <target> active-users
Lista pipelines:
fly -t <target> pipelines -a
Dobijte pipeline yaml (osetljive informacije mogu se naći u definiciji):
fly -t <target> get-pipeline -p <pipeline-name>
Dobijte sve konfiguracione varijable deklarisane u pipeline-u
for pipename in $(fly -t <target> pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t <target> get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done
Dobijte sve nazive tajni pipeline-a koje se koriste (ako možete kreirati/modifikovati posao ili preuzeti kontejner, mogli biste ih ekstraktovati):
Lista radnika:
fly -t <target> workers
Lista kontejnera:
fly -t <target> containers
Lista buildova (da vidite šta se izvršava):
fly -t <target> builds
admin:admin
test:test
U prethodnom odeljku smo videli kako možete dobiti sve nazive i varijable tajni koje koristi pipeline. Varijable mogu sadržati osetljive informacije i naziv tajni će biti koristan kasnije za pokušaj krađe.
Ako imate dovoljno privilegija (član ulogu ili više) moći ćete da listaš pipelines i uloge i jednostavno dobijete sesiju unutar <pipeline>/<job>
kontejnera koristeći:
Sa ovim dozvolama možda ćete moći da:
Uk盗ite tajne unutar kontejnera
Pokušate da pobegnete na čvor
Enumerišete/Iskoristite cloud metadata endpoint (iz poda i sa čvora, ako je moguće)
Ako imate dovoljno privilegija (član uloga ili više) moći ćete da kreirate/modifikujete nove pipeline-ove. Pogledajte ovaj primer:
Sa modifikacijom/kreiranjem novog pipeline-a moći ćete da:
Uk盗ite tajne (putem njihovog ispisivanja ili ulaskom u kontejner i pokretanjem env
)
Pobegnete na čvor (dajući vam dovoljno privilegija - privileged: true
)
Enumerišete/Iskoristite cloud metadata endpoint (iz poda i sa čvora)
Obrišete kreirani pipeline
Ovo je slično prethodnoj metodi, ali umesto modifikacije/kreiranja celog novog pipeline-a, možete samo izvršiti prilagođeni zadatak (što će verovatno biti mnogo diskretnije):
U prethodnim sekcijama smo videli kako da izvršimo privilegovanu zadatak sa concourse. Ovo neće dati kontejneru potpuno isti pristup kao privilegovana oznaka u docker kontejneru. Na primer, nećete videti uređaj datoteke čvora u /dev, tako da bi bekstvo moglo biti "kompleksnije".
U sledećem PoC-u ćemo koristiti release_agent da pobegnemo sa nekim malim izmenama:
Kao što ste možda primetili, ovo je samo redovna release_agent eskapada samo modifikovanjem putanje cmd-a u čvoru
Redovna release_agent eskapada sa manjom modifikacijom je dovoljna za ovo:
Čak i ako web kontejner ima neke odbrane onemogućene, ne radi kao uobičajen privilegovan kontejner (na primer, ne možete montirati i kapaciteti su veoma ograničeni, tako da su svi laki načini za bekstvo iz kontejnera beskorisni).
Međutim, čuva lokalne akreditive u čistom tekstu:
Možete koristiti te akreditive da se prijavite na veb server i napravite privilegovanu kontejner i pobegnete na čvor.
U okruženju takođe možete pronaći informacije za pristup postgresql instanci koju koristi concourse (adresa, korisničko ime, lozinka i baza podataka među ostalim informacijama):
Ovo su samo neke zanimljive beleške o servisu, ali pošto sluša samo na localhost-u, ove beleške neće imati nikakav uticaj koji već nismo iskoristili ranije.
Podrazumevano, svaki concourse radnik će pokretati Garden servis na portu 7777. Ovaj servis koristi Web master da označi radniku šta treba da izvrši (preuzmi sliku i pokreni svaku zadatak). Ovo zvuči prilično dobro za napadača, ali postoje neka dobra zaštita:
On je samo izložen lokalno (127..0.0.1) i mislim da kada se radnik autentifikuje prema Web-u sa posebnim SSH servisom, stvara se tunel tako da web server može da komunicira sa svakim Garden servisom unutar svakog radnika.
Web server prati pokretne kontejnere svake nekoliko sekundi, i neočekivani kontejneri se brišu. Dakle, ako želite da pokrenete prilagođeni kontejner, morate da manipulišete sa komunikacijom između web servera i garden servisa.
Concourse radnici rade sa visokim privilegijama kontejnera:
Međutim, tehnike poput montiranja /dev uređaja čvora ili release_agent neće raditi (jer pravi uređaj sa datotečnim sistemom čvora nije dostupan, samo virtuelni). Ne možemo pristupiti procesima čvora, pa je bekstvo iz čvora bez kernel exploit-a komplikovano.
U prethodnom odeljku smo videli kako da pobegnemo iz privilegovanog kontejnera, tako da ako možemo izvršiti komande u privilegovanom kontejneru koji je kreirao trenutni radnik, mogli bismo pobegnuti na čvor.
Napomena: igrajući se sa concourse-om primetio sam da kada se novi kontejner pokrene da bi nešto izvršio, procesi kontejnera su dostupni iz radnog kontejnera, tako da je to kao kontejner koji stvara novi kontejner unutar sebe.
Ulazak u pokrenuti privilegovani kontejner
Kreiranje novog privilegovanog kontejnera
Možete vrlo lako kreirati novi kontejner (samo pokrenite nasumični UID) i izvršiti nešto na njemu:
Međutim, veb server proverava svake nekoliko sekundi kontejnere koji se izvršavaju, i ako se otkrije neočekivani, biće obrisan. Pošto se komunikacija odvija u HTTP-u, mogli biste da manipulišete komunikacijom kako biste izbegli brisanje neočekivanih kontejnera:
https://concourse-ci.org/vars.html
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)