Concourse Enumeration & Attacks
Concourse Enumeracija & Napadi
Korisničke Uloge & Dozvole
Concourse dolazi sa pet uloga:
Concourse Admin: Ova uloga se dodeljuje samo vlasnicima glavnog tima (podrazumevani početni concourse tim). Admini mogu konfigurisati druge timove (npr.:
fly set-team
,fly destroy-team
...). Dozvole ove uloge ne mogu biti promenjene pomoću RBAC-a.vlasnik: Vlasnici timova mogu modifikovati sve unutar tima.
član: Članovi tima mogu čitati i pisati unutar resursa tima ali ne mogu modifikovati podešavanja tima.
operator-pipeline-a: Operatori pipeline-a mogu izvršavati operacije nad pipeline-om kao što su pokretanje izgradnji i fiksiranje resursa, međutim ne mogu ažurirati konfiguracije pipeline-a.
gledalac: Gledaoci tima imaju "samo za čitanje" pristup timu i njegovim pipeline-ima.
Osim toga, dozvole uloga vlasnik, član, operator-pipeline-a i gledalac mogu biti modifikovane konfigurisanjem RBAC-a (konfigurisanjem više specifičnih akcija). Pročitajte više o tome na: https://concourse-ci.org/user-roles.html
Imajte na umu da Concourse grupiše pipeline-ove unutar Timova. Stoga korisnici koji pripadaju Timu će moći da upravljaju tim pipeline-ovima i može postojati nekoliko Timova. Korisnik može pripadati nekoliko Timova i imati različite dozvole unutar svakog od njih.
Promenljive & Menadžer Kredencijala
U YAML konfiguracijama možete konfigurisati vrednosti koristeći sintaksu ((_source-name_:_secret-path_._secret-field_))
.
Od dokumenata: source-name je opcionalno, i ako se izostavi, biće korišćen menadžer kredencijala na nivou klastera, ili vrednost može biti obezbeđena statički.
Opciono _secret-field_ specificira polje na dohvaćenoj tajnoj vrednosti za čitanje. Ako se izostavi, menadžer kredencijala može odabrati da pročita 'podrazumevano polje' iz dohvaćene kredencijale ako polje postoji.
Osim toga, secret-path i secret-field mogu biti okruženi dvostrukim navodnicima "..."
ako sadrže posebne karaktere poput .
i :
. Na primer, ((source:"my.secret"."field:1"))
će postaviti secret-path na my.secret
i secret-field na field:1
.
Statičke Promenljive
Statičke promenljive mogu biti navedene u koracima zadatka:
Argumenti
Ili koristeći sledeće fly
argumente:
-v
ili--var
IME=VREDNOST
postavlja stringVREDNOST
kao vrednost za varijabluIME
.-y
ili--yaml-var
IME=VREDNOST
parsiraVREDNOST
kao YAML i postavlja je kao vrednost za varijabluIME
.-i
ili--instance-var
IME=VREDNOST
parsiraVREDNOST
kao YAML i postavlja je kao vrednost za instancu varijableIME
. Pogledajte Grupisanje Pipelina da biste saznali više o instanci varijabli.-l
ili--load-vars-from
FAJL
učitavaFAJL
, YAML dokument koji sadrži mapiranje imena varijabli na vrednosti, i postavlja ih sve.
Upravljanje Kredencijalima
Postoje različiti načini na koje se Menadžer kredencijala može specificirati u pipelini, pročitajte kako na https://concourse-ci.org/creds.html. Osim toga, Concourse podržava različite menadžere kredencijala:
Imajte na umu da ako imate neku vrstu pristupa za pisanje u Concourse možete kreirati poslove da izfiltrirate te tajne informacije jer Concourse mora da ima pristup njima.
Enumeracija Concourse-a
Da biste enumerisali Concourse okruženje, prvo morate prikupiti validne kredencijale ili pronaći autentifikacioni token verovatno u konfiguracionom fajlu .flyrc
.
Prijavljivanje i Enumeracija trenutnog korisnika
Da biste se prijavili, potrebno je znati krajnju tačku, ime tima (podrazumevano je
main
) i tim kojem korisnik pripada:fly --target primer prijava --ime-tima moj-tim --concourse-url https://ci.primer.com [--insecure] [--client-cert=./putanja --client-key=./putanja]
Dobijanje konfigurisanih ciljeva:
fly ciljevi
Provera da li je konfigurisana veza sa ciljem još uvek validna:
fly -t <cilj> status
Dobijanje uloge korisnika u određenom cilju:
fly -t <cilj> userinfo
Imajte na umu da je API token sačuvan u $HOME/.flyrc
po podrazumevanim postavkama, ako pljačkate mašine, tamo možete pronaći kredencijale.
Timovi & Korisnici
Dobijanje liste Timova
fly -t <cilj> timovi
Dobijanje uloga unutar tima
fly -t <cilj> get-team -n <ime-tima>
Dobijanje liste korisnika
fly -t <cilj> aktivni-korisnici
Pipelines
Izlistavanje pipelina:
fly -t <cilj> pipelini -a
Dobijanje yaml fajla pipelina (osetljive informacije mogu se naći u definiciji):
fly -t <cilj> get-pipeline -p <ime-pipelina>
Dobijanje svih deklarisanih varijabli konfiguracije pipelina
for imepipelina in $(fly -t <cilj> pipelini | grep -Ev "^id" | awk '{print $2}'); do echo $imepipelina; fly -t <cilj> get-pipeline -p $imepipelina -j | grep -Eo '"vars":[^}]+'; done
Dobijanje svih imenâ tajnih informacija pipelina koje se koriste (ako možete kreirati/izmeniti posao ili preuzeti kontrolu nad kontejnerom, možete ih izfiltrirati):
Kontejneri i radnici
Lista radnika:
fly -t <cilj> workers
Lista kontejnera:
fly -t <cilj> containers
Lista izgradnji (da vidite šta se izvršava):
fly -t <cilj> builds
Napadi na Concourse
Brute-Force za pristupne podatke
admin:admin
test:test
Enumeracija tajni i parametara
U prethodnom odeljku videli smo kako možete dobiti sve nazive tajni i varijabli koje koristi cev. Varijable mogu sadržati osetljive informacije i naziv tajni će biti koristan kasnije za pokušaj krađe.
Sesija unutar pokrenutog ili nedavno pokrenutog kontejnera
Ako imate dovoljno privilegija (uloga člana ili više), moći ćete da nabrojite cevi i uloge i jednostavno dobiti sesiju unutar <cev>/<posao>
kontejnera korišćenjem:
Sa ovim dozvolama možete:
Ukrasti tajne unutar kontejnera
Pokušati da pobegnete do noda
Nabrojati/Zloupotrebiti krajnju tačku metapodataka u oblaku (iz poda i sa noda, ako je moguće)
Kreiranje/Izmena Pipelina
Ako imate dovoljno privilegija (član uloga ili više) moći ćete kreirati/izmeniti nove pipeline-ove. Proverite ovaj primer:
Sa modifikacijom/kreiranjem nove cevi moći ćete da:
Ukradete tajne (putem njihovog ispisivanja ili ulaska u kontejner i pokretanja
env
)Pobegnete na čvor (dajući vam dovoljno privilegija -
privileged: true
)Nabrojite/Zloupotrebite krajnju tačku metapodataka u oblaku (iz poda i sa čvora)
Obrišete kreiranu cev
Izvršite prilagođeni zadatak
Ovo je slično prethodnoj metodi, ali umesto modifikovanja/kreiranja potpuno nove cevi, možete samo izvršiti prilagođeni zadatak (što će verovatno biti mnogo skrivenije):
Bekstvo na čvor iz privilegovanog zadatka
U prethodnim sekcijama videli smo kako izvršiti privilegovan zadatak sa concourse. Ovo neće dati kontejneru potpuni pristup kao privilegovana oznaka u docker kontejneru. Na primer, nećete videti uređaj fajl sistema čvora u /dev, tako da bekstvo može biti "kompleksnije".
U sledećem PoC-u koristićemo release_agent za bekstvo sa nekim malim modifikacijama:
Kao što ste možda primetili, ovo je samo običan beg release_agenta samo modifikujući putanju komande na čvoru
Bekstvo na čvor iz radničkog kontejnera
Dovoljna je obična modifikacija bega release_agenta za ovo:
Bekstvo na čvor iz Web kontejnera
Čak i ako web kontejner ima neke odbrane onemogućene, ne radi kao običan privilegovani kontejner (na primer, ne možete montirati i mogućnosti su veoma ograničene, tako da su svi jednostavni načini bekstva iz kontejnera beskorisni).
Međutim, čuva lokalne akreditive u čistom tekstu:
Možete koristiti te podatke za prijavu na veb server i kreiranje privilegovanog kontejnera i bekstvo na čvor.
U okruženju takođe možete pronaći informacije za pristup postgresql instanci koju koristi concourse (adresa, korisničko ime, šifra i baza podataka među ostalim informacijama):
Zloupotreba Garden servisa - Nije pravi napad
Ovo su samo neke zanimljive beleške o servisu, ali pošto sluša samo na lokalnom računaru, ove beleške neće imati nikakav uticaj koji već nismo iskoristili ranije.
Podrazumevano, svaki radnik u Concourse-u će pokretati Garden servis na portu 7777. Ovaj servis se koristi od strane Web mastera da bi pokazao radniku šta treba da izvrši (preuzimanje slike i pokretanje svakog zadatka). Ovo zvuči prilično dobro za napadača, ali postoje neke dobre zaštite:
Samo je izložen lokalno (127..0.0.1) i mislim da kada se radnik autentifikuje ponovo na Web sa specijalnim SSH servisom, pravi se tunel tako da web server može komunicirati sa svakim Garden servisom unutar svakog radnika.
Web server prati pokrenute kontejnere svakih nekoliko sekundi, i neočekivani kontejneri se brišu. Dakle, ako želite da pokrenete prilagođeni kontejner morate manipulisati sa komunikacijom između web servera i garden servisa.
Concourse radnici se izvršavaju sa visokim privilegijama kontejnera:
Međutim, tehnike poput montiranja /dev uređaja čvora ili release_agent neće raditi (jer stvarni uređaj sa fajl sistemom čvora nije dostupan, već samo virtuelni). Ne možemo pristupiti procesima čvora, pa je izlazak iz čvora bez eksploatacije kernela komplikovan.
U prethodnom odeljku videli smo kako izaći iz privilegovanog kontejnera, pa ako možemo izvršiti komande u privilegovanom kontejneru kreiranom od trenutnog radnika, mogli bismo pobegnuti na čvor.
Imajte na umu da sam igrajući se sa Concourse-om primetio da kada se novi kontejner pokrene da nešto izvrši, procesi kontejnera su dostupni iz radničkog kontejnera, pa je to kao da kontejner kreira novi kontejner unutar sebe.
Ulazak u pokrenuti privilegovani kontejner
Kreiranje novog privilegovanog kontejnera
Veoma lako možete kreirati novi kontejner (samo pokrenite nasumični UID) i izvršiti nešto na njemu:
Međutim, veb server proverava svakih nekoliko sekundi kontejnere koji se izvršavaju, i ako se otkrije neočekivan, biće obrisan. Pošto se komunikacija odvija putem HTTP-a, možete manipulisati komunikacijom kako biste izbegli brisanje neočekivanih kontejnera:
Reference
https://concourse-ci.org/vars.html
Last updated