Docker Breakout / Privilege Escalation
Naučite i vežbajte hakovanje AWS-a:HackTricks Obuka AWS Crveni Tim Ekspert (ARTE)
Naučite i vežbajte hakovanje GCP-a:
HackTricks Obuka GCP Crveni Tim Ekspert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-78abb7891633b1e8147b4e743e4f00af375d3cd6%252Fimage%2520%2848%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5a848438&sv=1)
Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice na svetu. Dobijte pristup danas:
Automatsko Nabrojavanje i Bekstvo
linpeas: Može takođe nabrojati kontejnere
CDK: Ovaj alat je prilično koristan za nabrojavanje kontejnera u kojem se nalazite, pa čak i za automatsko bekstvo
amicontained: Koristan alat za dobijanje privilegija koje kontejner ima kako biste pronašli načine za bekstvo iz njega
deepce: Alat za nabrojavanje i bekstvo iz kontejnera
grype: Dobijte CVE-ove koji se nalaze u softveru instaliranom na slici
Bekstvo Montiranog Docker Socketa
Ako na neki način otkrijete da je docker socket montiran unutar docker kontejnera, moći ćete da pobegnete iz njega. Ovo se obično dešava u docker kontejnerima koji iz nekog razloga moraju da se povežu sa docker daemonom kako bi obavili akcije.
U ovom slučaju možete koristiti redovne docker komande za komunikaciju sa docker daemon-om:
U slučaju da je docker socket na neočekivanom mestu i dalje možete komunicirati s njim koristeći docker
komandu sa parametrom -H unix:///putanja/do/docker.sock
Docker daemon takođe može slušati na portu (podrazumevano 2375, 2376) ili na Systemd baziranim sistemima, komunikacija sa Docker daemonom može se odvijati preko Systemd socketa fd://
.
Dodatno, obratite pažnju na runtime sockete drugih visokonivnih runtime-ova:
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
...
Zloupotreba sposobnosti za bekstvo
Treba da proverite sposobnosti kontejnera, ako ima bilo koju 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 da biste pobegli/escalirali privilegije:
Linux CapabilitiesBekstvo iz privilegovanih kontejnera
Privilegovani kontejner može biti kreiran sa zastavicom --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
Zastavica --privileged
značajno smanjuje sigurnost kontejnera, nudeći neograničen pristup uređajima i zaobilazeći nekoliko zaštita. Za detaljniji pregled, pogledajte dokumentaciju o punim uticajima --privileged
.
Privilegovani + hostPID
Sa ovim dozvolama možete jednostavno preći u namespace procesa koji se izvršava na hostu kao root kao što je init (pid:1) samo pokretanjem: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
Testirajte to u kontejneru izvršavanjem:
Privilegovan
Samo sa privilegovanom zastavicom možete pokušati pristupiti disku domaćina ili pokušati pobegnuti zloupotrebom release_agent ili drugih bekstava.
Testirajte sledeće obilaske u kontejneru izvršavanjem:
Montiranje diska - Poc1
Dobro konfigurisani Docker kontejneri neće dozvoliti komandu poput fdisk -l. Međutim, na loše konfigurisanom Docker kontejneru gde je specificiran flag --privileged
ili --device=/dev/sda1
sa privilegijama, moguće je dobiti privilegije da se vidi host drajv.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fbestestredteam.com%2Fcontent%2Fimages%2F2019%2F08%2Fimage-16.png&width=768&dpr=4&quality=100&sign=45b35987&sv=1)
Dakle, preuzeti kontrolu nad host mašinom je trivijalno:
I eto! Sada možete pristupiti fajl sistemu domaćina jer je montiran u fascikli /mnt/hola
.
Montiranje diska - Poc2
Unutar kontejnera, napadač može pokušati da dobije dalji pristup osnovnom host OS putem hostPath zapisa koji je kreiran od strane klastera. U nastavku su neke uobičajene stvari koje možete proveriti unutar kontejnera da biste videli da li možete iskoristiti ovaj vektor napadača:
Privilegovano bežanje zloupotrebom postojećeg release_agent (cve-2022-0492) - PoC1
Privilegovano bekstvo zloupotrebom kreiranog release_agent-a (cve-2022-0492) - PoC2
Pronađite objašnjenje tehnike u:
Docker release_agent cgroups escapePrivilegovano bežanje zloupotrebom release_agent-a bez poznavanja relativne putanje - PoC3
U prethodnim eksploatacijama je otkrivena apsolutna putanja kontejnera unutar datotečnog sistema domaćina. Međutim, to nije uvek slučaj. U situacijama kada ne znate apsolutnu putanju kontejnera unutar domaćina možete koristiti ovu tehniku:
release_agent exploit - Relative Paths to PIDsIzvršavanje PoC-a unutar privilegovanog kontejnera trebalo bi da pruži izlaz sličan:
Zloupotreba privilegija kroz osetljive montaže
Postoje nekoliko datoteka koje mogu biti montirane koje pružaju informacije o osnovnom hostu. Neke od njih čak mogu ukazivati na nešto što će biti izvršeno od strane hosta kada se nešto desi (što će omogućiti napadaču da pobegne iz kontejnera). Zloupotreba ovih datoteka može omogućiti da:
release_agent (već obrađeno ranije)
Međutim, možete pronaći druge osetljive datoteke za proveru na ovoj stranici:
Sensitive MountsProizvoljne montaže
U nekoliko prilika ćete primetiti da je kontejner montirao neki volumen sa hosta. Ako ovaj volumen nije pravilno konfigurisan, možda ćete moći da pristupite/izmenite osetljive podatke: Čitanje tajni, menjanje ssh authorized_keys…
Eskalacija privilegija sa 2 školjke i host montažom
Ako imate pristup kao root unutar kontejnera koji ima neki folder sa hosta montiran i uspeli ste kao neprivilegovani korisnik da pobegnete na host i imate pristup za čitanje nad montiranim folderom. Možete kreirati bash suid fajl u montiranom folderu unutar kontejnera i izvršiti ga sa hosta radi eskalacije privilegija.
Eskalacija privilegija sa 2 školjke
Ako imate pristup kao root unutar kontejnera i uspeli ste kao neprivilegovani korisnik da pobegnete na host, možete zloupotrebiti obe školjke da biste eskaliirali privilegije unutar hosta ako imate mogućnost MKNOD unutar kontejnera (to je podrazumevano) kao što je objašnjeno u ovom postu. Sa takvom mogućnošću, korisnik root unutar kontejnera može kreirati blok uređajne datoteke. Uređajne datoteke su posebne datoteke koje se koriste za pristupanje osnovnom hardveru i jezgrovim modulima. Na primer, blok uređajna datoteka /dev/sda omogućava pristup čitanju sirovih podataka na sistemskom disku.
Docker štiti od zloupotrebe blok uređajnih datoteka unutar kontejnera sprovođenjem cgroup politike koja blokira operacije čitanja/pisanja blok uređajnih datoteka. Ipak, ako se blok uređajna datoteka kreira unutar kontejnera, postaje dostupna spoljašnjem svetu putem direktorijuma /proc/PID/root/. Za ovaj pristup je potrebno da vlasnik procesa bude isti i unutar i izvan kontejnera.
Primer eksploatacije iz ovog izveštaja:
hostPID
Ako možete pristupiti procesima domaćina, bićete u mogućnosti da pristupite mnogim osetljivim informacijama koje se čuvaju u tim procesima. Pokrenite test laboratoriju:
Na primer, bićete u mogućnosti da izlistate procese koristeći nešto poput ps auxn
i tražite osetljive detalje u komandama.
Zatim, kako možete pristupiti svakom procesu domaćina u /proc/ možete jednostavno ukrasti njihove tajne okoline pokretanjem:
Takođe možete pristupiti fajl deskriptorima drugih procesa i pročitati njihove otvorene fajlove:
Možete takođe ubiti procese i izazvati DoS.
Ako na neki način imate privilegovan pristup procesu van kontejnera, možete pokrenuti nešto poput nsenter --target <pid> --all
ili nsenter --target <pid> --mount --net --pid --cgroup
da pokrenete shell sa istim ns ograničenjima (nadam se nijednim) kao taj proces.
hostNetwork
Ako je kontejner konfigurisan sa Docker host mrežnim drajverom (--network=host
), mrežni skup tog kontejnera nije izolovan od Docker hosta (kontejner deli mrežni prostor hosta), i kontejner ne dobija dodeljenu svoju IP adresu. Drugim rečima, kontejner povezuje sve usluge direktno na IP hosta. Osim toga, kontejner može interceptovati SAV mrežni saobraćaj koji host šalje i prima na deljenom interfejsu tcpdump -i eth0
.
Na primer, možete koristiti ovo da snifujete čak i lažirate saobraćaj između hosta i instance metapodataka.
Kao u sledećim primerima:
Takođe ćete moći da pristupite mrežnim uslugama povezanim na localhost unutar hosta ili čak pristupite dozvolama metapodataka čvora (koje mogu biti različite od onih do kojih kontejner može da pristupi).
hostIPC
Sa hostIPC=true
, dobijate pristup resursima međuprocesne komunikacije (IPC) domaćina, poput deljene memorije u /dev/shm
. Ovo omogućava čitanje/pisanje gde se isti IPC resursi koriste od strane drugih procesa domaćina ili podova. Koristite ipcs
da biste detaljnije pregledali ove IPC mehanizme.
Pregledajte /dev/shm - Potražite datoteke na ovom mestu deljene memorije:
ls -la /dev/shm
Pregled postojećih IPC objekata - Možete proveriti da li se koriste neki IPC objekti pomoću
/usr/bin/ipcs
. Proverite sa:ipcs -a
Vraćanje sposobnosti
Ako syscall unshare
nije zabranjen, možete povratiti sve sposobnosti pokretanjem:
Zloupotreba korisničkog prostora putem simboličkih veza
Druga tehnika objašnjena u postu https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ pokazuje kako možete zloupotrebiti bind montaže sa korisničkim prostorima, da biste uticali na datoteke unutar domaćina (u tom specifičnom slučaju, brisanje datoteka).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-78abb7891633b1e8147b4e743e4f00af375d3cd6%252Fimage%2520%2848%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5a848438&sv=1)
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:
CVE-ovi
Runc eksploatacija (CVE-2019-5736)
U slučaju da možete izvršiti docker exec
kao root (verovatno sa sudo), možete pokušati da eskalirate privilegije bežeći iz kontejnera zloupotrebom CVE-2019-5736 (eksploatacija ovde). Ova tehnika će u osnovi prepisati binarni fajl /bin/sh domaćina iz kontejnera, tako da bilo ko ko izvrši docker exec može pokrenuti payload.
Promenite payload prema potrebi i izgradite main.go sa go build main.go
. Rezultujući binarni fajl treba da bude smešten u docker kontejner radi izvršenja.
Prilikom izvršenja, čim prikaže [+] Overwritten /bin/sh successfully
treba da izvršite sledeće sa host mašine:
docker exec -it <ime-kontejnera> /bin/sh
Ovo će pokrenuti payload koji se nalazi u fajlu main.go.
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
Prilagođeno bekstvo iz Docker-a
Površina bekstva iz Docker-a
Prostori imena: Proces bi trebalo da bude potpuno odvojen od drugih procesa putem prostora imena, tako da ne možemo pobeći interakcijom sa drugim procesima zbog prostora imena (podrazumevano ne može komunicirati putem IPC-a, unix soketa, mrežnih servisa, D-Bus-a,
/proc
drugih procesa).Root korisnik: Podrazumevano, korisnik koji pokreće proces je root korisnik (međutim, njegove privilegije su ograničene).
Ovlašćenja: Docker ostavlja sledeća ovlašćenja:
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
Sistemski pozivi: Ovo su sistemski pozivi koje root korisnik neće moći da pozove (zbog nedostatka ovlašćenja + Seccomp). Ostali sistemski pozivi mogu se koristiti za pokušaj bekstva.
Docker Breakout Privilege Escalation
Overview
Docker is a popular platform for containerization, but misconfigurations can lead to privilege escalation attacks. Attackers can break out of a Docker container to gain access to the host system and potentially compromise the entire infrastructure.
Techniques
Mounting Host Directories: Attackers can mount host directories to access sensitive files on the host system.
Docker Socket: By mounting the Docker socket, attackers can interact with the Docker daemon and potentially gain root access to the host.
Volume Mounts: Insecure volume mounts can allow attackers to read/write sensitive files on the host system.
Mitigation
To prevent Docker breakout privilege escalation:
Avoid running containers with unnecessary privileges.
Use read-only file systems where possible.
Limit the use of volume mounts and restrict access to sensitive host directories.
Monitor Docker activity for suspicious behavior.
By following these best practices, you can reduce the risk of Docker breakout attacks and enhance the security of your containerized environment.
Docker Breakout Privilege Escalation
Ovo je tehnika eskalacije privilegija koja se može koristiti za izbijanje iz Docker kontejnera i dobijanje pristupa host sistemu.
Kako funkcioniše
Ova tehnika koristi ptrace
sistemski poziv kako bi se pratio proces inicijalnog init
procesa unutar Docker kontejnera. Zatim se koristi PTRACE_SETOPTIONS
kako bi se omogućilo PTRACE_O_TRACECLONE
praćenje kloniranih procesa. Kada se detektuje klonirani proces, koristi se PTRACE_ATTACH
kako bi se pratio i kontrolisao klonirani proces. Konačno, kada se klonirani proces završi, koristi se PTRACE_DETACH
kako bi se prekinulo praćenje.
Kako se zaštititi
Da biste se zaštitili od ove vrste napada, preporučuje se da redovno ažurirate Docker i pratite najbolje prakse za bezbednost Docker kontejnera. Takođe je važno ograničiti privilegije kontejnera i pratiti i ograničiti sistemski poziv ptrace
unutar kontejnera.
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
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F3850298721-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fs712eRnz5qRNRafWqq3N%252Fuploads%252Fgit-blob-78abb7891633b1e8147b4e743e4f00af375d3cd6%252Fimage%2520%2848%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5a848438&sv=1)
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)
Last updated