Docker Breakout / Privilege Escalation
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Gebruik Trickest om maklik te bou en werkvloei te outomatiseer wat deur die wêreld se meest gevorderde gemeenskapstoestelle aangedryf word. Kry Toegang Vandag:
linpeas: Dit kan ook hou van houers
CDK: Hierdie hulpmiddel is redelik nuttig om die houer waarin jy is te hou, selfs om te probeer om outomaties te ontsnap
amicontained: Nuttige hulpmiddel om die bevoegdhede wat die houer het te kry om maniere te vind om daarvan te ontsnap
deepce: Hulpmiddel om te hou en te ontsnap van houers
grype: Kry die CVEs wat in die sagteware wat in die beeld geïnstalleer is, bevat is
As jy op een of ander manier vind dat die docker socket gemonteer is binne die docker houer, sal jy in staat wees om daarvan te ontsnap. Dit gebeur gewoonlik in docker houers wat om een of ander rede met die docker daemon moet verbind om aksies uit te voer.
In hierdie geval kan jy gewone docker-opdragte gebruik om met die docker-daemon te kommunikeer:
As die docker socket in 'n onverwagte plek is, kan jy steeds daarmee kommunikeer deur die docker
opdrag met die parameter -H unix:///path/to/docker.sock
Docker daemon mag ook luister op 'n poort (standaard 2375, 2376) of op Systemd-gebaseerde stelsels, kommunikasie met die Docker daemon kan plaasvind oor die Systemd socket fd://
.
Boonop, let op die runtime sockets van ander hoëvlak runtimes:
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
...
Jy moet die vermoëns van die houer nagaan, as dit enige van die volgende het, mag jy in staat wees om daaruit te ontsnap: 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
Jy kan tans die vermoëns van die houer nagaan met voorheen genoemde outomatiese gereedskap of:
In die volgende bladsy kan jy meer leer oor linux vermoëns en hoe om dit te misbruik om te ontsnap/te eskaleer bevoegdhede:
Linux Capabilities'n Bevoegde houer kan geskep word met die vlag --privileged
of deur spesifieke verdedigingstelsels te deaktiveer:
--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
Die --privileged
vlag verlaag die sekuriteit van die houer aansienlik, wat onbeperkte toesteltoegang bied en verskeie beskermings omseil. Vir 'n gedetailleerde ontleding, verwys na die dokumentasie oor die volle impakte van --privileged
.
Met hierdie toestemmings kan jy net na die naamruimte van 'n proses wat in die gasheer as root loop beweeg soos init (pid:1) deur net te loop: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
Toets dit in 'n houer wat uitvoer:
Net met die privileged-vlag kan jy probeer om die gasheer se skyf te benader of probeer om te ontsnap deur release_agent of ander ontsnapte te misbruik.
Toets die volgende omseilings in 'n houer wat uitvoer:
Goed geconfigureerde docker houers sal nie opdragte soos fdisk -l toelaat nie. egter op verkeerd geconfigureerde docker opdragte waar die vlag --privileged
of --device=/dev/sda1
met hoofletters gespesifiseer is, is dit moontlik om die bevoegdhede te verkry om die gasheer skyf te sien.
So om die gasheer masjien oor te neem, is dit triviaal:
En voilà ! Jy kan nou toegang tot die lêerstelsel van die gasheer verkry omdat dit in die /mnt/hola
gids gemonteer is.
Binne die houer kan 'n aanvaller probeer om verdere toegang tot die onderliggende gasheer OS te verkry via 'n skryfbare hostPath volume wat deur die kluster geskep is. Hieronder is 'n paar algemene dinge wat jy binne die houer kan nagaan om te sien of jy hierdie aanvallersvektor kan benut:
Vind 'n verklaring van die tegniek in:
Docker release_agent cgroups escapeIn die vorige exploits is die absolute pad van die houer binne die gasheer se lêerstelsel bekend gemaak. Dit is egter nie altyd die geval nie. In gevalle waar jy nie die absolute pad van die houer binne die gasheer ken nie, kan jy hierdie tegniek gebruik:
release_agent exploit - Relative Paths to PIDsVoer die PoC binne 'n bevoorregte houer uit, dit behoort 'n uitvoer soortgelyk aan die volgende te verskaf:
Daar is verskeie lêers wat gemonteer kan wees wat inligting oor die onderliggende gasheer gee. Sommige van hulle kan selfs aandui iets wat deur die gasheer uitgevoer moet word wanneer iets gebeur (wat 'n aanvaller sal toelaat om uit die houer te ontsnap). Die misbruik van hierdie lêers kan toelaat dat:
release_agent (alreeds voorheen behandel)
U kan egter ander sensitiewe lêers vind om na te kyk op hierdie bladsy:
Sensitive MountsIn verskeie gevalle sal u vind dat die houer 'n volume van die gasheer gemonteer het. As hierdie volume nie korrek gekonfigureer is nie, kan u moontlik sensitiewe data toegang/aanpas: Lees geheime, verander ssh authorized_keys…
As jy toegang het as root binne 'n houer wat 'n paar vouers van die gasheer gemonteer het en jy het gevlug as 'n nie-bevoorregte gebruiker na die gasheer en het lees toegang oor die gemonteerde vouer. Jy kan 'n bash suid-lêer in die gemonteerde vouer binne die houer skep en dit van die gasheer uitvoer om privesc te verkry.
As jy toegang het as root binne 'n houer en jy het gevlug as 'n nie-bevoorregte gebruiker na die gasheer, kan jy beide shells misbruik om privesc binne die gasheer te doen as jy die vermoë MKNOD binne die houer het (dit is standaard) soos in hierdie pos verduidelik. Met so 'n vermoë mag die root-gebruiker binne die houer bloktoestel lêers skep. Toestel lêers is spesiale lêers wat gebruik word om toegang te verkry tot onderliggende hardeware & kernmodules. Byvoorbeeld, die /dev/sda bloktoestel lêer gee toegang tot om die rou data op die stelseldisk te lees.
Docker beskerm teen bloktoestel misbruik binne houers deur 'n cgroup beleid af te dwing wat bloktoestel lees/skryf operasies blokkeer. Nietemin, as 'n bloktoestel binne die houer geskep word, word dit toeganklik van buite die houer via die /proc/PID/root/ gids. Hierdie toegang vereis dat die proses eienaar dieselfde moet wees binne en buite die houer.
Exploitation voorbeeld van hierdie skrywe:
As jy toegang kan verkry tot die prosesse van die gasheer, gaan jy in staat wees om 'n baie sensitiewe inligting wat in daardie prosesse gestoor is, te bekom. Voer toetslaboratorium uit:
Byvoorbeeld, jy sal in staat wees om die prosesse te lys met iets soos ps auxn
en soek na sensitiewe besonderhede in die opdragte.
Dan, aangesien jy elke proses van die gasheer in /proc/ kan toegang verkry, kan jy net hul omgewingsecrets steel deur te loop:
U kan ook ander prosesse se lêerdeskriptoren toegang en hul oop lêers lees:
U kan ook prosesse doodmaak en 'n DoS veroorsaak.
As u op een of ander manier bevoorregte toegang oor 'n proses buite die houer het, kan u iets soos nsenter --target <pid> --all
of nsenter --target <pid> --mount --net --pid --cgroup
uitvoer om 'n skulp met dieselfde ns-beperkings (hopelik geen) as daardie proses te loop.
As 'n houer geconfigureer is met die Docker host networking driver (--network=host
), is daardie houer se netwerkstapel nie van die Docker-gasheer geïsoleer nie (die houer deel die gasheer se netwerknaamruimte), en die houer ontvang nie sy eie IP-adres nie. Met ander woorde, die houer bind al die dienste direk aan die gasheer se IP. Verder kan die houer ALLES netwerkverkeer wat die gasheer stuur en ontvang op die gedeelde koppelvlak tcpdump -i eth0
onderskep.
Byvoorbeeld, jy kan dit gebruik om verkeer te snuffel en selfs te spoof tussen die gasheer en metadata-instantie.
Soos in die volgende voorbeelde:
Jy sal ook in staat wees om netwerkdienste wat aan localhost gebind is binne die gasheer te benader of selfs toegang te verkry tot die metadata-toestemmings van die node (wat dalk anders kan wees as wat 'n houer kan toegang verkry).
Met hostIPC=true
kry jy toegang tot die gasheer se inter-proses kommunikasie (IPC) hulpbronne, soos gedeelde geheue in /dev/shm
. Dit stel jou in staat om te lees/schryf waar dieselfde IPC hulpbronne deur ander gasheer of pod prosesse gebruik word. Gebruik ipcs
om hierdie IPC meganismes verder te ondersoek.
Inspecteer /dev/shm - Soek enige lêers in hierdie gedeelde geheue ligging: ls -la /dev/shm
Inspecteer bestaande IPC fasiliteite – Jy kan kyk of enige IPC fasiliteite gebruik word met /usr/bin/ipcs
. Kontroleer dit met: ipcs -a
As die syscall unshare
nie verbied is nie, kan jy al die vermoëns herwin wat loop:
Die tweede tegniek wat in die pos https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ verduidelik word, dui aan hoe jy bind mounts met gebruikersnaamruimtes kan misbruik om lêers binne die gasheer te beïnvloed (in daardie spesifieke geval, lêers te verwyder).
Gebruik Trickest om maklik te bou en werkvloei te automate wat deur die wêreld se mees gevorderde gemeenskapstools aangedryf word. Kry Vandag Toegang:
In die geval dat jy docker exec
as root kan uitvoer (waarskynlik met sudo), probeer om voorregte te verhoog deur uit 'n houer te ontsnap deur CVE-2019-5736 te misbruik (exploit hier). Hierdie tegniek sal basies die /bin/sh binêre van die gasheer uit 'n houer oorskryf, sodat enigeen wat docker exec uitvoer die payload kan aktiveer.
Verander die payload dienooreenkomstig en bou die main.go met go build main.go
. Die resulterende binêre moet in die docker houer geplaas word vir uitvoering.
By uitvoering, sodra dit [+] Oorskryf /bin/sh suksesvol
vertoon, moet jy die volgende vanaf die gasheer masjien uitvoer:
docker exec -it <container-name> /bin/sh
Dit sal die payload aktiveer wat in die main.go-lêer teenwoordig is.
Vir meer inligting: https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html
Daar is ander CVEs waaraan die houer kwesbaar kan wees, jy kan 'n lys vind in https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list
Naamruimtes: Die proses moet heeltemal geskei wees van ander prosesse deur middel van naamruimtes, sodat ons nie kan ontsnap deur met ander procs te kommunikeer nie (per standaard kan nie kommunikeer via IPCs, unix sockets, netwerk svcs, D-Bus, /proc
van ander procs).
Root gebruiker: Per standaard is die gebruiker wat die proses uitvoer die root gebruiker (maar sy voorregte is beperk).
Vermogens: Docker laat die volgende vermogens toe: 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: Dit is die syscalls wat die root gebruiker nie kan aanroep nie (as gevolg van ontbrekende vermogens + Seccomp). Die ander syscalls kan gebruik word om te probeer ontsnap.
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)