
C-basierter PoC für CVE-2019-5736
Dieses Repository enthält einen in C geschriebenen Proof-of-Concept-Exploit für CVE-2019-5736.
Diese Schwachstelle ermöglicht es einem bösartigen Docker-Container, die runc-Binärdatei des Hosts zu überschreiben und beliebige Befehle auf dem Host mit Root-Rechten auszuführen – wodurch das Hostsystem vollständig kompromittiert wird.
Inspiriert vom ursprünglichen Go-basierten PoC von Frichetten
Dieser Code dient nur zu Bildungszwecken. Führe ihn nicht auf einem System aus, das dir nicht gehört oder für das du keine Testberechtigung hast. Missbrauch kann rechtliche Konsequenzen haben.
.
├── docker/
│ └── Dockerfile
├── lib/
│ └── exploit.h
├── scripts/
│ ├── build_docker.sh
│ ├── purge_docker_installation.sh
│ ├── setup_env.sh
│ ├── start_docker.sh
│ └── trigger_exploit.sh
├── src/
│ ├── exploit.c
│ └── main.c
├── LICENSE
├── Makefile
└── README.md
Dieser Exploit wurde auf Folgendem getestet:
sudo ./scripts/install_dependencies.sh
Hinweis: Diesen Schritt kannst du bedenkenlos überspringen, wenn du
wgetundbuild-essentialbereits installiert hast.
sudo ./scripts/setup_env.sh
Dieses Skript installiert Docker ohne systemd oder Socket-Aktivierung. Es ist ideal für VM-Labore.
sudo dockerd
Hinweis: Du benötigst ein zweites Terminal, um dies im Hintergrund auszuführen.
sudo ./scripts/build_docker.sh
Dieses Skript kompiliert den Exploit und erstellt ein Docker-Image mit der Binärdatei darin.
Hinweis: Du kannst die Exploit-Binärdatei auch manuell erstellen, indem du
makeausführst.
Du kannst Docker vollständig entfernen und das System in den Zustand vor der Installation zurückversetzen:
sudo ./scripts/purge_docker_installation.sh
Zuerst starten wir unseren Exploit-Container. Du kannst entweder diesen Befehl verwenden:
sudo docker run -it --name exp --rm runc_exploit
oder das beiliegende Shell-Skript:
sudo ./scripts/start_docker.sh
Innerhalb des Containers können wir nun unsere Exploit-Binärdatei starten:
./exploit -c "$COMAND"
Die Binärdatei akzeptiert drei Argumente:
-hgibt die Verwendungsmeldung aus und-cdefiniert den Payload als Befehlszeichenfolge, den wir auf dem Host ausführen möchten. Das letzte Argument-dschaltet Debug-Ausgaben während der Ausführung um (z. B. das Parsen von Informationen aus/proc).
Hinweis: Wenn das Argument
-cnicht angegeben wird, führt der Exploitcp /etc/shadow > /tmp/pwned && chmod 644 /tmp/pwnedaus.
Der Exploit wartet nun auf einen eingehenden runc-Prozess auf dem Host. Führe aus:
sudo ./scripts/trigger_exploit.sh
Dieses Skript öffnet einen neuen Prozess innerhalb des Containers, der bin/sh ausführt, und löst dadurch den Exploit aus.
Hinweis: Du könntest den Exploit auch auslösen, indem du
docker execmanuell auf dem Host ausführst, aber das Timing ist für die aktuelle PoC-Version entscheidend. Daher kann es ein paar Versuche dauern...
Wenn runc erfolgreich ausgenutzt wurde, solltest du eine ähnliche Ausgabe sehen:

Wir können nun unsere pwned Shadow-Datei öffnen:
