Docker Breakout / Privilege Escalation
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Verwende Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden. Erhalte heute Zugang:
linpeas: Es kann auch Container auflisten
CDK: Dieses Tool ist ziemlich nützlich, um den Container, in dem du dich befindest, aufzulisten und sogar zu versuchen, automatisch zu entkommen
amicontained: Nützliches Tool, um die Berechtigungen des Containers zu erhalten, um Wege zu finden, daraus zu entkommen
deepce: Tool zur Auflistung und zum Entkommen aus Containern
grype: Erhalte die CVEs, die in der Software enthalten sind, die im Image installiert ist
Wenn du irgendwie feststellst, dass der Docker-Socket innerhalb des Docker-Containers gemountet ist, wirst du in der Lage sein, daraus zu entkommen. Dies geschieht normalerweise in Docker-Containern, die aus irgendeinem Grund eine Verbindung zum Docker-Daemon herstellen müssen, um Aktionen auszuführen.
In diesem Fall können Sie reguläre Docker-Befehle verwenden, um mit dem Docker-Daemon zu kommunizieren:
Falls der Docker-Socket an einem unerwarteten Ort ist, können Sie trotzdem mit ihm kommunizieren, indem Sie den docker
Befehl mit dem Parameter -H unix:///path/to/docker.sock
verwenden.
Der Docker-Daemon könnte auch an einem Port (standardmäßig 2375, 2376) lauschen oder auf Systemd-basierten Systemen kann die Kommunikation mit dem Docker-Daemon über den Systemd-Socket fd://
erfolgen.
Achten Sie außerdem auf die Laufzeitsockets anderer hochrangiger Laufzeiten:
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
...
Sie sollten die Berechtigungen des Containers überprüfen. Wenn er eine der folgenden Berechtigungen hat, könnten Sie möglicherweise entkommen: 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
Sie können die aktuellen Container-Berechtigungen mit den zuvor erwähnten automatischen Tools oder:
In der folgenden Seite können Sie mehr über Linux-Fähigkeiten erfahren und wie man sie missbrauchen kann, um Privilegien zu entkommen/eskalieren:
Linux CapabilitiesEin privilegierter Container kann mit dem Flag --privileged
oder durch Deaktivierung spezifischer Abwehrmaßnahmen erstellt werden:
--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
Das Flag --privileged
senkt die Sicherheit des Containers erheblich und bietet uneingeschränkten Gerätezugriff und umgeht mehrere Schutzmaßnahmen. Für eine detaillierte Aufschlüsselung siehe die Dokumentation zu den vollständigen Auswirkungen von --privileged
.
Mit diesen Berechtigungen können Sie einfach in den Namensraum eines Prozesses wechseln, der als Root auf dem Host läuft, wie init (pid:1), indem Sie einfach ausführen: nsenter --target 1 --mount --uts --ipc --net --pid -- bash
Testen Sie es in einem Container, indem Sie ausführen:
Nur mit dem privilegierten Flag kannst du versuchen, auf die Festplatte des Hosts zuzugreifen oder versuchen, durch Missbrauch von release_agent oder anderen Ausbrüchen zu entkommen.
Teste die folgenden Umgehungen in einem Container, indem du ausführst:
Gut konfigurierte Docker-Container erlauben keine Befehle wie fdisk -l. Bei falsch konfigurierten Docker-Befehlen, bei denen das Flag --privileged
oder --device=/dev/sda1
mit Großbuchstaben angegeben ist, ist es möglich, die Berechtigungen zu erhalten, um das Host-Laufwerk zu sehen.
Um die Host-Maschine zu übernehmen, ist es trivial:
Und voilà ! Sie können jetzt auf das Dateisystem des Hosts zugreifen, da es im Ordner /mnt/hola
gemountet ist.
Innerhalb des Containers kann ein Angreifer versuchen, weiteren Zugriff auf das zugrunde liegende Host-OS über ein beschreibbares hostPath-Volume zu erhalten, das vom Cluster erstellt wurde. Im Folgenden sind einige gängige Dinge aufgeführt, die Sie innerhalb des Containers überprüfen können, um zu sehen, ob Sie diesen Angreifer-Vektor nutzen können:
Finden Sie eine Erklärung der Technik in:
Docker release_agent cgroups escapeIn den vorherigen Exploits wird der absolute Pfad des Containers im Dateisystem des Hosts offengelegt. Dies ist jedoch nicht immer der Fall. In Fällen, in denen Sie den absoluten Pfad des Containers im Host nicht kennen, können Sie diese Technik verwenden:
release_agent exploit - Relative Paths to PIDsDie Ausführung des PoC innerhalb eines privilegierten Containers sollte eine ähnliche Ausgabe wie folgt liefern:
Es gibt mehrere Dateien, die möglicherweise gemountet sind und Informationen über den zugrunde liegenden Host geben. Einige von ihnen können sogar etwas anzeigen, das vom Host ausgeführt werden soll, wenn etwas passiert (was einem Angreifer ermöglicht, aus dem Container auszubrechen). Der Missbrauch dieser Dateien kann Folgendes ermöglichen:
release_agent (bereits zuvor behandelt)
Sie können jedoch andere sensible Dateien auf dieser Seite überprüfen:
Sensitive MountsIn mehreren Fällen werden Sie feststellen, dass der Container ein Volume vom Host gemountet hat. Wenn dieses Volume nicht korrekt konfiguriert ist, könnten Sie in der Lage sein, sensible Daten zuzugreifen/zu ändern: Geheimnisse lesen, ssh authorized_keys ändern…
Wenn Sie als root innerhalb eines Containers Zugriff haben, der einen Ordner vom Host gemountet hat, und Sie als nicht privilegierter Benutzer zum Host entkommen sind und Lesezugriff auf den gemounteten Ordner haben. Sie können eine bash suid-Datei im gemounteten Ordner innerhalb des Containers erstellen und von dem Host aus ausführen, um die Privilegien zu eskalieren.
Wenn Sie als root innerhalb eines Containers Zugriff haben und als nicht privilegierter Benutzer zum Host entkommen sind, können Sie beide Shells missbrauchen, um Privesc innerhalb des Hosts durchzuführen, wenn Sie die Fähigkeit MKNOD innerhalb des Containers haben (standardmäßig vorhanden), wie in diesem Beitrag erklärt. Mit dieser Fähigkeit darf der Root-Benutzer innerhalb des Containers Blockgerätedateien erstellen. Gerätedateien sind spezielle Dateien, die verwendet werden, um auf die zugrunde liegende Hardware & Kernel-Module zuzugreifen. Zum Beispiel gewährt die Blockgerätedatei /dev/sda Zugriff auf das Rohdatenlesen auf der Systemfestplatte.
Docker schützt vor dem Missbrauch von Blockgeräten innerhalb von Containern, indem eine cgroup-Richtlinie durchgesetzt wird, die Blockgerätelese-/schreiboperationen blockiert. Dennoch, wenn ein Blockgerät innerhalb des Containers erstellt wird, wird es über das Verzeichnis /proc/PID/root/ von außerhalb des Containers zugänglich. Dieser Zugriff erfordert, dass der Prozessbesitzer sowohl innerhalb als auch außerhalb des Containers derselbe ist.
Exploitation Beispiel aus diesem Writeup:
Wenn Sie auf die Prozesse des Hosts zugreifen können, werden Sie in der Lage sein, viele sensible Informationen, die in diesen Prozessen gespeichert sind, abzurufen. Führen Sie das Testlabor aus:
Zum Beispiel können Sie die Prozesse mit etwas wie ps auxn
auflisten und nach sensiblen Details in den Befehlen suchen.
Dann, da Sie auf jeden Prozess des Hosts in /proc/ zugreifen können, können Sie einfach ihre Umgebungsgeheimnisse stehlen mit:
Du kannst auch auf die Dateideskriptoren anderer Prozesse zugreifen und deren geöffnete Dateien lesen:
Du kannst auch Prozesse beenden und einen DoS verursachen.
Wenn du irgendwie privilegierten Zugriff auf einen Prozess außerhalb des Containers hast, könntest du etwas wie nsenter --target <pid> --all
oder nsenter --target <pid> --mount --net --pid --cgroup
ausführen, um eine Shell mit den gleichen ns-Einschränkungen (hoffentlich keine) wie dieser Prozess zu starten.
Wenn ein Container mit dem Docker Host-Netzwerk-Driver (--network=host
) konfiguriert wurde, ist der Netzwerk-Stack dieses Containers nicht vom Docker-Host isoliert (der Container teilt sich den Netzwerk-Namespace des Hosts), und der Container erhält keine eigene IP-Adresse. Mit anderen Worten, der Container bindet alle Dienste direkt an die IP des Hosts. Darüber hinaus kann der Container ALLE Netzwerkverkehr, den der Host sendet und empfängt, auf der gemeinsamen Schnittstelle tcpdump -i eth0
abfangen.
Zum Beispiel können Sie dies verwenden, um Verkehr zwischen Host und Metadateninstanz abzuhören und sogar zu fälschen.
Wie in den folgenden Beispielen:
Sie werden auch in der Lage sein, Netzwerkdienste, die an localhost gebunden sind, innerhalb des Hosts zuzugreifen oder sogar die Metadatenberechtigungen des Knotens (die möglicherweise von denen abweichen, auf die ein Container zugreifen kann) zuzugreifen.
Mit hostIPC=true
erhalten Sie Zugriff auf die interprozessuale Kommunikation (IPC) Ressourcen des Hosts, wie z.B. gemeinsamen Speicher in /dev/shm
. Dies ermöglicht das Lesen/Schreiben, wo dieselben IPC-Ressourcen von anderen Host- oder Pod-Prozessen verwendet werden. Verwenden Sie ipcs
, um diese IPC-Mechanismen weiter zu inspizieren.
Untersuchen Sie /dev/shm - Suchen Sie nach Dateien in diesem gemeinsamen Speicherort: ls -la /dev/shm
Überprüfen Sie vorhandene IPC-Einrichtungen – Sie können überprüfen, ob IPC-Einrichtungen verwendet werden, mit /usr/bin/ipcs
. Überprüfen Sie es mit: ipcs -a
Wenn der Syscall unshare
nicht verboten ist, können Sie alle Fähigkeiten wiederherstellen, indem Sie:
Die zweite Technik, die im Beitrag https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ erklärt wird, zeigt, wie man Bind-Mounts mit Benutzer-Namensräumen missbrauchen kann, um Dateien im Host zu beeinflussen (in diesem speziellen Fall, um Dateien zu löschen).
Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden. Zugang heute erhalten:
Falls Sie docker exec
als root ausführen können (wahrscheinlich mit sudo), versuchen Sie, die Privilegien zu eskalieren, indem Sie aus einem Container unter Ausnutzung von CVE-2019-5736 entkommen (Exploit hier). Diese Technik wird im Wesentlichen die /bin/sh Binärdatei des Hosts aus einem Container überschreiben, sodass jeder, der docker exec ausführt, die Payload auslösen kann.
Ändern Sie die Payload entsprechend und bauen Sie die main.go mit go build main.go
. Die resultierende Binärdatei sollte im Docker-Container zur Ausführung platziert werden.
Bei der Ausführung, sobald es [+] Overwritten /bin/sh successfully
anzeigt, müssen Sie Folgendes von der Host-Maschine aus ausführen:
docker exec -it <container-name> /bin/sh
Dies wird die Payload auslösen, die in der main.go-Datei vorhanden ist.
Für weitere Informationen: https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html
Es gibt andere CVEs, für die der Container anfällig sein kann. Eine Liste finden Sie unter https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list
Namespaces: Der Prozess sollte vollständig von anderen Prozessen über Namespaces getrennt sein, sodass wir nicht mit anderen Prozessen interagieren können, aufgrund von Namespaces (standardmäßig kann nicht über IPCs, Unix-Sockets, Netzwerkdienste, D-Bus, /proc
anderer Prozesse kommuniziert werden).
Root-Benutzer: Standardmäßig ist der Benutzer, der den Prozess ausführt, der Root-Benutzer (seine Berechtigungen sind jedoch eingeschränkt).
Fähigkeiten: Docker lässt die folgenden Fähigkeiten zu: 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: Dies sind die Syscalls, die der Root-Benutzer nicht aufrufen kann (aufgrund fehlender Fähigkeiten + Seccomp). Die anderen Syscalls könnten verwendet werden, um zu versuchen, zu entkommen.
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)