Concourse Enumeration & Attacks
Concourse Opsomming & Aanvalle
Gebruiker Rolle & Toestemmings
Concourse kom met vyf rolle:
Concourse Admin: Hierdie rol word slegs aan eienaars van die hoofspan (verstek aanvanklike concourse-span) gegee. Admins kan ander spanne instel (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: Spanlede kan binne die span se bates lees en skryf, maar kan nie die spaninstellings wysig nie.
pipeline-operateur: Pyplyn-operateurs kan pyplynhandelinge uitvoer soos boue aanroep en bronne vaspen, maar hulle kan nie pyplynkonfigurasies opdateer nie.
kyker: Spankykers het "alleen-lesende" toegang tot 'n span en sy pyplyne.
Verder kan die toestemmings van die rolle eienaar, lid, pipeline-operateur en kyker gewysig word deur RBAC te konfigureer (deur meer spesifiek sy aksies te konfigureer). Lees meer hieroor by: https://concourse-ci.org/user-roles.html
Let daarop dat Concourse pyplyne binne Spanne groepeer. Daarom sal gebruikers wat aan 'n Span behoort, in staat wees om daardie pyplyne te bestuur en verskeie Spanne kan bestaan. 'n Gebruiker kan aan verskeie Spanne behoort en verskillende toestemmings binne elkeen van hulle hê.
Vars & Geldeenhede-bestuurder
In die YAML-konfigurasies kan jy waardes konfigureer met die sintaksis ((_bron-naam_:_geheim-pad_._geheim-veld_))
.
Van die dokumente af: Die bron-naam is opsioneel, en indien weggelaat, sal die klusterwye geldeenhede-bestuurder gebruik word, of die waarde kan staties voorsien word statisch.
Die opsionele _geheim-veld_ spesifiseer 'n veld op die opgehaalde geheim om te lees. Indien weggelaat, kan die geldeenhede-bestuurder kies om 'n 'verstekveld' van die opgehaalde geldeenheid te lees as die veld bestaan.
Verder kan die geheim-pad en geheim-veld omring word deur dubbele aanhalingstekens "..."
as hulle spesiale karakters soos .
en :
bevat. Byvoorbeeld, ((bron:"my.secret"."veld:1"))
sal die geheim-pad instel op my.secret
en die geheim-veld op veld:1
.
Statische Vars
Statische vars kan gespesifiseer word in taakstappe:
Gebruik die volgende fly
argumente:
fly
argumente:-v
of--var
NAAM=Waarde
stel die stringWaarde
in as die waarde vir die varNAAM
.-y
of--yaml-var
NAAM=Waarde
ontlederWaarde
as YAML en stel dit in as die waarde vir die varNAAM
.-i
of--instance-var
NAAM=Waarde
ontlederWaarde
as YAML en stel dit in as die waarde vir die instansie varNAAM
. Sien Groepering Pyplyne om meer te leer oor instansie vars.-l
of--load-vars-from
LEËR
laaiLEËR
, 'n YAML-dokument wat kartering var-naam na waardes bevat, en stel hulle almal in.
Kredensiebestuur
Daar is verskillende maniere waarop 'n Kredensiebestuurder in 'n pyplyn gespesifiseer kan word, lees hoe in https://concourse-ci.org/creds.html. Verder ondersteun Concourse verskillende kredensiebestuurders:
Let daarop dat as jy 'n soort skryftoegang tot Concourse het, kan jy take skep om daardie geheime te uit te sluip aangesien Concourse moet in staat wees om hulle te kan bereik.
Concourse Enumerasie
Om 'n Concourse-omgewing te enumereer, moet jy eers geldige geloofsbriewe versamel of 'n geautentiseerde token vind waarskynlik in 'n .flyrc
-konfigurasie-lêer.
Aanteken en Huidige Gebruiker enum
Om aan te teken moet jy die eindpunt, die spannaam (standaard is
main
) en 'n span waar die gebruiker aan behoort weet:fly --target voorbeeld aanmeld --span-naam my-span --concourse-url https://ci.voorbeeld.com [--onveilig] [--kliënt-sert=./pad --kliënt-sleutel=./pad]
Kry gekonfigureerde teikens:
fly teikens
Kry of die gekonfigureerde teikenverbinding nog steeds geldig is:
fly -t <teiken> status
Kry die rol van die gebruiker teenoor die aangeduide teiken:
fly -t <teiken> gebruikerinligting
Let daarop dat die API-token standaard in $HOME/.flyrc
gestoor word, as jy 'n masjien plunder, kan jy dalk daar die geloofsbriewe vind.
Spanne & Gebruikers
Kry 'n lys van die Spanne
fly -t <teiken> spanne
Kry rolle binne span
fly -t <teiken> kry-span -n <span-naam>
Kry 'n lys van gebruikers
fly -t <teiken> aktiewe-gebruikers
Pyplyne
Lys pyplyne:
fly -t <teiken> pyplyne -a
Kry pyplyn yaml (sensitiewe inligting mag in die definisie gevind word):
fly -t <teiken> kry-pyplyn -p <pyplyn-naam>
Kry al die pyplyn gekonfigureerde vars
vir pyplynnaam in $(fly -t <teiken> pyplyne | grep -Ev "^id" | awk '{druk $2}'); doen echo $pyplynnaam; fly -t <teiken> kry-pyplyn -p $pyplynnaam -j | grep -Eo '"vars":[^}]+'; gedoen
Kry al die pyplyngeheimname wat gebruik word (as jy 'n taak kan skep/wysig of 'n houer kan kap, kan jy hulle uitsluip):
Houers & Werkers
Lys werkers:
fly -t <teiken> werkers
Lys houers:
fly -t <teiken> houers
Lys bouwerk (om te sien wat hardloop):
fly -t <teiken> bouwerk
Concourse Aanvalle
Gelgeld Brute-Force
admin:admin
test:test
Geheime en parameters opskrif
In die vorige afdeling het ons gesien hoe jy alle geheime name en vars wat deur die pyplyn gebruik word, kan kry. Die vars mag sensitiewe inligting bevat en die naam van die geheime sal later nuttig wees om te probeer om hulle te steel.
Sessie binne hardloop of onlangs hardloop houer
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 <pyplyn>/<taak>
houer te kry deur:
Met hierdie regte kan jy dalk die volgende doen:
Steel die geheime binne die houer
Probeer om te ontsnap na die node
Enumerate/Misbruik wolk metadata eindpunt (vanaf die peul en vanaf die node, indien moontlik)
Aanmaak/Wysiging van Pyplyne
As jy genoeg regte het (lidrol of meer) sal jy in staat wees om nuwe pyplyne te skep/wysig. Kyk na hierdie voorbeeld:
Met die modifikasie/skepping van 'n nuwe pyplyn sal jy in staat wees om:
Steel die geheime (deur hulle uit te skryf of binne die houer te kom en
env
uit te voer)Ontsnap na die node (deur jou genoeg voorregte te gee -
privileged: true
)Enumerate/Misbruik wolk metadata eindpunt (vanaf die peul en vanaf die node)
Verwyder die geskepte pyplyn
Voer Aangepaste Taak Uit
Dit is soortgelyk aan die vorige metode, maar in plaas daarvan om 'n hele nuwe pyplyn te wysig/skep, kan jy net 'n aangepaste taak uitvoer (wat waarskynlik baie meer stealthier sal wees):
Ontsnapping na die node vanaf 'n bevoorregte taak
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êerstelseltoestel in /dev sien nie, sodat die ontsnapping meer "kompleks" kan wees.
In die volgende PoC gaan ons die release_agent gebruik om te ontsnap met 'n paar klein aanpassings:
Soos jy dalk opgemerk het, is hierdie net 'n gewone release_agent ontsnapping deur net die pad van die cmd in die node te wysig
Ontsnapping na die node vanaf 'n Werker-container
'n Gewone release_agent-ontsnapping met 'n klein aanpassing is genoeg hiervoor:
Ontsnapping na die node vanaf die Web-houer
Selfs al het die web-houer sekere verdedigings uitgeskakel, hardloop dit nie as 'n gewone bevoorregte houer (byvoorbeeld, jy kan nie koppel nie en die vermoëns is baie beperk, dus is al die maklike maniere om uit die houer te ontsnap nutteloos).
Dit stoor egter plaaslike geloofsbriewe in die teks:
Jy kan daardie geloofsbriewe gebruik om teen die webbediener in te teken en 'n bevoorregte houer te skep en na die node te ontsnap.
In die omgewing kan jy ook inligting vind om die postgresql instansie te benader wat concourse gebruik (adres, gebruikersnaam, wagwoord en databasis onder andere inligting):
Misbruik van Garden-diens - Nie 'n werklike Aanval nie
Hierdie is net interessante notas oor die diens, maar omdat dit slegs op die plaaslike masjien luister, sal hierdie notas geen impak hê wat ons nie reeds voorheen benut het nie.
Standaard sal elke Concourse-werker 'n Garden diens hardloop op poort 7777. Hierdie diens word deur die webmeester gebruik om die werker te wys wat hy moet uitvoer (die beeld aflaai en elke taak hardloop). Dit klink redelik goed vir 'n aanvaller, maar daar is 'n paar goeie beskermingsmaatreëls:
Dit is net plaaslik blootgestel (127.0.0.1) en ek dink wanneer die werker weer by die webwerf aanmeld met die spesiale SSH-diens, word 'n tonnel geskep sodat die webdiens met elke Garden-diens binne elke werker kan praat.
Die webdiens monitor die lopende houers elke paar sekondes, en onverwagte houers word verwyder. Dus, as jy 'n aangepaste houer wil hardloop, moet jy sukkel met die kommunikasie tussen die webdiens en die garden-diens.
Concourse-werkers hardloop met hoë houerbevoegdhede:
Egter, tegnieke soos mounting van die /dev-toestel van die node of release_agent sal nie werk (aangesien die werklike toestel met die lêersisteem van die node nie toeganklik is nie, slegs 'n virtuele een). Ons kan nie by die prosesse van die node kom nie, dus ontsnap van die node sonder kernel-uitbuitings raak ingewikkeld.
In die vorige afdeling het ons gesien hoe om te ontsnap uit 'n bevoorregte houer, so as ons bevele kan uitvoer in 'n bevoorregte houer geskep deur die huidige werker, kon 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 uit te voer, die houerprosesse toeganklik is vanuit die werkerhouer, so dit is soos 'n houer wat 'n nuwe houer binne hom skep.
Binne 'n lopende bevoorregte houer kom
Skep 'n nuwe bevoorregte houer
Jy kan baie maklik 'n nuwe houer skep (hardloop net 'n willekeurige UID) en iets daarop uitvoer:
Nochtans, 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 voorkom:
Verwysings
https://concourse-ci.org/vars.html
Last updated