HackMyVM Rooted 通关记录|MiniUPnPd 信息泄露与 CopyFail 内核提权
靶机链接:Rooted
0x01 基本信息
| 名称 | IP | 说明 |
|---|---|---|
| Kali Linux | 192.168.1.109 | 攻击机 |
| Rooted | 192.168.1.120 | 靶机(MiniUPnPd 绑定 enp0s8) |
攻击流程
点击展开
攻击链摘要
| 阶段 | 关键证据 | 作用 |
|---|---|---|
| 服务发现 | 22/tcp SSH、8888/tcp MiniUPnPd 2.3.9(nmap 外部指纹;盒内 ss 确认绑定 enp0s8) | 明确攻击面在 UPnP 信息泄露与 SSH |
| 凭据泄露 | rootDesc.xml 中 friendlyName = upnp:nat123! | 得到 SSH 用户名 upnp 与密码 nat123! |
| 初始权限 | ssh upnp@192.168.1.120 登录成功 | 拿到 user flag |
| 内核确认 | uname -a 显示 6.12.74+deb13+1-amd64 | 命中 CVE-2026-31431 受影响区间(修复于 6.12.85) |
| Root 提权 | CopyFail 覆盖 /usr/bin/su 页缓存 | 植入 setuid shellcode,执行 su 即获 root shell |
0x02 侦察与信息收集 (Reconnaissance)
1. 全端口扫描 (RustScan + Nmap)
命令:
rustscan -a 192.168.1.120 --ulimit 5000 -- -sV
nmap -sC -sV -p- -T4 -Pn 192.168.1.120
端口扫描策略与自动化配置可参考知识库:端口扫描实战流程:RustScan 与 Nmap。
外部扫描结果(Kali 侧实测):
| 端口 | 状态 | 服务 | 指纹 / 备注 |
|---|---|---|---|
22/tcp | open | SSH | OpenSSH 10.0p2 Debian 7+deb13u2 |
8888/tcp | open | HTTP / UPnP | MiniUPnPd 2.3.9 |
0x03 漏洞探测与分析 (Vulnerability Analysis)
1. MiniUPnPd 根描述信息泄露
MiniUPnPd 绑定在 enp0s8(靶机 ss -ltnp 可见 0.0.0.0%enp0s8:8888),外部请求偶尔会被 reset,重试即可稳定取回。若 enp0s8 落在 host-only 的 192.168.56.x 子网,该地址对 Kali 完全不可路由——此时 8888 会看似“没起”,需检查虚拟机网卡模式。
UPnP 设备的 rootDesc.xml 常把设备名、型号、配置 ID 等写入可读元数据。从 Kali 直接请求即可取回;若偶发连接被 reset,加重试循环即可:
for i in $(seq 1 15); do curl -sS --max-time 3 http://192.168.1.120:8888/rootDesc.xml && break; sleep 1; done
关键发现:
friendlyName = upnp:nat123!
modelNumber = 20250509 # 来自 WANDevice/WANConnectionDevice(顶层设备为 1)
configId = 1337
friendlyName 采用 user:password 的命名约定:upnp: 前缀即用户名,nat123! 为密码。
| 用户名 | 密码 |
|---|---|
upnp | nat123! |
2. SSH 初始访问
使用泄露凭据登录:
ssh upnp@192.168.1.120
登录成功后读取 user flag:
cat ~/user.txt
User Flag:
70f631df929ad442dee6a7b461e3b628ad7856c6c56c63b416c4396c93ac6c96
0x04 核心攻击链:内核版本定位 (Vulnerability Mapping)
确认内核版本,判断是否落入 CVE-2026-31431 的受影响区间:
uname -a
cat /proc/version
输出要点:
Linux rooted 6.12.74+deb13+1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.74-2 (2026-03-08) x86_64 GNU/Linux
该内核 6.12.74 位于受影响区间(修复提交合并进 6.12.85)。漏洞名为 CopyFail(CVE-2026-31431),是一类 Linux 内核 crypto 子系统(algif_aead)逻辑缺陷:未授权的本地用户可借助 AF_ALG + authencesn(hmac(sha256),cbc(aes)) 与 splice(),向任意可读文件的页缓存中精确写入 4 字节受控数据。
关于漏洞的底层机理与深入分析,可参考知识库:CVE-2026-31431 Copy Fail Linux 内核提权。
因为 /usr/bin/su 对所有用户可读,攻击者在内存页缓存里把它的 ELF 头部逐块覆写成一段 setuid shellcode(execve("/bin/sh")),再执行 su 时即获得 root shell。该写入仅作用于页缓存,重启后恢复原始二进制。
0x05 权限提升 (Privilege Escalation)
1. 编译/部署 CopyFail 利用
完整利用源码见文末附件 cexp.c。
主函数把一段 zlib 压缩的 160 字节 setuid shellcode 解压,逐 4 字节调用 exploit_core:后者通过 AF_ALG 建立 authencesn(hmac(sha256),cbc(aes)) 的 AEAD socket,把受控的 4 字节 chunk 放在 AAD 后 4 字节,再用 splice() 将 open("/usr/bin/su", O_RDONLY) 得到的文件描述符对应的页缓存写入该 chunk,覆盖 /usr/bin/su 头部。最后 system("su") 触发被替换的 setuid shell。
更多 Linux 提权检查项与路径,可参考知识库:Linux 提权方法与检查清单。
构建与运行:
利用程序在攻击机(Kali)上编译后通过 SSH 传上去即可;靶机虽有 GCC 但缺 zlib.h,如需直接在靶机编译,可先解出载荷内联进源码、去掉 zlib 依赖:
# 攻击机侧编译
gcc cexp.c -o cexp_fixed -lz -Wall -O2
# 传到靶机一个可写目录(如 /tmp)
scp cexp_fixed upnp@192.168.1.120:/tmp/
# 靶机侧执行(需从有写权限的目录运行,如 /tmp)
ssh upnp@192.168.1.120
cd /tmp
chmod +x ./cexp_fixed
./cexp_fixed </dev/null
被覆盖后的 su 是一个把 -c 参数路径丢弃、直接 execve("/bin/sh") 的 setuid shell,不能用 su -c "..."(会返回空),必须把命令经 stdin 管道喂给它,例如 echo 'cat /root/root.txt' | su。
执行后 /usr/bin/su 的页缓存头部已被 shellcode 替换为一个 setuid 0 的 /bin/sh;磁盘文件与权限位全程不变,仍为 -rwsr-xr-x root root。运行 su 即获得 root 权限:
$ echo 'id' | su
uid=0(root) gid=1000(upnp) groups=1000(upnp),100(users)
利用结束后读取 /root/root.txt 即可;不需要且不影响系统重启,页缓存在重启后自动恢复为原始 su。
0x06 最终成果 (Final Flags)
User Flag
- 路径:
/home/upnp/user.txt - 内容:
70f631df929ad442dee6a7b461e3b628ad7856c6c56c63b416c4396c93ac6c96
Root Flag
- 路径:
/root/root.txt - 内容:
37149263831ce0ea0278305dcb04b680e7b0fcff6133cf2ec8af49b235ea41ba
复盘总结
Rooted 的突破点不在 Web 利用,而在两点“公开即凭据”的设计:
- MiniUPnPd 的
rootDesc.xml把 SSH 用户名/密码直接写进friendlyName(upnp:nat123!),扫描到8888/tcp后做 UPnP 元数据枚举即可拿到初始访问。 - 内核
6.12.74落入 CVE-2026-31431(CopyFail)受影响区间,利用AF_ALG+authencesn+splice()的页缓存写入原语,把/usr/bin/su头部覆写成 setuid/bin/shshellcode,执行su即提权。
经验提示:
- 面对
tcpwrapped且时通时断的端口,不要只做目录爆破,应识别其后真实服务(UPnP/SSDP)并枚举协议元数据。 - 内核本地提权首先要做的是版本区间比对:
6.12.74 < 修复版本 6.12.85这一条就足以锁定利用方向。 - CopyFail 写入仅作用于页缓存,破坏性低、可逆,是验证内核 LPE 原语的干净样本;部署前务必在授权目标上操作,并及时更新内核。
参考利用:theori-io 原始 PoC(CVE-2026-31431)、beatbeast007 的 C 移植版本。
附件下载
为了方便复现,本文涉及的利用源码已整理到站点静态目录:
| 文件 | 说明 |
|---|---|
| cexp.c | CopyFail (CVE-2026-31431) AF_ALG + splice 页缓存覆盖提权 C 源码 |