Concourse Enumeration & Attacks
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Concourse kom met vyf rolle:
Concourse Admin: Hierdie rol word slegs gegee aan eienaars van die hoofspan (standaard aanvanklike concourse span). Admins kan ander spanne konfigureer (bv.: fly set-team
, fly destroy-team
...). Die toestemmings van hierdie rol kan nie deur RBAC beïnvloed word nie.
eienaar: Span eienaars kan alles binne die span wysig.
lid: Span lede kan lees en skryf binne die span se bates maar kan nie die spaninstellings wysig nie.
pipeline-operator: Pipeline operators kan pipeline operasies uitvoer soos om boue te aktiveer en hulpbronne vas te pen, maar hulle kan nie pipeline konfigurasies opdateer nie.
kyker: Span kykers het "lees-slegs" toegang tot 'n span en sy pipelines.
Boonop kan die toestemmings van die rolle eienaar, lid, pipeline-operator en kyker gewysig word deur RBAC te konfigureer (meer spesifiek, sy aksies). Lees meer daaroor in: https://concourse-ci.org/user-roles.html
Let daarop dat Concourse pipelines binne Spanne groepeer. Daarom sal gebruikers wat aan 'n Span behoort, in staat wees om daardie pipelines te bestuur en verskeie Spanne mag bestaan. 'n Gebruiker kan aan verskeie Spanne behoort en verskillende toestemmings binne elkeen hê.
In die YAML konfigurasies kan jy waardes konfigureer met die sintaksis ((_source-name_:_secret-path_._secret-field_))
.
Van die dokumentasie: Die source-name is opsioneel, en as dit weggelaat word, sal die cluster-wide credential manager gebruik word, of die waarde kan statisch verskaf word.
Die opsionele _secret-field_ spesifiseer 'n veld op die verkregen geheim om te lees. As dit weggelaat word, kan die credential manager kies om 'n 'standaard veld' van die verkregen credential te lees as die veld bestaan.
Boonop kan die secret-path en secret-field omring word deur dubbele aanhalings "..."
as hulle spesiale karakters soos .
en :
bevat. Byvoorbeeld, ((source:"my.secret"."field:1"))
sal die secret-path op my.secret
stel en die secret-field op field:1
.
Statische vars kan gespesifiseer word in take stappe:
Or gebruik die volgende fly
argumente:
-v
of --var
NAME=VALUE
stel die string VALUE
as die waarde vir die var NAME
.
-y
of --yaml-var
NAME=VALUE
ontleed VALUE
as YAML en stel dit as die waarde vir die var NAME
.
-i
of --instance-var
NAME=VALUE
ontleed VALUE
as YAML en stel dit as die waarde vir die instance var NAME
. Sien Grouping Pipelines om meer te leer oor instance vars.
-l
of --load-vars-from
FILE
laai FILE
, 'n YAML-dokument wat var name aan waardes koppel, en stel dit alles in.
Daar is verskillende maniere waarop 'n Kredensiaalbestuurder gespesifiseer kan word in 'n pyplyn, lees hoe in https://concourse-ci.org/creds.html. Boonop ondersteun Concourse verskillende kredensiaalbestuurders:
Let daarop dat as jy een of ander soort skrywe toegang tot Concourse het, jy werksgeleenthede kan skep om daardie geheime te exfiltreer aangesien Concourse toegang tot hulle moet hê.
Om 'n concourse omgewing te enumerate, moet jy eers geldige kredensiale versamel of 'n geverifieerde token vind waarskynlik in 'n .flyrc
konfigurasie lêer.
Om in te teken moet jy die eindpunt, die spannaam (standaard is main
) en 'n span waartoe die gebruiker behoort weet:
fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]
Kry geconfigureerde teikens:
fly targets
Kry of die geconfigureerde teikenverbinding steeds geldig is:
fly -t <target> status
Kry rol van die gebruiker teen die aangeduide teiken:
fly -t <target> userinfo
Let daarop dat die API-token gestoor word in $HOME/.flyrc
standaard, jy wat 'n masjien plunder, kan daar die kredensiale vind.
Kry 'n lys van die Spanne
fly -t <target> teams
Kry rolle binne die span
fly -t <target> get-team -n <team-name>
Kry 'n lys van gebruikers
fly -t <target> active-users
Lys pyplyne:
fly -t <target> pipelines -a
Kry pyplyn yaml (sensitiewe inligting mag in die definisie gevind word):
fly -t <target> get-pipeline -p <pipeline-name>
Kry al die pyplyn konfigurasie verklaarde vars
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
Kry al die pyplyne se geheime name wat gebruik word (as jy 'n werk kan skep/wysig of 'n houer kan oorneem, kan jy hulle exfiltreer):
Lys werkers:
fly -t <target> workers
Lys houers:
fly -t <target> containers
Lys bou (om te sien wat aan die gang is):
fly -t <target> builds
admin:admin
test:test
In die vorige afdeling het ons gesien hoe jy alle geheime name en vars wat deur die pyplyn gebruik word, kan kry. Die vars kan sensitiewe inligting bevat en die naam van die geheimenisse sal nuttig wees later om te probeer om hulle te steel.
As jy genoeg voorregte het (lid rol of meer) sal jy in staat wees om pyplyne en rolle te lys en net 'n sessie binne die <pipeline>/<job>
houer te kry met:
Met hierdie toestemmings mag jy in staat wees om:
Die geheime binne die houer te steel
Probeer om te ontsnap na die node
Cloud metadata eindpunt te enumerate/abuse (van die pod en van die node, indien moontlik)
As jy genoeg voorregte (lid rol of meer) het, sal jy in staat wees om nuwe pyplyne te skep/wysig. Kyk na hierdie voorbeeld:
With the modification/creation of a new pipeline you will be able to:
Steal the secrets (via echoing them out or getting inside the container and running env
)
Escape to the node (by giving you enough privileges - privileged: true
)
Enumerate/Abuse cloud metadata endpoint (from the pod and from the node)
Delete created pipeline
This is similar to the previous method but instead of modifying/creating a whole new pipeline you can just execute a custom task (which will probably be much more stealthier):
In die vorige afdelings het ons gesien hoe om 'n bevoorregte taak met concourse uit te voer. Dit sal nie die houer presies dieselfde toegang gee as die bevoorregte vlag in 'n docker-houer nie. Byvoorbeeld, jy sal nie die node lêerstelsel toestel in /dev sien nie, so die ontsnapping kan meer "kompleks" wees.
In die volgende PoC gaan ons die release_agent gebruik om te ontsnap met 'n paar klein wysigings:
Soos wat jy dalk opgemerk het, is dit net 'n regte release_agent ontsnapping wat die pad van die cmd in die node aanpas
'n Regte release_agent ontsnapping met 'n klein aanpassing is genoeg hiervoor:
Selfs al het die web-container 'n paar verdedigingstelsels gedeaktiveer, is dit nie as 'n algemene bevoorregte container aan die gang nie (byvoorbeeld, jy kan nie monteer nie en die vermoëns is baie beperk, so al die maklike maniere om uit die container te ontsnap is nutteloos).
Dit stoor egter lokale geloofsbriewe in duidelike teks:
Jy kan daardie geloofsbriewe gebruik om in te teken teen die webbediener en ‘n bevoorregte houer te skep en na die node te ontsnap.
In die omgewing kan jy ook inligting vind om toegang te verkry tot die postgresql instansie wat concourse gebruik (adres, gebruikersnaam, wagwoord en databasis onder andere inligting):
Dit is net 'n paar interessante notas oor die diens, maar omdat dit net op localhost luister, sal hierdie notas geen impak hê wat ons nog nie voorheen uitgebuit het nie.
Standaard sal elke concourse werker 'n Garden diens op poort 7777 uitvoer. Hierdie diens word deur die webmeester gebruik om die werker te dui wat hy moet uitvoer (aflaai van die beeld en elke taak uitvoer). Dit klink redelik goed vir 'n aanvaller, maar daar is 'n paar goeie beskermings:
Dit is net lokaal blootgestel (127..0.0.1) en ek dink wanneer die werker teen die web met die spesiale SSH-diens autentiseer, word 'n tonnel geskep sodat die webbediener kan praat met elke Garden diens binne elke werker.
Die webbediener monitor die lopende houers elke paar sekondes, en onverwagte houers word verwyder. So as jy 'n aangepaste houer wil uitvoer, moet jy inmeng met die kommunikasie tussen die webbediener en die garden diens.
Concourse werkers loop met hoë houerprivileges:
However, tegnieke soos mounting die /dev toestel van die node of release_agent sal nie werk nie (aangesien die werklike toestel met die lêerstelsel van die node nie toeganklik is nie, slegs 'n virtuele een). Ons kan nie prosesse van die node toegang nie, so om te ontsnap van die node sonder kernel exploits raak ingewikkeld.
In die vorige afdeling het ons gesien hoe om te ontsnap uit 'n bevoorregte houer, so as ons opdragte kan uitvoer in 'n bevoorregte houer geskep deur die huidige werker, kan ons ontsnap na die node.
Let daarop dat ek met concourse gespeel het en opgemerk het dat wanneer 'n nuwe houer geskep word om iets te loop, die houer prosesse toeganklik is vanaf die werker houer, so dit is soos 'n houer wat 'n nuwe houer binne-in hom skep.
Om binne 'n lopende bevoorregte houer te kom
Skep 'n nuwe bevoorregte houer
Jy kan baie maklik 'n nuwe houer skep (hardloop net 'n willekeurige UID) en iets daarop uitvoer:
However, die webbediener kontroleer elke paar sekondes die houers wat loop, en as 'n onverwagte een ontdek word, sal dit verwyder word. Aangesien die kommunikasie in HTTP plaasvind, kan jy die kommunikasie manipuleer om die verwydering van onverwagte houers te vermy:
https://concourse-ci.org/vars.html
Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)