Docker Breakout / Privilege Escalation
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice. 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 bi se pronašao način za bekstvo iz njega
deepce: Alat za nabrojavanje i bekstvo iz kontejnera
grype: Dobijanje CVE-ova 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 biti aktiviran na portu (podrazumevano 2375, 2376) ili na Systemd baziranim sistemima, komunikacija sa Docker daemonom može se ostvariti preko Systemd socketa fd://
.
Dodatno, obratite pažnju na runtime socketa 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 proveriti 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
Trenutne sposobnosti kontejnera možete proveriti 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/povećali privilegije:
pageLinux 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 detaljniju analizu, 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:
Privilegovani
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 konfigurisanoj Docker komandi gde je specificiran flag --privileged
ili --device=/dev/sda1
sa privilegijama, moguće je dobiti privilegije za pregled host drajva.
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 bežanje zloupotrebom kreiranog release_agent (cve-2022-0492) - PoC2
Pronađite objašnjenje tehnike u:
pageDocker release_agent cgroups escapePrivilegovano bežanje zloupotrebom release_agent-a bez poznavanja relativne putanje - PoC3
U prethodnim eksploatacijama otkrivena je 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:
pagerelease_agent exploit - Relative Paths to PIDsIzvršavanje PoC-a unutar privilegovanog kontejnera trebalo bi da pruži izlaz sličan:
Privilegovano bežanje zloupotrebom osetljivih montaža
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:
pageSensitive 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 ljuske
Ako imate pristup kao root unutar kontejnera i uspeli ste kao neprivilegovani korisnik da pobegnete na host, možete zloupotrebiti obe ljuske 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 ima dozvolu da kreira 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 sistemu diska.
Docker štiti od zloupotrebe blok uređajnih datoteka unutar kontejnera sprovođenjem cgroup politike koja blokira operacije čitanja/pisanja blok uređajnih datoteka. Međutim, 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, pošto 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 da nema) 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 sa
/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).
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 mašine domaćina:
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 usluga, 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
Docker Breakout Privilege Escalation
Docker containers are not as secure as they seem. Attackers can exploit vulnerabilities in Docker to escalate privileges and break out of the container. Here are some common techniques used for Docker breakout privilege escalation:
Mounting the host's root filesystem: Attackers can mount the host's root filesystem into the container, allowing them to access sensitive host system files.
Exploiting Docker daemon: Attackers can exploit vulnerabilities in the Docker daemon to gain root access to the host system.
Abusing Docker API: Attackers can abuse the Docker API to run commands on the host system, leading to privilege escalation.
To prevent Docker breakout privilege escalation, follow these best practices:
Use minimal base images: Start with minimal base images to reduce the attack surface.
Limit container capabilities: Restrict the capabilities assigned to containers to limit their actions.
Monitor Docker daemon: Regularly monitor the Docker daemon for unusual activities.
Enable Docker Content Trust: Enable Docker Content Trust to verify the integrity of the images.
By following these best practices, you can enhance the security of your Docker containers and reduce the risk of privilege escalation.
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
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Last updated