跳到主要内容

HackMyVM Rooted 通关记录|MiniUPnPd 信息泄露与 CopyFail 内核提权

靶机链接:Rooted


0x01 基本信息

名称IP说明
Kali Linux192.168.1.109攻击机
Rooted192.168.1.120靶机(MiniUPnPd 绑定 enp0s8)

攻击流程

点击展开

攻击链摘要

阶段关键证据作用
服务发现22/tcp SSH、8888/tcp MiniUPnPd 2.3.9(nmap 外部指纹;盒内 ss 确认绑定 enp0s8)明确攻击面在 UPnP 信息泄露与 SSH
凭据泄露rootDesc.xmlfriendlyName = 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/tcpopenSSHOpenSSH 10.0p2 Debian 7+deb13u2
8888/tcpopenHTTP / UPnPMiniUPnPd 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! 为密码。

用户名密码
upnpnat123!

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 利用,而在两点“公开即凭据”的设计:

  1. MiniUPnPd 的 rootDesc.xml 把 SSH 用户名/密码直接写进 friendlyNameupnp:nat123!),扫描到 8888/tcp 后做 UPnP 元数据枚举即可拿到初始访问。
  2. 内核 6.12.74 落入 CVE-2026-31431(CopyFail)受影响区间,利用 AF_ALG + authencesn + splice() 的页缓存写入原语,把 /usr/bin/su 头部覆写成 setuid /bin/sh shellcode,执行 su 即提权。

经验提示:

  • 面对 tcpwrapped 且时通时断的端口,不要只做目录爆破,应识别其后真实服务(UPnP/SSDP)并枚举协议元数据。
  • 内核本地提权首先要做的是版本区间比对6.12.74 < 修复版本 6.12.85 这一条就足以锁定利用方向。
  • CopyFail 写入仅作用于页缓存,破坏性低、可逆,是验证内核 LPE 原语的干净样本;部署前务必在授权目标上操作,并及时更新内核。

参考利用:theori-io 原始 PoC(CVE-2026-31431)、beatbeast007 的 C 移植版本。


附件下载

为了方便复现,本文涉及的利用源码已整理到站点静态目录:

文件说明
cexp.cCopyFail (CVE-2026-31431) AF_ALG + splice 页缓存覆盖提权 C 源码