Docker Breakout / Privilege Escalation
Tumia Trickest kujenga na kutumia mifumo ya kazi kwa urahisi ikiwa na zana za jamii za juu zaidi ulimwenguni. Pata Ufikiaji Leo:
Uchunguzi na Kutoroka Kiotomatiki
linpeas: Inaweza pia kuchunguza kontena
CDK: Zana hii ni muhimu sana kuchunguza kontena uliomo hata jaribu kutoroka kiotomatiki
amicontained: Zana muhimu kupata mamlaka ambazo kontena ina ili kupata njia za kutoroka kutoka kwake
deepce: Zana ya kuchunguza na kutoroka kutoka kwa kontena
grype: Pata CVE zilizomo kwenye programu iliyosanikishwa kwenye picha
Kutoroka kwa Socket ya Docker Iliyosanikishwa
Ikiwa kwa njia fulani unagundua kuwa socket ya docker imesanikishwa ndani ya kontena ya docker, utaweza kutoroka kutoka kwake. Hii kawaida hutokea kwenye kontena za docker ambazo kwa sababu fulani zinahitaji kuunganisha kwenye daemini ya docker kutekeleza vitendo.
Katika kesi hii unaweza kutumia amri za kawaida za docker kuwasiliana na docker daemon:
Ikiwa socket ya docker iko mahali usiotarajiwa bado unaweza kuwasiliana nayo kutumia amri ya docker
na parameter -H unix:///path/to/docker.sock
Daemon ya Docker inaweza pia kusikiliza kwenye bandari (kwa chaguo-msingi 2375, 2376) au kwenye mifumo inayotegemea Systemd, mawasiliano na Daemon ya Docker inaweza kutokea kupitia soketi ya Systemd fd://
.
Kwa kuongezea, weka tahadhari kwa soketi za uendeshaji wa kiwango cha juu za uendeshaji zifuatazo:
dockershim:
unix:///var/run/dockershim.sock
containerd:
unix:///run/containerd/containerd.sock
cri-o:
unix:///var/run/crio/crio.sock
frakti:
unix:///var/run/frakti.sock
rktlet:
unix:///var/run/rktlet.sock
...
Kutoruhusu Uwezo wa Kutoroka
Unapaswa kuangalia uwezo wa kontena, ikiwa ina mojawapo ya yafuatayo, unaweza kutoroka kutoka kwake: CAP_SYS_ADMIN
, CAP_SYS_PTRACE
, CAP_SYS_MODULE
, DAC_READ_SEARCH
, DAC_OVERRIDE, CAP_SYS_RAWIO
, CAP_SYSLOG
, CAP_NET_RAW
, CAP_NET_ADMIN
Unaweza kuangalia uwezo wa sasa wa kontena kwa kutumia zana za moja kwa moja zilizotajwa hapo awali au:
Katika ukurasa ufuatao unaweza kujifunza zaidi kuhusu uwezo wa linux na jinsi ya kuvunja matumizi yao kutoroka/kupandisha vyeo:
pageLinux CapabilitiesKutoroka kutoka kwenye Kontena yenye Mamlaka
Kontena yenye mamlaka inaweza kuundwa kwa bendera --privileged
au kwa kulegeza ulinzi maalum:
--cap-add=ALL
--security-opt apparmor=unconfined
--security-opt seccomp=unconfined
--security-opt label:disable
--pid=host
--userns=host
--uts=host
--cgroupns=host
Mount /dev
Bendera ya --privileged
inapunguza sana usalama wa kontena, ikitoa upatikanaji usiozuiliwa wa kifaa na kukiuka ulinzi kadhaa. Kwa maelezo zaidi, tazama nyaraka kuhusu athari kamili za --privileged
.
Privileged + hostPID
Kwa ruhusa hizi unaweza tu kwenda kwenye angahewa ya mchakato unaoendesha kwenye mwenyeji kama root kama init (pid:1) kwa kutekeleza: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
Jaribu katika kontena kwa kutekeleza:
Wenye Haki
Kwa bendera ya wenye haki unaweza kujaribu kupata diski ya mwenyeji au kujaribu kutoroka kwa kutumia release_agent au njia nyingine za kutoroka.
Jaribu kufanya upitishaji wa kisasa katika chombo kinachotekelezwa:
Kufunga Diski - Poc1
Vyombo vya docker vilivyo configure vizuri havitaruhusu amri kama fdisk -l. Hata hivyo, kwenye amri ya docker iliyopangwa vibaya ambapo bendera --privileged
au --device=/dev/sda1
na herufi kubwa imetajwa, ni rahisi kupata mamlaka ya kuona diski ya mwenyeji.
Kwa hivyo, kuchukua udhibiti wa mashine ya mwenyeji ni rahisi:
Na voilà! Sasa unaweza kupata ufikiaji wa mfumo wa faili wa mwenyeji kwa sababu umefungwa kwenye folda ya /mnt/hola
.
Kufunga Diski - Poc2
Ndani ya kontena, mshambuliaji anaweza kujaribu kupata ufikiaji zaidi kwa mfumo wa OS wa mwenyeji kupitia kiasi cha mwenyeji kinachoweza kuandikwa kilichoundwa na kikundi. Hapa chini kuna vitu vya kawaida unavyoweza kuchunguza ndani ya kontena ili uone ikiwa unaweza kutumia vector huu wa mshambuliaji:
Kutoroka kwa Haki kwa Kutumia release_agent iliyopo (cve-2022-0492) - PoC1
Kutoroka kwa haki kwa kutumia release_agent iliyoundwa (cve-2022-0492) - PoC2
Pata maelezo ya mbinu katika:
pageDocker release_agent cgroups escapeKutoroka kwa Haki Kwa Kutumia release_agent bila kujua njia ya kihusishi - PoC3
Katika mbinu za awali njia kamili ya kontena ndani ya mfumo wa mwenyeji inafichuliwa. Walakini, hii sio kila wakati hali. Katika hali ambapo haujui njia kamili ya kontena ndani ya mwenyeji unaweza kutumia mbinu hii:
pagerelease_agent exploit - Relative Paths to PIDsKutekeleza PoC ndani ya chombo kilichopewa mamlaka kunapaswa kutoa matokeo kama:
Kutoroka kwa Kibali Kwa Kutumia Vipimo Vyenye Hisia
Kuna faili kadhaa ambazo zinaweza kufungwa ambazo hutoa taarifa kuhusu mwenyeji wa chini. Baadhi yao hata yanaweza kuashiria kitu cha kutekelezwa na mwenyeji wakati kitu kinatokea (ambacho kitamruhusu mshambuliaji kutoroka kutoka kwa chombo). Matumizi mabaya ya faili hizi yanaweza kuruhusu:
release_agent (tayari imefunuliwa hapo awali)
Hata hivyo, unaweza kupata faili nyingine nyeti za kuangalia kwenye ukurasa huu:
pageSensitive MountsVipimo Visivyo na Mipaka
Katika matukio kadhaa utagundua kwamba chombo kina kiasi fulani kilichofungwa kutoka kwa mwenyeji. Ikiwa kiasi hiki hakijasakinishwa kwa usahihi unaweza kuwa na uwezo wa kufikia/kubadilisha data nyeti: Kusoma siri, kubadilisha ssh authorized_keys...
Kupandisha Mamlaka kwa Kutumia 2 makombora na kufunga mwenyeji
Ikiwa una ufikiaji kama root ndani ya chombo ambacho kina folda fulani kutoka kwa mwenyeji imewekwa na umetoka kama mtumiaji asiye na mamlaka kwa mwenyeji na una ufikiaji wa kusoma kwenye folda iliyowekwa. Unaweza kuunda faili ya bash suid kwenye folda iliyowekwa ndani ya chombo na kuitekeleza kutoka kwa mwenyeji ili kupandisha mamlaka.
Upandishaji wa Mamlaka na mabano 2
Ikiwa una ufikiaji kama root ndani ya chombo na umetoka kama mtumiaji asiye na mamlaka kwenye mwenyeji, unaweza kutumia mabano yote mawili kufanya upandishaji wa mamlaka ndani ya mwenyeji ikiwa una uwezo wa MKNOD ndani ya chombo (kwa chaguo-msingi) kama inavyoelezwa katika chapisho hili. Kwa uwezo kama huo, mtumiaji wa root ndani ya chombo ameruhusiwa kuunda faili za kifaa cha kuzuia. Faili za kifaa ni faili maalum zinazotumiwa kwa kufikia vifaa vya chini & moduli za kernel. Kwa mfano, faili ya kifaa cha kuzuia /dev/sda inatoa ufikiaji wa kusoma data ghafi kwenye diski za mifumo.
Docker inalinda dhidi ya matumizi mabaya ya vifaa vya kuzuia ndani ya vyombo kwa kutekeleza sera ya cgroup ambayo inazuia operesheni za kusoma/kusika kwenye vifaa vya kuzuia. Walakini, ikiwa kifaa cha kuzuia kinachoundwa ndani ya chombo, kinakuwa kinapatikana kutoka nje ya chombo kupitia saraka ya /proc/PID/root/. Upatikanaji huu unahitaji mmiliki wa mchakato awe sawa ndani na nje ya chombo.
Mfano wa Udanganyifu kutoka kwenye makala hii:
hostPID
Ikiwa unaweza kupata michakato ya mwenyeji utaweza kupata habari nyeti iliyohifadhiwa katika michakato hiyo. Tekeleza mtihani wa maabara:
Kwa mfano, utaweza kuorodhesha michakato inayotumia kitu kama ps auxn
na kutafuta maelezo nyeti katika amri.
Kisha, kama unaweza kufikia kila mchakato wa mwenyeji katika /proc/, unaweza tu kuiba siri zao za mazingira kwa kukimbia:
Unaweza pia kufikia maelezo ya faili ya michakato mingine na kusoma faili zao zilizofunguliwa:
Unaweza pia kuua michakato na kusababisha DoS.
Ikiwa kwa njia fulani una upatikanaji wa mamlaka juu ya mchakato nje ya chombo, unaweza kukimbia kitu kama nsenter --target <pid> --all
au nsenter --target <pid> --mount --net --pid --cgroup
kukimbia kabia na vikwazo sawa vya ns (kwa matumaini hakuna) kama mchakato huo.
hostNetwork
Ikiwa chombo kilikonfigurwa na Dereva wa Uunganisho wa Mwenyeji wa Docker (--network=host
), mtandao wa chombo hicho haujaachwa peke yake kutoka kwa mwenyeji wa Docker (chombo hushiriki uga wa mtandao wa mwenyeji), na chombo hicho hakipati anwani yake ya IP yenyewe. Kwa maneno mengine, chombo hufunga huduma zote moja kwa moja kwa anwani ya IP ya mwenyeji. Zaidi ya hayo, chombo hicho kinaweza kukamata TRAFIKI YOTE ya mtandao ambayo mwenyeji anatuma na kupokea kwenye kiolesura kilichoshirikiwa tcpdump -i eth0
.
Kwa mfano, unaweza kutumia hii kwa kukamata na hata kughushi trafiki kati ya mwenyeji na kielelezo cha metadata.
Kama katika mifano ifuatayo:
Pia utaweza kupata huduma za mtandao zilizofungwa kwa localhost ndani ya mwenyeji au hata kupata ruhusa za metadata ya node (ambazo zinaweza kutofautiana na zile ambazo chombo kinaweza kupata).
hostIPC
Kwa hostIPC=true
, unapata ufikio wa rasilimali za mawasiliano kati ya michakato (IPC) ya mwenyeji, kama vile kumbukumbu iliyoshirikishwa katika /dev/shm
. Hii inaruhusu kusoma/kutumia mahali ambapo rasilimali sawa za IPC hutumiwa na michakato mingine ya mwenyeji au podi. Tumia ipcs
kupekua mbinu hizi za IPC zaidi.
Pima /dev/shm - Tafuta faili yoyote katika eneo hili la kumbukumbu iliyoshirikishwa:
ls -la /dev/shm
Pima vifaa vya IPC vilivyopo - Unaweza kuangalia kuona ikiwa vifaa vyovyote vya IPC vinatumika kwa kutumia
/usr/bin/ipcs
. Angalia hivi:ipcs -a
Rudisha uwezo
Ikiwa syscall unshare
haijazuiliwa unaweza kurejesha uwezo wote kwa kukimbia:
Mabaya ya eneo la mtumiaji kupitia symlink
Mbinu ya pili iliyoelezwa katika chapisho https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ inaonyesha jinsi unavyoweza kutumia bind mounts na user namespaces, kuathiri faili ndani ya mwenyeji (katika kesi hiyo maalum, kufuta faili).
Tumia Trickest kujenga na kutumia workflows kwa urahisi zinazotumia zana za jamii ya juu zaidi duniani. Pata Ufikiaji Leo:
CVEs
Runc exploit (CVE-2019-5736)
Kwa kesi unaweza kutekeleza docker exec
kama root (labda kwa sudo), jaribu kuinua mamlaka kwa kutoroka kutoka kwa chombo kwa kutumia CVE-2019-5736 (kutumia hapa). Mbinu hii kimsingi ita badilisha /bin/sh binary ya mwenyeji kutoka kwa chombo, hivyo yeyote anayetekeleza docker exec anaweza kuzindua payload.
Badilisha payload kulingana na hilo na jenga main.go kwa go build main.go
. Binary inayopatikana inapaswa kuwekwa kwenye chombo cha docker kwa utekelezaji.
Baada ya utekelezaji, mara tu inapoonyesha [+] Imebadilishwa /bin/sh kwa mafanikio
unahitaji kutekeleza yafuatayo kutoka kwa mashine ya mwenyeji:
docker exec -it <jina-la-chombo> /bin/sh
Hii itazindua payload iliyopo kwenye faili ya main.go.
Kwa habari zaidi: https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html
Kuna CVEs nyingine ambazo chombo kinaweza kuwa hatarini, unaweza kupata orodha katika https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list
Kutoroka Kwa Kubinafsisha Kwa Docker
Eneo la Kutoroka la Docker
Namespaces: Mchakato unapaswa kuwa umejitenga kabisa na michakato mingine kupitia namespaces, hivyo hatuwezi kutoroka kuingiliana na michakato mingine kutokana na namespaces (kwa chaguo-msingi hawezi kuwasiliana kupitia IPCs, soketi za unix, huduma za mtandao, D-Bus,
/proc
ya michakato mingine).Mtumiaji wa Root: Kwa chaguo-msingi mtumiaji anayetekeleza mchakato ni mtumiaji wa root (hata hivyo mamlaka yake ni mdogo).
Uwezo: Docker inaacha uwezo ufuatao:
cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
Syscalls: Hizi ni syscalls ambazo mtumiaji wa root hataweza kuita (kutokana na kukosa uwezo + Seccomp). Syscalls nyingine zinaweza kutumika kujaribu kutoroka.
Docker Breakout Privilege Escalation
Description
This repository contains a proof of concept exploit for Docker breakout privilege escalation. The exploit takes advantage of a misconfigured Docker container to gain root access on the host machine.
Usage
Compile the syscall_bf.c
code on the host machine using the provided Makefile. Run the compiled binary inside a Docker container to escalate privileges and gain root access.
Disclaimer
This exploit is for educational purposes only. Misuse of this exploit on unauthorized systems is illegal.
Credits
This exploit was created by [Author Name].
Reference
Container Breakout through Usermode helper Template
If you are in userspace (no kernel exploit involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode):
Find the path of the containers filesystem inside the host
You can do this via mount, or via brute-force PIDs as explained in the second release_agent exploit
Find some functionality where you can indicate the path of a script to be executed by a host process (helper) if something happens
You should be able to execute the trigger from inside the host
You need to know where the containers files are located inside the host to indicate a script you write inside the host
Have enough capabilities and disabled protections to be able to abuse that functionality
You might need to mount things o perform special privileged actions you cannot do in a default docker container
References
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Last updated