mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
225 lines
19 KiB
Markdown
225 lines
19 KiB
Markdown
# 打印机渗透测试
|
||
|
||
<details>
|
||
|
||
<summary><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
支持HackTricks的其他方式:
|
||
|
||
* 如果您希望在**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来分享您的黑客技巧。
|
||
|
||
</details>
|
||
|
||
请注意,**大部分与打印机渗透测试相关的内容** 都是从 [**http://hacking-printers.net/**](http://hacking-printers.net) 上可以找到的**庞大而惊人的研究**中获取的。我试图在这里**总结**那些信息,但您总是可以**直接去源头学习更多关于该主题的信息**。
|
||
|
||
## 基础知识
|
||
|
||
下面提供了关于打印机语言封装的示意关系图:
|
||
|
||
![打印机语言的封装](http://hacking-printers.net/wiki/images/thumb/1/1d/Protocols.png/500px-Protocols.png)
|
||
|
||
## 网络打印协议
|
||
|
||
**发送数据**到打印机设备可以通过**USB/并行电缆**或通过**网络**。本wiki关注的是网络打印,但大多数介绍的攻击也可以针对本地打印机执行。有各种特殊的网络打印协议,如Novell的[_NCP_](https://en.wikipedia.org/wiki/NetWare_Core_Protocol)或[_AppleTalk_](https://en.wikipedia.org/wiki/AppleTalk)。在Windows世界中,_SMB/CIFS_ 打印共享变得相当流行。此外,一些设备支持通过通用协议如_FTP_或_HTTP_文件上传进行打印。然而,**网络**打印机直接支持的**最常见的打印协议**是_**LPD**_、_**IPP**_和_**原始端口9100**_打印。**网络打印协议可以直接受到攻击**,例如通过利用打印机LPD守护程序中的缓冲区溢出。然而,在许多攻击场景中,它们只充当**部署恶意打印机语言代码**的**载体/通道**。请注意,**网络打印机通常支持多种协议来‘打印’**文档,这增加了攻击面。
|
||
|
||
### **了解更多关于** [**原始端口9100在这里**](../9100-pjl.md)**。**
|
||
|
||
### **了解更多关于** [**LPD在渗透测试515这里**](../515-pentesting-line-printer-daemon-lpd.md)**。**
|
||
|
||
### **了解更多关于** [**IPP在渗透测试631这里**](../pentesting-631-internet-printing-protocol-ipp.md)**。**
|
||
|
||
## 打印机控制语言
|
||
|
||
作业控制语言管理当前打印作业的设置,如输出托盘。虽然它通常作为打印协议和页面描述语言之间的可选层,但功能可能会重叠。供应商特定的作业控制语言示例包括[CPCA](http://www.undocprint.org/formats/printer_control_languages/cpca)、[XJCL](http://www.undocprint.org/formats/printer_control_languages/xjcl)、[EJL](http://www.undocprint.org/formats/printer_control_languages/ejl)和**PJL**——后者被多种打印机支持,将在下面讨论。此外,**打印机控制和管理语言**旨在**影响**的不仅仅是单个打印作业,而是**设备**作为一个**整体**。定义此任务的通用标准的一种方法是[NPAP](http://www.undocprint.org/formats/printer_control_languages/npap)。然而,它并没有建立自己的地位,只有Lexmark支持。其他打印机制造商则使用SNMP或其**基于PJL的**金属语言**PML**。
|
||
|
||
### PJL
|
||
|
||
打印作业语言(PJL)最初由HP引入,但很快成为打印作业控制的事实标准。'PJL位于其他打印语言之上',可用于更改设置,如纸盘或大小。然而,必须指出的是,**PJL不仅限于当前的打印作业,因为某些设置可以被设为永久**。PJL还可以用来**更改打印机的显示或读/写设备上的文件**。有许多方言,因为供应商倾向于只支持PJL参考中列出的命令子集,并且更喜欢添加专有命令。**PJL还用于设置实际打印数据的文件格式**。在切换到PostScript模式之前,设置纸张大小和副本数量的典型PJL命令如下所示:
|
||
```
|
||
@PJL SET PAPER=A4
|
||
@PJL SET COPIES=10
|
||
@PJL ENTER LANGUAGE=POSTSCRIPT
|
||
```
|
||
在[**关于端口9100 'raw port'的页面**](../9100-pjl.md)中,您可以找到更多关于**如何枚举PJL**的信息。
|
||
|
||
### PML
|
||
|
||
**打印机管理语言**(PML)是一种用于控制**惠普打印机**的专有语言。它基本上**结合了** **SNMP** 和 **PJL** 的功能。尽管没有发布公开可用的文档,但是部分标准通过[LPRng](https://en.wikipedia.org/wiki/LPRng)项目被泄露:**PJL Passthrough to PML and SNMP User’s Guide** 定义了PML为‘一个面向对象的请求-回复打印机管理协议’,并对语法基础进行了介绍。PML嵌入在PJL中,并且**可以用来读取和设置打印机设备上的SNMP值**。如果**防火墙阻止**对**SNMP**服务(161/udp)的访问,这一点尤其**有趣**。下面演示了在打印作业中使用PML检索`hrDeviceDescr`值(OID 1.3.6.1.2.1.25.3.2.1.3,设备的文本描述)的用法:
|
||
```
|
||
> @PJL DMINFO ASCIIHEX="000006030302010301"
|
||
< "8000000603030201030114106870204c617365724a65742034323530
|
||
```
|
||
### UEL
|
||
|
||
通用退出语言(UEL)实际上**并不是一个真正的作业控制‘语言’,而是一个用于终止当前数据流的单一命令**:转义字符(`\x1b`),后跟`%-12345X`。它最初是与HP的PCL一起引入的,并且**被大多数现代激光打印机支持**。‘打印机驱动程序’的一个好做法是在每个打印作业的开始和结束时调用UEL,这样就可以停止/重新开始打印语言的解释,并且每个作业都有自己的独立环境,如下所示:
|
||
```
|
||
\x1b%-12345X
|
||
@PJL SET PAPER=A4
|
||
@PJL ENTER LANGUAGE=PCL
|
||
...
|
||
[PCL datastream]
|
||
...
|
||
\x1b%-12345X
|
||
```
|
||
否则,例如,如果不这样做,PJL设置如纸张媒体大小或在一个打印作业中设置的PostScript定义将会影响下一个作业。**UEL可以方便地将多个作业串联成一个发送到打印机的单个文件/数据流**。这可以用来欺骗**硬件页面计数器**,或者在高级**跨站打印攻击**中切换打印语言。
|
||
|
||
## 页面描述语言
|
||
|
||
**页面描述语言**(PDL)指定了**实际文档的外观**。然而,必须指出的是,一些PDL提供有限的作业控制,因此**页面描述和打印机/作业控制语言之间的明确界限并不总是可能的**。‘打印机驱动程序’的功能是将要**打印**的**文件****翻译**成打印机型号能**理解**的**PDL**。请注意,一些低成本的喷墨打印机根本不支持任何高级页面描述语言。所谓的基于主机或[GDI](https://en.wikipedia.org/wiki/Graphics_Device_Interface#GDI_printers)打印机只接受像[ZJS](http://www.undocprint.org/formats/page_description_languages/zjstream)这样的简单位图数据流,而实际的渲染是由打印机驱动程序完成的。有各种专有的页面描述语言,如Kyocera的[PRESCRIBE](http://www.undocprint.org/formats/page_description_languages/prescribe)、[SPL](http://www.undocprint.org/formats/page_description_languages/spl)、[XES](http://www.undocprint.org/formats/page_description_languages/xes)、[CaPSL](http://www.undocprint.org/formats/page_description_languages/capsl)、[RPCS](http://www.undocprint.org/formats/page_description_languages/rpcs)、[ESC/P](https://en.wikipedia.org/wiki/ESC/P)(主要用于点阵打印机)或[HP-GL](https://en.wikipedia.org/wiki/HPGL)和[HP-GL/2](https://en.wikipedia.org/wiki/HPGL#HP-GL.2F2)(为绘图仪设计)。直接打印[PDF](https://en.wikipedia.org/wiki/Portable_Document_Format)和[XPS](https://en.wikipedia.org/wiki/Open_XML_Paper_Specification)也是新型打印机上常见的功能。**然而,最常见的‘标准’页面描述语言是PostScript和PCL。**
|
||
|
||
### PostScript (PS)
|
||
|
||
‘页面描述’这个术语可能会引起误解,因为**PostScript不仅仅能够创建矢量图形**。PostScript是一个基于堆栈的、**图灵完备**的编程语言,由近400个算术、堆栈和图形操作以及各种数据类型(如数组或字典)的操作符组成,由Adobe创建。\
|
||
技术上讲,访问PostScript解释器已经可以被归类为**代码执行**,因为理论上任何算法功能都可以用PostScript实现。当然,如果没有访问网络堆栈或额外的操作系统库,其可能性限于任意数学计算,如挖掘比特币。然而,PostScript能够进行基本的文件系统I/O,以存储常用的代码、图形或字体文件。\
|
||
最初设计为一个特性,这样的功能的危险在打印机互联之前是**有限的**,风险主要在主机基础的PostScript解释器的背景下讨论。在这方面,封装的PostScript(EPS)也值得注意,因为它可以包含在其他文件格式中,在主机上解释,如[LaTeX](https://en.wikipedia.org/wiki/LaTeX)文档。像**PJL**和**PCL**一样,**PostScript**支持主机和打印机之间的**双向通信**。\
|
||
下面给出了一个PostScript代码示例,用于将Hello world回显到stdout:
|
||
```
|
||
%!
|
||
(Hello world) print
|
||
```
|
||
Brother和Kyocera使用他们自己的PostScript克隆版本:**Br-Script**和**KPDL**。这些PostScript语言的变种并不是100%兼容的,尤其是在安全特性方面,比如退出服务器循环。PostScript可以用于多种攻击,例如[拒绝服务](http://hacking-printers.net/wiki/index.php/Denial\_of\_service)(例如,通过无限循环)、打印作业[操纵](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation)和[保留](http://hacking-printers.net/wiki/index.php/Print\_job\_retention),以及获取打印机[文件系统](http://hacking-printers.net/wiki/index.php/File\_system\_access)的访问权限。
|
||
|
||
#### 退出服务器循环
|
||
|
||
通常,每个打印作业都封装在自己的独立环境中。**PostScript**的一个有趣特性是程序**可以绕过打印作业封装**并改变后续作业的初始VM。为此,它可以使用startjob,一个Level 2特性:
|
||
```
|
||
true 0 startjob
|
||
```
|
||
或 exitserver(在包含作业服务器的所有实现中可用):
|
||
```
|
||
serverdict begin 0 exitserver
|
||
```
|
||
#### 操作符重定义
|
||
|
||
当一个 **PostScript** 文档**调用**一个**操作符**时,字典栈上**找到的第一个版本**将被使用。操作符通常位于 systemdict 字典中,但是通过将新版本放入 userdict 字典,可以实际上覆盖操作符,因为**用户定义的版本是字典栈上找到的第一个**。使用 startjob/exitserver 操作符,这样的更改可以变得永久性的 —— 至少直到打印机重启。下面给出了 PostScript 字典栈的示意图:
|
||
|
||
\
|
||
[![PostScript 字典栈](http://hacking-printers.net/wiki/images/thumb/f/ff/Dictstack.png/300px-Dictstack.png)](http://hacking-printers.net/wiki/index.php/File:Dictstack.png)
|
||
|
||
\
|
||
**重新定义操作符的潜在影响**仅受限于创造力。当进一步的合法文档被打印并调用一个重新定义的操作符时,攻击者的版本将被执行。这可能导致各种攻击,如[拒绝服务](http://hacking-printers.net/wiki/index.php/Document_processing#Showpage_redefinition)、打印作业[保留](http://hacking-printers.net/wiki/index.php/Print_job_retention)和[操纵](http://hacking-printers.net/wiki/index.php/Print_job_manipulation)。然而请注意,这不一定是一个安全漏洞,而是一个32年的旧语言特性,几乎在任何 PostScript 打印机和 [RIP](https://en.wikipedia.org/wiki/Raster_image_processor) 中都可用。
|
||
|
||
### PCL
|
||
|
||
PCL 3 和 PCL 4 增加了对字体和宏的支持,这两者都可以永久下载到设备中 —— 然而只能通过数字 id 引用,而不是文件名,因为**不打算直接访问文件系统**。PCL 1 到 5 由转义序列组成,后跟一个或多个代表要解释的命令的 ASCII 字符。PCL 6 增强版或 ‘PCL XL’ 使用二进制编码的面向对象协议。**下面给出了一个打印 ‘Hello world’ 的 PCL 文档示例**:
|
||
```
|
||
<Esc>Hello world
|
||
```
|
||
```markdown
|
||
由于其功能有限,除非发现某些打印机制造商的PCL版本中有趣的专有命令,否则从安全角度来看,PCL **难以被利用**。**PRET** 工具实现了一个 **基于PCL的虚拟文件系统**,它使用宏来 **将文件内容和元数据保存在打印机的内存中**。这种黑客技术表明,即使只支持像PCL这样的最简单页面描述语言的设备,也可以用来存储任意文件,如侵犯版权的材料。尽管将打印机变成文件共享服务本身不是一个安全漏洞,但根据公司政策,这可能被视为‘服务滥用’。
|
||
|
||
## 杂项攻击
|
||
|
||
### USB驱动器或电缆
|
||
|
||
数据可以通过 [USB](https://en.wikipedia.org/wiki/USB) 或 [并行](https://en.wikipedia.org/wiki/IEEE_1284) 电缆发送到本地打印机并从中接收。**PRET** 支持这两个通道与设备通信。此外,打印机和多功能一体机通常带有Type-A USB端口,允许用户直接从USB设备打印。\
|
||
虽然插入的USB驱动器 **不提供双向通道**,但在拥挤的复印室中使用它们可能看起来不那么引人注目。显然,利用USB打印机需要攻击者获得对设备的物理访问权限。然而,对于大多数机构和公司来说,这并非完全不切实际。通常认为,获得打印机的物理访问权限比获得服务器或工作站等其他网络组件的物理访问权限要容易。
|
||
|
||
### 跨站打印
|
||
|
||
滥用 **客户端网络请求**,攻击者可以 **滥用任意打印机** 在连接到其恶意网页的客户端的内部网络中。\
|
||
[**了解如何做到这一点,请点击这里。**](cross-site-printing.md)
|
||
|
||
### 滥用AD中的Spooler服务
|
||
|
||
如果你能在域内找到任何 **正在监听的Spool服务**,你可能能够 **滥用** 它来 **获取新的凭证** 和 **提升权限**。\
|
||
[**更多关于如何找到和滥用Spooler服务的信息,请点击这里。**](../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
|
||
|
||
## 权限提升
|
||
|
||
### 恢复出厂设置
|
||
|
||
有几种可能的方法可以将设备 **重置** 为出厂默认设置,这是一个安全关键的功能,因为它 **覆盖了保护机制**,如用户设置的密码。\
|
||
[**在这里了解更多。**](factory-defaults.md)
|
||
|
||
### **绕过记账**
|
||
|
||
你可能能够 **冒充现有或不存在的用户** 来使用他们的账户打印页面,或者 **操纵** 硬件或软件 **计数器** 以打印更多页面。\
|
||
[**学习如何做到这一点,请点击这里。**](accounting-bypass.md)
|
||
|
||
### **扫描仪和传真**
|
||
|
||
访问扫描仪或传真功能,你可能能够访问其他功能,但这一切都取决于供应商。\
|
||
[**在这里了解更多。**](scanner-and-fax.md)
|
||
|
||
## **打印作业访问**
|
||
|
||
### **打印作业保留**
|
||
|
||
作业可以 **保留在内存中** 并在 **稍后从控制面板打印**,或者使用 **PostScript** 你甚至可以 **远程访问所有将要打印的作业,下载它们** 并打印。\
|
||
[**在这里了解更多。**](print-job-retention.md)
|
||
|
||
### **打印作业操纵**
|
||
|
||
你可以 **添加新内容** 到打印的页面,**更改所有将要打印的内容**,甚至 **只替换某些字母或单词。**\
|
||
[**学习如何做到这一点,请点击这里。**](print-job-manipulation.md)
|
||
|
||
## **信息泄露**
|
||
|
||
### **内存访问**
|
||
|
||
你可能能够 **转储** **NVRAM** 内存并从中 **提取敏感信息**(如密码)。\
|
||
[**阅读如何做到这一点,请点击这里。**](memory-access.md)
|
||
|
||
### **文件系统访问**
|
||
|
||
你可能能够 **访问文件系统** 滥用 **PJL** 或 **PostScript**。\
|
||
[**阅读如何做到这一点,请点击这里。**](file-system-access.md)
|
||
|
||
### **凭证泄露/暴力破解**
|
||
|
||
你可能能够 **泄露密码**,滥用 **SNMP** 或 **LDAP** 设置,或者你可以尝试 **暴力破解 PJL** 或 **PostScript**。\
|
||
[**阅读如何做到这一点,请点击这里**](credentials-disclosure-brute-force.md)**。**
|
||
|
||
## **代码执行**
|
||
|
||
### **缓冲区溢出**
|
||
|
||
在 **PJL输入** 和 **LPD守护进程** 中已经 **发现** 了几个 **缓冲区溢出**,可能还有更多。\
|
||
[**阅读这里获取更多信息。**](buffer-overflows.md)
|
||
|
||
### 固件更新
|
||
|
||
你可能能够 **让打印机更新驱动程序为一个由你特别制作的恶意驱动程序**。\
|
||
[**阅读这里获取更多信息。**](firmware-updates.md)
|
||
|
||
### **软件包**
|
||
|
||
打印机供应商已经开始引入 **在其设备上安装自定义软件的可能性**,但信息并未公开。编写在打印机上运行的定制软件的功能是有意为之,并且是为经销商和承包商保留的。\
|
||
[**在这里阅读更多关于这个话题的信息。**](software-packages.md)
|
||
|
||
## **拒绝服务**
|
||
|
||
### **传输通道**
|
||
|
||
占用所有 **连接** 并 **增加** 服务器的 **超时** 可能导致DoS。\
|
||
[**在这里了解更多关于这个话题的信息。**](transmission-channel.md)
|
||
|
||
### **文档处理**
|
||
|
||
你可以使用 **PostScript** 和 **PJL** 来执行 **无限循环**,**重新定义命令** 以避免任何打印,**关闭** 任何打印功能,甚至 **将打印机设置为离线模式**。\
|
||
[**在这里了解更多关于这个话题的信息。**](document-processing.md)
|
||
|
||
### **物理损坏**
|
||
|
||
有人可能 **滥用 PJL** 或 **PostScript** 来 **写入** **NVRAM** 成千上万次,目的是 **破坏芯片** 或至少使 **参数冻结** 成出厂默认设置。\
|
||
[**在这里了解更多关于这个话题的信息。**](physical-damage.md)
|
||
|
||
<details>
|
||
|
||
<summary><strong>从零开始学习AWS黑客攻击,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
支持HackTricks的其他方式:
|
||
|
||
* 如果你想在 **HackTricks中看到你的公司广告** 或 **下载HackTricks的PDF版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||
* 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT系列**](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来分享你的黑客技巧。
|
||
|
||
</details>
|
||
```
|