Docker Breakout / Privilege Escalation
Last updated
Last updated
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)
Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice na svetu. Dobijte pristup danas:
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
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
...
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 CapabilitiesPrivilegovani 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
.
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:
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:
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.
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
.
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:
Pronađite objašnjenje tehnike u:
Docker release_agent cgroups escapeU 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:
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 MountsU 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…
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.
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:
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.
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).
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
Ako syscall 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/ 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).
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:
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
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 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.
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.
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.
Ovo je tehnika eskalacije privilegija koja se može koristiti za izbijanje iz Docker kontejnera i dobijanje pristupa host sistemu.
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.
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.
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)