Concourse Enumeration & Attacks
Concourse Enumeration & Attacks
User Roles & Permissions
Concourse inakuja na majukumu matano:
Concourse Admin: Hiki ni jukumu ambalo 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.
Vars & Credential Manager
Katika mipangilio ya YAML unaweza kuunda thamani ukitumia sintaksia ((_source-name_:_secret-path_._secret-field_))
.
Kutoka kwenye nyaraka: 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
Static vars zinaweza kubainishwa katika hatua za kazi:
Or using the following fly
arguments:
-v
or--var
NAME=VALUE
sets the stringVALUE
as the value for the varNAME
.-y
or--yaml-var
NAME=VALUE
parsesVALUE
as YAML and sets it as the value for the varNAME
.-i
or--instance-var
NAME=VALUE
parsesVALUE
as YAML and sets it as the value for the instance varNAME
. See Grouping Pipelines to learn more about instance vars.-l
or--load-vars-from
FILE
loadsFILE
, a YAML document containing mapping var names to values, and sets them all.
Usimamizi wa Akida
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.
Uainishaji wa Concourse
Ili kuainisha mazingira ya concourse unahitaji kwanza kusanya akida halali au kupata token iliyothibitishwa labda katika faili ya usanidi .flyrc
.
Ingia na Ujumbe wa Sasa
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 lengo lililoonyeshwa:
fly -t <target> userinfo
Kumbuka kwamba token ya API inahifadhiwa katika $HOME/.flyrc
kwa kawaida, unapoiba mashine unaweza kuipata huko akida.
Timu & Watumiaji
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
Pipelines
Orodhesha 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 iliyoelezwa:
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):
Containers & Workers
Orodha workers:
fly -t <target> workers
Orodha containers:
fly -t <target> containers
Orodha builds (kuona kinachoendelea):
fly -t <target> builds
Concourse Attacks
Credentials Brute-Force
admin:admin
test:test
Usanidi wa siri na params
Katika sehemu iliyopita tuliona jinsi unavyoweza kupata majina yote ya siri na vars zinazotumika na pipeline. Vars zinaweza kuwa na taarifa nyeti na jina la siri litakuwa muhimu baadaye kujaribu kuiba hizo.
Kikao ndani ya container inayokimbia au iliyokimbia hivi karibuni
Ikiwa una ruhusa za kutosha (mwanachama au zaidi) utaweza kuorodhesha pipelines na roles na kupata tu kikao ndani ya <pipeline>/<job>
container kwa kutumia:
Kwa ruhusa hizi unaweza kuwa na uwezo wa:
Kuchukua siri ndani ya konteina
Jaribu kutoroka hadi kwenye node
Kuorodhesha/Kutumia vibaya cloud metadata endpoint (kutoka kwenye pod na kutoka kwenye node, ikiwa inawezekana)
Uundaji/Modification wa Pipeline
Ikiwa una ruhusa za kutosha (mwanachama au zaidi) utaweza kuunda/kubadilisha pipelines mpya. Angalia mfano huu:
With the modification/creation of a new pipeline you will be able to:
Kuharibu the siri (via echoing them out or getting inside the container and running
env
)Kutoroka to the node (by giving you enough privileges -
privileged: true
)Enumerate/Abuse cloud metadata endpoint (from the pod and from the node)
Futa created pipeline
Execute Custom Task
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):
Kutoroka kwenye node kutoka kwa kazi yenye mamlaka
Katika sehemu zilizopita tuliona jinsi ya kutekeleza kazi yenye mamlaka na concourse. Hii haitatoa ufikiaji sawa 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 marekebisho madogo:
Kama unavyojua hii ni kawaida release_agent escape tu kubadilisha njia ya cmd katika node
Kutoroka hadi node kutoka kwa kontena la Worker
Kutoroka kwa kawaida release_agent na mabadiliko madogo yanatosha kwa hili:
Kutoroka hadi kwenye node kutoka kwenye Web container
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 akili za ndani kwa maandiko wazi:
Unaweza kutumia akreditivu hizo ku ingia kwenye seva ya wavuti na kuunda kontena lenye 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):
Kutumia Huduma ya Garden - Si Shambulio Halisi
Hizi ni baadhi ya maelezo ya kuvutia kuhusu huduma, lakini kwa sababu inasikiliza tu kwenye localhost, maelezo haya hayataleta athari ambazo hatujashughulikia 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 nodi au release_agent hazitafanya kazi (kwa sababu kifaa halisi chenye mfumo wa faili wa nodi hakiwezi kufikiwa, ni kifaa cha virtual tu). Hatuwezi kufikia michakato ya nodi, hivyo kutoroka kutoka nodi bila exploits za kernel kunakuwa ngumu.
Katika sehemu iliyopita tuliona jinsi ya kutoroka kutoka kwenye kontena lenye mamlaka, hivyo ikiwa tunaweza kutekeleza amri katika kontena lenye mamlaka lililoundwa na mfanyakazi wa sasa, tunaweza kutoroka hadi nodi.
Kumbuka kwamba nilipokuwa nikicheza na concourse niliona kwamba wakati kontena jipya linazaliwa ili kuendesha kitu, michakato ya kontena inapatikana kutoka kwenye 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:
References
https://concourse-ci.org/vars.html
Last updated