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 inakuja na majukumu matano:
Concourse Admin: Jukumu hili linatolewa tu kwa wamiliki wa timu kuu (timu ya mwanzo ya concourse). Wasimamizi wanaweza kuunda timu nyingine (mfano: fly set-team
, fly destroy-team
...). Ruhusa za jukumu hili haziwezi kuathiriwa na RBAC.
owner: Wamiliki wa timu wanaweza kubadilisha kila kitu ndani ya timu.
member: Wajumbe wa timu wanaweza kusoma na kuandika ndani ya rasilimali za timu lakini hawawezi kubadilisha mipangilio ya timu.
pipeline-operator: Wafanya kazi wa pipeline wanaweza kufanya operesheni za pipeline kama vile kuanzisha ujenzi na kuweka rasilimali, hata hivyo hawawezi kubadilisha mipangilio ya pipeline.
viewer: Waangalizi wa timu wana "ufikiaji wa kusoma tu" kwa timu na mipangilio yake.
Zaidi ya hayo, ruhusa za majukumu owner, member, pipeline-operator na viewer zinaweza kubadilishwa kwa kuunda RBAC (kuunda kwa usahihi vitendo vyake). Soma zaidi kuhusu hilo katika: https://concourse-ci.org/user-roles.html
Kumbuka kwamba Concourse inaunganisha mipangilio ndani ya Timu. Hivyo basi watumiaji wanaotokana na Timu wataweza kusimamia mipangilio hiyo na Tim nyingi zinaweza kuwepo. Mtumiaji anaweza kuwa sehemu ya Tim nyingi na kuwa na ruhusa tofauti ndani ya kila moja yao.
Katika mipangilio ya YAML unaweza kuunda thamani ukitumia sintaksia ((_source-name_:_secret-path_._secret-field_))
.
Toka kwenye docs: source-name ni hiari, na ikiwa imeachwa, meneja wa akiba wa kiwango cha klasta atatumika, au thamani inaweza kutolewa kwa statiki.
secret-field ya hiari inabainisha uwanja kwenye akiba iliyopatikana kusoma. Ikiwa imeachwa, meneja wa akiba anaweza kuchagua kusoma 'uwanja wa kawaida' kutoka kwa akiba iliyopatikana ikiwa uwanja huo upo.
Zaidi ya hayo, secret-path na secret-field zinaweza kuzungukwa na nukuu mbili "..."
ikiwa zina micharacter maalum kama .
na :
. Kwa mfano, ((source:"my.secret"."field:1"))
itaweka secret-path kuwa my.secret
na secret-field kuwa field:1
.
Static vars zinaweza kubainishwa katika hatua za kazi:
Or using the following fly
arguments:
-v
or --var
NAME=VALUE
sets the string VALUE
as the value for the var NAME
.
-y
or --yaml-var
NAME=VALUE
parses VALUE
as YAML and sets it as the value for the var NAME
.
-i
or --instance-var
NAME=VALUE
parses VALUE
as YAML and sets it as the value for the instance var NAME
. See Grouping Pipelines to learn more about instance vars.
-l
or --load-vars-from
FILE
loads FILE
, a YAML document containing mapping var names to values, and sets them all.
Kuna njia tofauti ambazo Msimamizi wa Akida unaweza kufafanuliwa katika pipeline, soma jinsi katika https://concourse-ci.org/creds.html. Zaidi ya hayo, Concourse inasaidia wasimamizi wa akida tofauti:
Kumbuka kwamba ikiwa una aina fulani ya ufikiaji wa kuandika kwa Concourse unaweza kuunda kazi za kuondoa siri hizo kwani Concourse inahitaji kuwa na uwezo wa kuzifikia.
Ili kuainisha mazingira ya concourse unahitaji kwanza kusanya akida halali au kupata token iliyothibitishwa labda katika faili ya usanidi .flyrc
.
Ili kuingia unahitaji kujua kiungo, jina la timu (kawaida ni main
) na timu ambayo mtumiaji anahusishwa nayo:
fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]
Pata malengo yaliyowekwa:
fly targets
Pata ikiwa kiungo kilichowekwa bado ni halali:
fly -t <target> status
Pata jukumu la mtumiaji dhidi ya kiungo kilichotajwa:
fly -t <target> userinfo
Kumbuka kwamba token ya API inahifadhiwa katika $HOME/.flyrc
kwa kawaida, unapoiba mashine unaweza kupata huko akida.
Pata orodha ya Timu
fly -t <target> teams
Pata majukumu ndani ya timu
fly -t <target> get-team -n <team-name>
Pata orodha ya watumiaji
fly -t <target> active-users
Orodha ya pipelines:
fly -t <target> pipelines -a
Pata yaml ya pipeline (taarifa nyeti zinaweza kupatikana katika ufafanuzi):
fly -t <target> get-pipeline -p <pipeline-name>
Pata mipangilio yote ya pipeline iliyotangazwa
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
Pata majina yote ya siri za pipelines zilizotumika (ikiwa unaweza kuunda/kubadilisha kazi au kuiba kontena unaweza kuondoa hizo):
Orodha workers:
fly -t <target> workers
Orodha containers:
fly -t <target> containers
Orodha builds (kuona kinachoendelea):
fly -t <target> builds
admin:admin
test:test
Katika sehemu iliyopita tuliona jinsi unavyoweza kupata majina yote ya siri na vars zinazotumiwa na pipeline. Vars zinaweza kuwa na taarifa nyeti na jina la siri litakuwa muhimu baadaye kujaribu kuiba hizo.
Ikiwa una ruhusa za kutosha (mwanachama au zaidi) utaweza kuorodhesha pipelines na roles na tu kupata kikao ndani ya <pipeline>/<job>
container kwa kutumia:
Kwa ruhusa hizi unaweza kuwa na uwezo wa:
Kuharibu siri ndani ya konteina
Jaribu kutoroka hadi kwenye node
Kuorodhesha/Kutumia vibaya cloud metadata endpoint (kutoka kwenye pod na kutoka kwenye node, ikiwa inawezekana)
Ikiwa una haki za kutosha (mwanachama au zaidi) utaweza kuunda/kubadilisha pipelines mpya. Angalia mfano huu:
Kwa mabadiliko/kuunda pipeline mpya utaweza:
Kuhujumu siri (kupitia kuzionyesha au kuingia ndani ya kontena na kuendesha env
)
Kutoroka hadi node (kwa kukupa ruhusa za kutosha - privileged: true
)
Kuorodhesha/Kutumia vibaya cloud metadata endpoint (kutoka kwenye pod na kutoka kwenye node)
Futa pipeline iliyoundwa
Hii ni sawa na njia ya awali lakini badala ya kubadilisha/kuunda pipeline mpya kabisa unaweza tu kutekeleza kazi maalum (ambayo labda itakuwa siri zaidi):
Katika sehemu zilizopita tuliona jinsi ya kutekeleza kazi yenye mamlaka na concourse. Hii haitatoa ufikiaji sawa kabisa na bendera yenye mamlaka katika kontena la docker. Kwa mfano, huwezi kuona kifaa cha mfumo wa faili cha node katika /dev, hivyo kutoroka kunaweza kuwa "ngumu" zaidi.
Katika PoC ifuatayo tutatumia release_agent kutoroka na mabadiliko madogo:
Kama unavyojua hii ni kawaida release_agent escape tu kubadilisha njia ya cmd katika node
Kutoroka kwa kawaida release_agent na mabadiliko madogo yanatosha kwa hili:
Hata kama web container ina baadhi ya ulinzi zilizozuiliwa, haiendeshi kama container yenye mamlaka ya kawaida (kwa mfano, huwezi kuunganisha na uwezo ni mdogo sana, hivyo njia zote rahisi za kutoroka kutoka kwenye container hazifai).
Hata hivyo, inahifadhi akidi za ndani kwa maandiko wazi:
Unaweza kutumia akreditivu hizo ku ingia kwenye seva ya wavuti na kuunda kontena yenye mamlaka na kutoroka hadi kwenye node.
Katika mazingira unaweza pia kupata taarifa za kufikia postgresql ambayo concourse inatumia (anwani, jina la mtumiaji, nenosiri na hifadhidata miongoni mwa taarifa nyingine):
Hizi ni baadhi ya maelezo ya kuvutia kuhusu huduma, lakini kwa sababu inasikiliza tu kwenye localhost, maelezo haya hayataleta athari ambazo hatujatumia tayari
Kwa default, kila mfanyakazi wa concourse atakuwa akifanya kazi na huduma ya Garden kwenye bandari 7777. Huduma hii inatumika na Mkurugenzi wa Mtandao kuonyesha mfanyakazi kile anahitaji kutekeleza (kupakua picha na kuendesha kila kazi). Hii inasikika vizuri kwa mshambuliaji, lakini kuna ulinzi mzuri:
Inapatikana tu kwa ndani (127..0.0.1) na nadhani wakati mfanyakazi anajiandikisha dhidi ya Mtandao na huduma maalum ya SSH, tunnel inaundwa ili seva ya wavuti iweze kuzungumza na kila huduma ya Garden ndani ya kila mfanyakazi.
Seva ya wavuti inasimamia kontena zinazoendesha kila sekunde chache, na kontena zisizotarajiwa zinatolewa. Hivyo ikiwa unataka kuendesha kontena maalum unahitaji kuingilia kati ya mawasiliano kati ya seva ya wavuti na huduma ya garden.
Wafanyakazi wa concourse wanaendesha kwa ruhusa za juu za kontena:
Hata hivyo, mbinu kama kuunganisha kifaa cha /dev cha node au release_agent hazitafanya kazi (kwa sababu kifaa halisi chenye mfumo wa faili wa node hakiwezi kupatikana, ni kifaa cha virtual tu). Hatuwezi kufikia michakato ya node, hivyo kutoroka kutoka kwa node bila exploits za kernel kunakuwa ngumu.
Katika sehemu iliyopita tuliona jinsi ya kutoroka kutoka kwa kontena lenye mamlaka, hivyo ikiwa tunaweza kutekeleza amri katika kontena lenye mamlaka lililoundwa na mfanyakazi wa sasa, tunaweza kutoroka hadi node.
Kumbuka kwamba nilipokuwa nikicheza na concourse niliona kwamba wakati kontena jipya linazalishwa ili kuendesha kitu, michakato ya kontena inapatikana kutoka kwa kontena la mfanyakazi, hivyo ni kama kontena kuunda kontena jipya ndani yake.
Kuingia ndani ya kontena lenye mamlaka linaloendesha
Kuunda kontena mpya yenye mamlaka
Unaweza kwa urahisi kuunda kontena mpya (kimbia tu UID isiyo na mpangilio) na kutekeleza kitu ndani yake:
Hata hivyo, seva ya wavuti inakagua kila sekunde chache kontena zinazotembea, na ikiwa kontena isiyotarajiwa itagundulika, itafutwa. Kadri mawasiliano yanavyofanyika katika HTTP, unaweza kuingilia mawasiliano ili kuepuka kufutwa kwa kontena zisizotarajiwa:
https://concourse-ci.org/vars.html
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)