Docker Breakout / Privilege Escalation
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
linpeas: Takođe može enumerisati kontejnere
CDK: Ovaj alat je prilično koristan za enumeraciju kontejnera u kojem se nalazite, čak i za automatski pokušaj bekstva
amicontained: Koristan alat za dobijanje privilegija koje kontejner ima kako bi se pronašli načini za bekstvo iz njega
deepce: Alat za enumeraciju i bekstvo iz kontejnera
grype: Dobijte CVE-ove sadržane u softveru instaliranom u slici
Ako nekako otkrijete da je docker socket montiran unutar docker kontejnera, moći ćete da pobegnete iz njega. To se obično dešava u docker kontejnerima koji iz nekog razloga treba da se povežu sa docker daemon-om kako bi izvršili akcije.
U ovom slučaju možete koristiti obične docker komande za komunikaciju sa docker demonima:
U slučaju da je docker socket na neočekivanom mestu, i dalje možete komunicirati s njim koristeći docker
komandu sa parametrima -H unix:///path/to/docker.sock
Docker demon može takođe slušati na portu (po defaultu 2375, 2376) ili na sistemima zasnovanim na Systemd-u, komunikacija sa Docker demon može se odvijati preko Systemd socket-a fd://
.
Pored toga, obratite pažnju na runtime socket-e drugih visoko nivoa runtime-a:
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
...
Trebalo bi da proverite sposobnosti kontejnera, ako ima neku od sledećih, možda ćete moći da pobegnete iz njega: 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
Možete proveriti trenutne sposobnosti kontejnera koristeći prethodno pomenute automatske alate ili:
Na sledećoj stranici možete saznati više o linux sposobnostima i kako ih zloupotrebiti za bekstvo/escalaciju privilegija:
Linux CapabilitiesPrivilegovani kontejner može biti kreiran sa oznakom --privileged
ili onemogućavanjem specifičnih odbrana:
--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
Oznaka --privileged
značajno smanjuje bezbednost kontejnera, nudeći neograničen pristup uređajima i zaobilazeći nekoliko zaštita. Za detaljno objašnjenje, pogledajte dokumentaciju o punim uticajima --privileged
.
Sa ovim dozvolama možete jednostavno preći u prostor imena procesa koji se izvršava na hostu kao root kao što je init (pid:1) jednostavno pokretanjem: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
Testirajte to u kontejneru izvršavajući:
Samo sa privilegovanom oznakom možete pokušati da pristupite disku hosta ili pokušate da pobegnete zloupotrebom release_agent-a ili drugih izlaza.
Testirajte sledeće zaobilaženja u kontejneru izvršavajući:
Dobro konfigurisani docker kontejneri neće dozvoliti komandu kao što je fdisk -l. Međutim, na loše konfigurisanoj docker komandi gde je postavljena zastavica --privileged
ili --device=/dev/sda1
sa velikim slovima, moguće je dobiti privilegije da se vidi host disk.
Dakle, da preuzmete host mašinu, to je trivijalno:
I evo! Sada možete pristupiti datotečnom sistemu domaćina jer je montiran u /mnt/hola
folderu.
Unutar kontejnera, napadač može pokušati da dobije dalji pristup osnovnom host OS-u putem zapisivog hostPath volumena koji je kreirao klaster. Ispod su neke uobičajene stvari koje možete proveriti unutar kontejnera da vidite da li možete iskoristiti ovaj napadački vektor:
Pronađite objašnjenje tehnike u:
Docker release_agent cgroups escapeU prethodnim eksploatacijama apsolutna putanja kontejnera unutar datotečnog sistema domaćina je otkrivena. Međutim, to nije uvek slučaj. U slučajevima kada ne znate apsolutnu putanju kontejnera unutar domaćina možete koristiti ovu tehniku:
release_agent exploit - Relative Paths to PIDsIzvršavanje PoC unutar privilegovanog kontejnera trebalo bi da pruži izlaz sličan:
Postoji nekoliko datoteka koje mogu biti montirane koje daju informacije o osnovnom hostu. Neke od njih mogu čak ukazivati na nešto što će host izvršiti kada se nešto dogodi (što će omogućiti napadaču da pobegne iz kontejnera). Zloupotreba ovih datoteka može omogućiti:
release_agent (već pokriveno ranije)
Međutim, možete pronaći druge osetljive datoteke koje treba proveriti na ovoj stranici:
Sensitive MountsU nekoliko slučajeva ćete otkriti da kontejner ima neki volumen montiran sa hosta. Ako ovaj volumen nije pravilno konfigurisan, možda ćete moći da pristupite/izmenite osetljive podatke: Čitajte tajne, menjajte ssh authorized_keys…
Ako imate pristup kao root unutar kontejnera koji ima neku fasciklu sa hosta montiranu i ako ste pobegli kao korisnik bez privilegija na host i imate pristup za čitanje nad montiranom fasciklom. Možete kreirati bash suid datoteku u montiranoj fascikli unutar kontejnera i izvršiti je sa hosta da biste dobili privilegije.
If you have access as root inside a container and you have escaped as a non privileged user to the host, you can abuse both shells to privesc inside the host if you have the capability MKNOD inside the container (it's by default) as explained in this post. With such capability the root user within the container is allowed to create block device files. Device files are special files that are used to access underlying hardware & kernel modules. For example, the /dev/sda block device file gives access to read the raw data on the systems disk.
Docker štiti od zloupotrebe blok uređaja unutar kontejnera primenjujući cgroup politiku koja blokira operacije čitanja/pisanja blok uređaja. Ipak, ako je blok uređaj kreiran unutar kontejnera, postaje dostupan spolja iz kontejnera putem /proc/PID/root/ direktorijuma. Ovaj pristup zahteva da vlasnik procesa bude isti i unutar i van kontejnera.
Exploitation example from this writeup:
Ako možete pristupiti procesima hosta, moći ćete da pristupite velikoj količini osetljivih informacija koje se čuvaju u tim procesima. Pokrenite test laboratoriju:
Na primer, moći ćete da navedete procese koristeći nešto poput ps auxn
i tražite osetljive detalje u komandama.
Zatim, pošto možete da pristupite svakom procesu hosta u /proc/ možete jednostavno ukrasti njihove env tajne pokretanjem:
Možete takođe pristupiti datotekama drugih procesa i čitati njihove otvorene datoteke:
Možete takođe ubiti procese i izazvati DoS.
Ako nekako imate privilegovani pristup procesu van kontejnera, mogli biste pokrenuti nešto poput nsenter --target <pid> --all
ili nsenter --target <pid> --mount --net --pid --cgroup
da pokrenete shell sa istim ns ograničenjima (nadamo se bez) kao taj proces.
Ako je kontejner konfigurisan sa Docker host networking driver (--network=host
), mrežni stek tog kontejnera nije izolovan od Docker hosta (kontejner deli mrežni prostor hosta), i kontejner ne dobija svoju IP adresu. Drugim rečima, kontejner vezuje sve usluge direktno za IP hosta. Pored toga, kontejner može presresti SVE mrežne pakete koje host šalje i prima na deljenom interfejsu tcpdump -i eth0
.
Na primer, možete to koristiti da sniff-ujete i čak spoof-ujete saobraćaj između hosta i instancu metapodataka.
Kao u sledećim primerima:
Takođe ćete moći da pristupite mrežnim uslugama vezanim za localhost unutar hosta ili čak da pristupite dozvolama metapodataka čvora (koje se mogu razlikovati od onih kojima kontejner može pristupiti).
Sa hostIPC=true
, dobijate pristup resursima međuprocesne komunikacije (IPC) hosta, kao što je deljena memorija u /dev/shm
. Ovo omogućava čitanje/pisanje gde se isti IPC resursi koriste od strane drugih host ili pod procesa. Koristite ipcs
za dalju inspekciju ovih IPC mehanizama.
Inspekcija /dev/shm - Potražite bilo koje datoteke u ovoj lokaciji deljene memorije: ls -la /dev/shm
Inspekcija postojećih IPC objekata – Možete proveriti da li se koriste neki IPC objekti sa /usr/bin/ipcs
. Proverite sa: ipcs -a
Ako sistemski poziv unshare
nije zabranjen, možete povratiti sve sposobnosti pokretanjem:
Druga tehnika objašnjena u postu https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ ukazuje na to kako možete zloupotrebiti bind mount-ove sa korisničkim imenskim prostorima, da utičete na datoteke unutar host-a (u tom specifičnom slučaju, obrišete datoteke).
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane od strane najnaprednijih alata zajednice. Pribavite pristup danas:
U slučaju da možete izvršiti docker exec
kao root (verovatno sa sudo), pokušajte da eskalirate privilegije bežeći iz kontejnera zloupotrebljavajući CVE-2019-5736 (exploit ovde). Ova tehnika će u osnovi prepisati /bin/sh binarni fajl host-a iz kontejnera, tako da svako ko izvršava docker exec može aktivirati payload.
Promenite payload u skladu sa tim i izgradite main.go sa go build main.go
. Rezultantni binarni fajl treba da bude smešten u docker kontejner za izvršavanje.
Po izvršavanju, čim prikaže [+] Overwritten /bin/sh successfully
potrebno je izvršiti sledeće sa host mašine:
docker exec -it <container-name> /bin/sh
Ovo će aktivirati payload koji je prisutan u main.go datoteci.
Za više informacija: https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html
Postoje i drugi CVE-ovi na koje kontejner može biti ranjiv, možete pronaći listu na https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list
Imenski prostori: Proces bi trebao biti potpuno odvojen od drugih procesa putem imenskih prostora, tako da ne možemo pobjeći interagujući sa drugim procesima zbog imenskih prostora (po defaultu ne mogu komunicirati putem IPC-a, unix soketa, mrežnih usluga, D-Bus-a, /proc
drugih procesa).
Root korisnik: Po defaultu, korisnik koji pokreće proces je root korisnik (međutim, njegove privilegije su ograničene).
Kapaciteti: Docker ostavlja sledeće kapacitete: 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: Ovo su syscalls koje root korisnik neće moći da pozove (zbog nedostatka kapaciteta + Seccomp). Ostali syscalls mogu se koristiti da pokušate da pobegnete.
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)