Docker Breakout / Privilege Escalation
Last updated
Last updated
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Tumia Trickest kujenga na kujiendesha kiotomatiki kwa urahisi kwa kutumia zana za jamii zilizoendelea zaidi duniani. Pata Ufikiaji Leo:
linpeas: Inaweza pia kuhesabu kontena
CDK: Zana hii ni faida sana kuhesabu kontena ulilomo hata kujaribu kutoroka kiotomatiki
amicontained: Zana muhimu kupata mamlaka ambayo kontena lina ili kutafuta njia za kutoroka kutoka kwake
deepce: Zana ya kuhesabu na kutoroka kutoka kwa kontena
grype: Pata CVEs zilizomo katika programu iliyosakinishwa kwenye picha
Ikiwa kwa namna fulani unapata kuwa docker socket imewekwa ndani ya kontena la docker, utaweza kutoroka kutoka kwake. Hii kawaida hutokea katika kontena za docker ambazo kwa sababu fulani zinahitaji kuungana na docker daemon ili kutekeleza vitendo.
Katika kesi hii unaweza kutumia amri za kawaida za docker kuwasiliana na docker daemon:
Ikiwa docker socket iko mahali pasipotarajiwa bado unaweza kuwasiliana nayo kwa kutumia amri ya docker
na parameter -H unix:///path/to/docker.sock
Docker daemon inaweza pia kusikiliza kwenye bandari (kwa default 2375, 2376) au kwenye mifumo ya Systemd, mawasiliano na Docker daemon yanaweza kufanyika kupitia socket ya Systemd fd://
.
Zaidi ya hayo, zingatia sockets za wakati wa utekelezaji za runtimes nyingine za kiwango cha juu:
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
...
Unapaswa kuangalia uwezo wa kontena, ikiwa ina mojawapo ya yafuatayo, huenda ukawa na uwezo wa 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 kontena kwa sasa kwa kutumia zana za kiotomatiki zilizotajwa hapo awali au:
Katika ukurasa ufuatao unaweza kujifunza zaidi kuhusu uwezo wa linux na jinsi ya kuyatumia vibaya ili kutoroka/kupandisha haki:
Kontena lenye haki linaweza kuundwa kwa bendera --privileged
au kuzima 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 --privileged
inapunguza usalama wa kontena kwa kiasi kikubwa, ikitoa ufikiaji wa vifaa usio na kikomo na kupita ulinzi kadhaa. Kwa maelezo ya kina, rejelea nyaraka kuhusu athari kamili za --privileged
.
Kwa ruhusa hizi unaweza tu kuhamia kwenye eneo la jina la mchakato unaotembea kwenye mwenyeji kama root kama init (pid:1) kwa kukimbia: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
Jaribu katika kontena ukitekeleza:
Kwa kutumia tu bendera ya privileged unaweza kujaribu kufikia diski ya mwenyeji au kujaribu kutoroka kwa kutumia release_agent au njia nyingine za kutoroka.
Jaribu bypass hizi katika kontena ukitekeleza:
Vyombo vya docker vilivyowekwa vizuri havitaruhusu amri kama fdisk -l. Hata hivyo, kwenye amri za docker zilizo na makosa ambapo bendera --privileged
au --device=/dev/sda1
yenye herufi kubwa imeainishwa, inawezekana kupata mamlaka ya kuona diski ya mwenyeji.
Hivyo, kuchukua udhibiti wa mashine ya mwenyeji, ni rahisi:
Na voilà! Sasa unaweza kufikia mfumo wa faili wa mwenyeji kwa sababu umewekwa katika folda ya /mnt/hola
.
Ndani ya kontena, mshambuliaji anaweza kujaribu kupata ufikiaji zaidi wa mfumo wa uendeshaji wa mwenyeji kupitia kiasi cha hostPath kinachoweza kuandikwa kilichoundwa na klasta. Hapa chini kuna mambo ya kawaida unayoweza kuangalia ndani ya kontena ili kuona kama unaweza kutumia njia hii ya mshambuliaji:
Pata maelezo ya mbinu katika:
Katika matumizi ya awali, njia kamili ya kontena ndani ya mfumo wa faili wa mwenyeji inafichuliwa. Hata hivyo, hii si kila wakati. Katika hali ambapo hujui njia kamili ya kontena ndani ya mwenyeji unaweza kutumia mbinu hii:
Kutekeleza PoC ndani ya kontena lenye mamlaka kunapaswa kutoa matokeo yanayofanana na:
Kuna faili kadhaa ambazo zinaweza kuunganishwa ambazo zinatoa habari kuhusu mwenyeji wa chini. Baadhi yao wanaweza hata kuashiria kitu kinachoweza kutekelezwa na mwenyeji wakati kitu kinatokea (ambacho kitamruhusu mshambuliaji kutoroka kutoka kwenye kontena). Kukandamiza faili hizi kunaweza kuruhusu:
release_agent (tayari imejadiliwa hapo awali)
Hata hivyo, unaweza kupata faili nyingine nyeti za kuangalia kwenye ukurasa huu:
Katika matukio kadhaa utaona kwamba kontena lina kiasi fulani kilichounganishwa kutoka kwa mwenyeji. Ikiwa kiasi hiki hakikupangwa vizuri unaweza kuwa na uwezo wa kufikia/kubadilisha data nyeti: Soma siri, badilisha ssh authorized_keys…
Ikiwa una ufikiaji kama root ndani ya kontena ambalo lina folda fulani kutoka kwa mwenyeji iliyowekwa na una kutoroka kama mtumiaji asiye na mamlaka kwenda kwa mwenyeji na una ufikiaji wa kusoma juu ya folda iliyowekwa. Unaweza kuunda faili ya bash suid katika folda iliyowekwa ndani ya kontena na kuitekeleza kutoka kwa mwenyeji ili kupandisha mamlaka.
Ikiwa una ufikiaji kama root ndani ya kontena na ume kimbia kama mtumiaji asiye na mamlaka hadi kwenye mwenyeji, unaweza kutumia shell zote mbili ili privesc ndani ya mwenyeji ikiwa una uwezo wa MKNOD ndani ya kontena (ni kwa default) kama ilivyoelezwa katika chapisho hili. Kwa uwezo kama huo, mtumiaji wa root ndani ya kontena anaruhusiwa kuunda faili za kifaa cha block. Faili za kifaa ni faili maalum ambazo zinatumika ili kufikia vifaa vya chini na moduli za kernel. Kwa mfano, faili ya kifaa cha block /dev/sda inatoa ufikiaji wa kusoma data safi kwenye diski ya mfumo.
Docker inalinda dhidi ya matumizi mabaya ya kifaa cha block ndani ya kontena kwa kutekeleza sera ya cgroup ambayo inasitisha operesheni za kusoma/kandika kifaa cha block. Hata hivyo, ikiwa kifaa cha block kimeundwa ndani ya kontena, kinapatikana kutoka nje ya kontena kupitia /proc/PID/root/ directory. Ufikiaji huu unahitaji mmiliki wa mchakato kuwa sawa ndani na nje ya kontena.
Mfano wa Ukatili kutoka kwenye andika hii:
Ikiwa unaweza kufikia michakato ya mwenyeji, utaweza kufikia taarifa nyingi nyeti zilizohifadhiwa katika michakato hiyo. Endesha majaribio ya maabara:
Kwa mfano, utaweza kuorodhesha michakato ukitumia kitu kama ps auxn
na kutafuta maelezo nyeti katika amri.
Kisha, kwa kuwa unaweza kufikia kila mchakato wa mwenyeji katika /proc/ unaweza tu kuiba siri zao za env ukikimbia:
Unaweza pia kufikia viashiria vya faili vya michakato mingine na kusoma faili zao zilizo wazi:
Unaweza pia kuua michakato na kusababisha DoS.
Ikiwa kwa namna fulani una ufikiaji wa haki juu ya mchakato nje ya kontena, unaweza kuendesha kitu kama nsenter --target <pid> --all
au nsenter --target <pid> --mount --net --pid --cgroup
ili kuendesha shell yenye vizuizi sawa vya ns (tumaini hakuna) kama mchakato huo.
Ikiwa kontena ilipangwa na Docker host networking driver (--network=host
), stack ya mtandao ya kontena hiyo haijatengwa kutoka kwa mwenyeji wa Docker (kontena inashiriki namespace ya mtandao wa mwenyeji), na kontena hiyo haipati anwani yake ya IP. Kwa maneno mengine, kontena inafunga huduma zote moja kwa moja kwenye IP ya mwenyeji. Zaidi ya hayo, kontena linaweza kuchukua na hata kubadilisha trafiki ZOTE za mtandao ambazo mwenyeji anatumia na kupokea kwenye interface iliyoshirikiwa tcpdump -i eth0
.
Kwa mfano, unaweza kutumia hii kunusa na hata kubadilisha trafiki kati ya mwenyeji na mfano wa metadata.
Kama katika mifano ifuatayo:
Utakuwa na uwezo pia wa kufikia huduma za mtandao zilizofungwa kwa localhost ndani ya mwenyeji au hata kufikia idhini za metadata za node (ambazo zinaweza kuwa tofauti na zile ambazo kontena linaweza kufikia).
Na hostIPC=true
, unapata ufikiaji wa rasilimali za mawasiliano kati ya michakato ya mwenyeji (IPC), kama vile kumbukumbu ya pamoja katika /dev/shm
. Hii inaruhusu kusoma/kandika ambapo rasilimali hizo za IPC zinatumika na michakato mingine ya mwenyeji au pod. Tumia ipcs
kuchunguza mitambo hii ya IPC zaidi.
Kagua /dev/shm - Angalia faili zozote katika eneo hili la kumbukumbu ya pamoja: ls -la /dev/shm
Kagua vifaa vya IPC vilivyopo – Unaweza kuangalia kama vifaa vyovyote vya IPC vinatumika kwa /usr/bin/ipcs
. Kagua kwa: ipcs -a
Ikiwa syscall unshare
haijakatazwa unaweza kurejesha uwezo wote ukikimbia:
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 namespaces za mtumiaji, ili kuathiri faili ndani ya mwenyeji (katika kesi hiyo maalum, kufuta faili).
Tumia Trickest kujenga na kujiendesha kiotomatiki kazi zinazotolewa na zana za jamii zilizoendelea zaidi duniani. Pata Ufikiaji Leo:
Iwapo unaweza kutekeleza docker exec
kama root (labda kwa kutumia sudo), jaribu kupandisha mamlaka ukikimbia kutoka kwenye kontena kwa kutumia CVE-2019-5736 (exploit hapa). Mbinu hii kimsingi it andika upya /bin/sh binary ya mwenyeji kutoka kwenye kontena, hivyo mtu yeyote anayetekeleza docker exec anaweza kuanzisha payload.
Badilisha payload ipasavyo na jenga main.go kwa go build main.go
. Binary inayotokana inapaswa kuwekwa kwenye kontena la docker kwa ajili ya utekelezaji.
Pale inapo tekelezwa, mara tu inapoonyesha [+] Overwritten /bin/sh successfully
unahitaji kutekeleza yafuatayo kutoka kwenye mashine ya mwenyeji:
docker exec -it <container-name> /bin/sh
Hii itaanzisha payload ambayo ipo katika faili la main.go.
Kwa maelezo zaidi: https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html
Kuna CVEs nyingine ambazo kontena linaweza kuwa hatarini nazo, unaweza kupata orodha katika https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list
Namespaces: Mchakato unapaswa kuwa separate kabisa kutoka kwa michakato mingine kupitia namespaces, hivyo hatuwezi kukimbia kuingiliana na procs wengine kwa sababu ya namespaces (kwa default haiwezi kuwasiliana kupitia IPCs, unix sockets, huduma za mtandao, D-Bus, /proc
ya procs wengine).
Mtumiaji wa Root: Kwa default mtumiaji anayekimbia mchakato ni mtumiaji wa root (hata hivyo mamlaka yake ni mdogo).
Uwezo: Docker inacha 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 ndizo syscalls ambazo mtumiaji wa root hataweza kuita (kwa sababu ya kukosa uwezo + Seccomp). Syscalls nyingine zinaweza kutumika kujaribu kukimbia.
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
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)