Concourse Enumeration & Attacks
Concourse Enumeration & Attacks
User Roles & Permissions
Concourse ina majukumu matano:
Concourse Admin: Jukumu hili linapewa tu wamiliki wa main team (timu ya awali ya concourse). Mamlaka yanaweza kusimamia timu zingine (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: Wanachama wa timu wanaweza kusoma na kuandika ndani ya mali za timu lakini hawawezi kubadilisha mipangilio ya timu.
pipeline-operator: Waendeshaji wa pipeline wanaweza kufanya shughuli za pipeline kama kuchochea ujenzi na kuweka rasilimali, lakini hawawezi kusasisha mipangilio ya pipeline.
viewer: Watazamaji wa timu wana ruhusa ya kusoma tu kwa timu na pipelines zake.
Zaidi ya hayo, ruhusa za majukumu ya owner, member, pipeline-operator na viewer zinaweza kubadilishwa kwa kusanidi RBAC (kusimamia zaidi vitendo vyake). Soma zaidi kuhusu hili: https://concourse-ci.org/user-roles.html
Kumbuka kwamba Concourse inaweka pipelines ndani ya Timu. Kwa hivyo watumiaji wanaohusishwa na Timu wataweza kusimamia hizo pipelines na Timu kadhaa zinaweza kuwepo. Mtumiaji anaweza kuwa sehemu ya Timu kadhaa na kuwa na ruhusa tofauti ndani ya kila moja.
Vars & Credential Manager
Katika configs za YAML unaweza kusanidi thamani kwa kutumia sintaksia ((_source-name_:_secret-path_._secret-field_))
.
Kutoka kwenye nyaraka: source-name ni hiari, na ikiwa imeachwa, msimamizi wa cluster-wide credential atatumika, au thamani inaweza kutolewa statiki.
secret-field ya hiari inabainisha uwanja kwenye siri iliyopatikana kusoma. Ikiwa imeachwa, msimamizi wa credentials anaweza kuchagua kusoma 'uwanja wa default' kutoka kwenye credentials iliyopatikana ikiwa uwanja upo.
Zaidi ya hayo, secret-path na secret-field zinaweza kuzungukwa na alama za nukuu mbili "..."
ikiwa zina herufi maalum kama .
na :
. Kwa mfano, ((source:"my.secret"."field:1"))
itaweka secret-path kuwa my.secret
na secret-field kuwa field:1
.
Static Vars
Vars za statiki zinaweza kubainishwa katika hatua za kazi:
Au kutumia fly
arguments zifuatazo:
-v
au--var
NAME=VALUE
inaweka stringVALUE
kama thamani ya varNAME
.-y
au--yaml-var
NAME=VALUE
inachambuaVALUE
kama YAML na kuiweka kama thamani ya varNAME
.-i
au--instance-var
NAME=VALUE
inachambuaVALUE
kama YAML na kuiweka kama thamani ya instance varNAME
. Tazama Grouping Pipelines kujifunza zaidi kuhusu instance vars.-l
au--load-vars-from
FILE
inasomaFILE
, hati ya YAML inayojumuisha majina ya var na thamani zake, na kuziset zote.
Usimamizi wa Nenosiri
Kuna njia tofauti ambazo Credential Manager inaweza kutajwa katika pipeline, soma jinsi katika https://concourse-ci.org/creds.html. Zaidi ya hayo, Concourse inasaidia wasimamizi wa nenosiri tofauti:
Kumbuka kwamba kama una aina fulani ya write access to Concourse unaweza kuunda kazi za exfiltrate those secrets kwa sababu Concourse inahitaji kuweza kuzifikia.
Concourse Enumeration
Ili kuorodhesha mazingira ya concourse unahitaji kwanza kukusanya nywila halali au kupata token iliyothibitishwa labda katika faili ya .flyrc
.
Login na Current User enum
Ili kuingia unahitaji kujua endpoint, team name (default ni
main
) na team 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 targets zilizosanidiwa:
fly targets
Pata kama target connection iliyosanidiwa bado ni halali:
fly -t <target> status
Pata role ya mtumiaji dhidi ya target iliyoonyeshwa:
fly -t <target> userinfo
Kumbuka kwamba API token ina hifadhiwa katika $HOME/.flyrc
kwa default, ukiwa unachunguza mashine unaweza kupata nywila huko.
Teams & Users
Pata orodha ya Teams
fly -t <target> teams
Pata roles ndani ya team
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 pipeline yaml (taarifa nyeti zinaweza kupatikana katika ufafanuzi):
fly -t <target> get-pipeline -p <pipeline-name>
Pata vars zote za config zilizotangazwa za pipeline
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 pipelines secret yaliyotumika (kama unaweza kuunda/kubadilisha kazi au kuingilia container unaweza kuyatoa):
Containers & Workers
Orodhesha workers:
fly -t <target> workers
Orodhesha containers:
fly -t <target> containers
Orodhesha builds (kuona kinachoendelea):
fly -t <target> builds
Concourse Attacks
Credentials Brute-Force
admin:admin
test:test
Secrets and params enumeration
Katika sehemu iliyopita tuliona jinsi unavyoweza kupata majina yote ya secrets na vars zinazotumiwa na pipeline. Vars zinaweza kuwa na taarifa nyeti na majina ya secrets yatakuwa muhimu baadaye kujaribu kuiba.
Session ndani ya container inayoendesha au iliyokamilika hivi karibuni
Kama una ruhusa za kutosha (member role au zaidi) utaweza kuorodhesha pipelines na roles na kupata tu session ndani ya <pipeline>/<job>
container kwa kutumia:
Kwa ruhusa hizi unaweza kuwa na uwezo wa:
Kuiba siri ndani ya container
Jaribu kutoroka hadi kwenye node
Tambua/Tumia vibaya cloud metadata endpoint (kutoka kwenye pod na kutoka kwenye node, ikiwezekana)
Uundaji/Marekebisho ya Pipeline
Kama una ruhusa za kutosha (mwanachama au zaidi) utaweza kuunda/kubadilisha pipelines mpya. Angalia mfano huu:
Kwa kubadilisha/kuunda bomba jipya utaweza:
Kuiba siri (kupitia kuzitoa au kuingia ndani ya kontena na kuendesha
env
)Kutoroka hadi node (kwa kukupa ruhusa za kutosha -
privileged: true
)Kuweka orodha/Matumizi mabaya ya cloud metadata endpoint (kutoka kwenye pod na kutoka kwenye node)
Kufuta bomba lililoundwa
Tekeleza Kazi Maalum
Hii ni sawa na njia ya awali lakini badala ya kubadilisha/kuunda bomba jipya unaweza tu kutekeleza kazi maalum (ambayo itakuwa ya siri zaidi):
Kutoroka kwenye node kutoka kwenye kazi yenye ruhusa
Katika sehemu zilizopita tuliona jinsi ya kutekeleza kazi yenye ruhusa na concourse. Hii haitoi kontena ufikiaji sawa kabisa na bendera ya ruhusa katika kontena la docker. Kwa mfano, hutaona kifaa cha mfumo wa faili wa node katika /dev, hivyo kutoroka kunaweza kuwa "ngumu" zaidi.
Katika PoC ifuatayo tutatumia release_agent kutoroka na marekebisho madogo:
Kama ulivyogundua hii ni release_agent escape ya kawaida ikibadilisha tu njia ya cmd kwenye node
Kutoroka kwenda kwenye node kutoka kwenye kontena la Worker
Release_agent escape ya kawaida yenye mabadiliko madogo inatosha kwa hili:
Kutoroka kwenye node kutoka kwenye kontena la Web
Hata kama kontena la web lina baadhi ya ulinzi uliowezeshwa, haliendeshi kama kontena lenye ruhusa za kawaida (kwa mfano, huwezi kuunganisha na uwezo ni mdogo sana, hivyo njia rahisi za kutoroka kutoka kwenye kontena hazifanyi kazi).
Hata hivyo, linaweka nenosiri za ndani kwa maandishi wazi:
Unaweza kutumia hizo hati za kiingilio kuingia kwenye seva ya wavuti na kuunda kontena lenye ruhusa na kutoroka hadi kwenye nodi.
Katika mazingira unaweza pia kupata taarifa za kupata postgresql mfano ambao concourse hutumia (anwani, jina la mtumiaji, nenosiri na hifadhidata miongoni mwa taarifa nyingine):
Kudanganya Huduma ya Garden - Sio Shambulio Halisi
Hizi ni baadhi ya noti za kuvutia kuhusu huduma hii, lakini kwa sababu inasikiliza tu kwenye localhost, noti hizi hazitakuwa na athari yoyote ambayo hatujatumia tayari
Kwa chaguo-msingi kila mfanyakazi wa concourse atakuwa akiendesha huduma ya Garden katika bandari 7777. Huduma hii inatumiwa na Web master kuonyesha mfanyakazi anachohitaji kutekeleza (kupakua picha na kuendesha kila kazi). Hii inasikika vizuri kwa mshambulizi, lakini kuna ulinzi mzuri:
Inafichuliwa tu kwa ndani (127..0.0.1) na nadhani wakati mfanyakazi anapothibitisha dhidi ya Web kwa huduma maalum ya SSH, handaki linaundwa ili seva ya wavuti iweze kuongea na kila huduma ya Garden ndani ya kila mfanyakazi.
Seva ya wavuti inafuatilia kontena zinazoendesha kila sekunde chache, na kontena zisizotarajiwa zinafutwa. Kwa hivyo ikiwa unataka kuendesha kontena maalum unahitaji kuharibu mawasiliano kati ya seva ya wavuti na huduma ya garden.
Wafanyakazi wa Concourse wanaendesha kwa ruhusa za juu za kontena:
Hata hivyo, mbinu kama mounting kifaa cha /dev cha node au release_agent hazitafanya kazi (kwa kuwa kifaa halisi chenye filesystem ya node hakipatikani, ni virtual tu). Hatuwezi kufikia michakato ya node, hivyo kutoroka kutoka kwa node bila kernel exploits inakuwa ngumu.
Katika sehemu iliyopita tuliona jinsi ya kutoroka kutoka kwa kontena lenye ruhusa, hivyo kama tunaweza kutekeleza amri katika kontena lenye ruhusa lililoundwa na mfanyakazi wa sasa, tunaweza kutoroka hadi kwenye node.
Kumbuka kwamba nikicheza na concourse niliona kwamba kontena mpya inapozalishwa kuendesha kitu, michakato ya kontena inapatikana kutoka kwenye kontena la mfanyakazi, hivyo ni kama kontena linaunda kontena mpya ndani yake.
Kuingia ndani ya kontena lenye ruhusa linaloendelea
Kuunda kontena mpya yenye ruhusa za juu
Unaweza kuunda kontena mpya kwa urahisi (endesha tu UID ya kubahatisha) na kutekeleza kitu ndani yake:
Hata hivyo, seva ya wavuti inakagua kila sekunde chache kontena zinazotumika, na ikiwa kontena isiyotarajiwa itagunduliwa, itafutwa. Kwa kuwa mawasiliano yanatokea katika HTTP, unaweza kuharibu mawasiliano ili kuepuka kufutwa kwa kontena zisizotarajiwa:
Marejeo
https://concourse-ci.org/vars.html
Last updated