hacktricks/network-services-pentesting/pentesting-printers
2023-08-03 19:12:22 +00:00
..
accounting-bypass.md Translated to Chinese 2023-08-03 19:12:22 +00:00
buffer-overflows.md Translated to Chinese 2023-08-03 19:12:22 +00:00
credentials-disclosure-brute-force.md Translated to Chinese 2023-08-03 19:12:22 +00:00
cross-site-printing.md Translated to Chinese 2023-08-03 19:12:22 +00:00
document-processing.md Translated to Chinese 2023-08-03 19:12:22 +00:00
factory-defaults.md Translated to Chinese 2023-08-03 19:12:22 +00:00
file-system-access.md Translated to Chinese 2023-08-03 19:12:22 +00:00
firmware-updates.md Translated to Chinese 2023-08-03 19:12:22 +00:00
memory-access.md Translated to Chinese 2023-08-03 19:12:22 +00:00
physical-damage.md Translated to Chinese 2023-08-03 19:12:22 +00:00
print-job-manipulation.md Translated to Chinese 2023-08-03 19:12:22 +00:00
print-job-retention.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated to Chinese 2023-08-03 19:12:22 +00:00
scanner-and-fax.md Translated to Chinese 2023-08-03 19:12:22 +00:00
software-packages.md Translated to Chinese 2023-08-03 19:12:22 +00:00
transmission-channel.md Translated to Chinese 2023-08-03 19:12:22 +00:00

打印机渗透测试

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

请注意,与打印机渗透测试相关的大部分内容都是从http://hacking-printers.net/上的大量且令人惊叹的研究中获取的。我试图在这里总结这些信息,但你始终可以去源头了解更多关于这个主题的内容

基础知识

下图显示了打印机语言封装的关系示意图:\

打印机语言封装

网络打印协议

将数据发送到打印机设备可以通过USB/并行电缆或通过网络完成。本wiki侧重于网络打印但是大多数介绍的攻击也可以针对本地打印机执行。网络打印有各种奇特的协议如Novell的NCPAppleTalk。在Windows世界中SMB/CIFS_打印机共享变得非常流行。此外一些设备支持通过通用协议如_FTP_或_HTTP_文件上传进行打印。然而直接支持网络打印的最常见的打印协议LPD**、IPP**和原始端口9100_打印。网络打印协议可以直接受到攻击例如利用打印机的LPD守护程序中的缓冲区溢出。然而在许多攻击场景中它们只是作为部署恶意打印机语言代码的载体/通道。请注意,**网络打印机通常支持多种协议来“打印”**文档,这扩大了攻击面。

在这里了解更多关于原始端口9100的信息

在这里了解更多关于Pentesting 515中的LPD的信息

在这里了解更多关于Pentesting 631中的IPP的信息

打印机控制语言

作业控制语言管理当前打印作业的设置,如输出托盘。虽然它通常位于打印协议和页面描述语言之间的可选层中,但功能可能重叠。供应商特定的作业控制语言的示例包括CPCAXJCLEJLPJL - 这是许多打印机支持的,并将在下面讨论。此外,打印机控制和管理语言旨在影响不仅仅是单个打印作业,而是整个设备。定义此任务的一个常见标准的方法是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 '原始端口'的页面中,您可以找到有关如何枚举PJL的更多信息。

PML

打印机管理语言PML是一种专有语言用于控制HP打印机。它基本上结合了SNMP和PJL的功能。尽管公开可用的文档尚未发布LPRng项目泄露了标准的部分内容:PJL通过到PML和SNMP用户指南将PML定义为“面向对象的请求-回复打印机管理协议”,并介绍了语法的基础知识。 PML嵌入在PJL中可用于读取和设置打印机设备上的SNMP值。如果防火墙阻止SNMP服务161/udp的访问这尤其有趣**。下面演示了在打印作业中使用PML检索hrDeviceDescrOID 1.3.6.1.2.1.25.3.2.1.3,设备的文本描述)的示例:

> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530

打印机返回的字符串后半部分 6870204c617365724a65742034323530 是十六进制表示的 hp LaserJet 4250。可以看出,可以通过 PML 通过 PJL 调用(部分) SNMP 命令。PML 的一个安全敏感用途是通过普通打印作业将 HP 打印机 恢复到出厂默认设置,从而删除用户设置的密码等保护机制。

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打印机只接受简单的位图数据流,如ZJS,而实际的渲染是由打印机驱动程序完成的。有各种各样的专有页面描述语言,如京瓷的PRESCRIBESPLXESCaPSLRPCSESC/P(主要用于点阵打印机)或HP-GLHP-GL/2(专为绘图仪设计)。新型打印机通常支持直接打印PDFXPS然而最常见的“标准”页面描述语言是PostScript和PCL。

PostScriptPS

术语“页面描述”可能会引起误解,因为PostScript能够做的远不止创建矢量图形。PostScript是一种基于堆栈的、图灵完备的编程语言由Adobe创建包含近400个用于算术、堆栈和图形操作的运算符以及各种数据类型如数组或字典。
从技术上讲访问PostScript解释器已经可以被归类为代码执行因为任何算法函数理论上都可以在PostScript中实现。当然在没有访问网络堆栈或其他操作系统库的情况下可能只能进行任意的数学计算如挖掘比特币。然而PostScript能够进行基本的文件系统I/O以存储经常使用的代码、图形或字体文件。
在打印机互联之前,这种功能的危险性是有限的风险主要在主机型PostScript解释器的上下文中讨论。在这方面封装的PostScriptEPS也值得注意因为它可以包含在其他文件格式中以在主机上进行解释LaTeX文档。与PJLPCL一样,PostScript支持主机和打印机之间的双向通信
下面是一个将Hello world回显到stdout的示例PostScript代码

%!
(Hello world) print

Brother和Kyocera使用自己的PostScript克隆版本Br-ScriptKPDL。这些PostScript语言的变种并不完全兼容特别是在安全功能方面如退出服务器循环。PostScript可以用于各种攻击例如拒绝服务(例如通过无限循环),打印作业操纵保留,以及访问打印机的文件系统

退出服务器循环

通常,每个打印作业都封装在自己独立的环境中。PostScript的一个有趣特性是程序可以绕过打印作业的封装并修改后续作业的初始虚拟机。为此它可以使用startjob这是一个Level 2的功能

true 0 startjob

或者exitserver在包含作业服务器的所有实现中可用

serverdict begin 0 exitserver

该功能由StartJobPassword控制默认为0(比较凭据泄露)。由于作业服务器循环通常负责在作业之间清理解释器的状态,在服务器循环之外进行的任何更改都将保留为解释器的永久状态,适用于所有后续作业。换句话说,打印作业可以访问和修改其他作业。太棒了!

操作符重定义

PostScript文档调用一个操作符时,使用字典栈上找到的第一个版本。操作符通常驻留在systemdict字典中但通过将新版本放入userdict字典中可以实际上覆盖操作符因为用户定义的版本是字典栈上找到的第一个版本。使用startjob/exitserver操作符可以使这些更改变得永久-至少在打印机重新启动之前。下图显示了PostScript字典栈的结构


The PostScript dictionary stack


重新定义操作符的潜在影响仅受创造力的限制。当打印其他合法文档并调用重新定义的操作符时,攻击者的版本将被执行。这可能导致各种攻击,例如拒绝服务、打印作业保留篡改。但请注意这不一定是一个安全漏洞而是一个存在了32年的语言特性几乎适用于任何PostScript打印机和RIP

PCL

PCL 3和PCL 4添加了对字体和宏的支持这两者都可以永久下载到设备上-但只能通过数字ID引用而不是通过文件名引用因为不打算直接访问文件系统。PCL 1到5由转义序列组成后面跟着一个或多个表示要解释的命令的ASCII字符。PCL 6增强版或“PCL XL”使用二进制编码的面向对象协议。下面是一个打印“Hello world”的示例PCL文档

<Esc>Hello world

由于其功能有限从安全角度来看PCL很难被利用除非发现某些打印机制造商的PCL版本中存在有趣的专有命令。PRET工具实现了一个基于虚拟PCL的文件系统它使用宏将文件内容和元数据保存在打印机的内存中。这种黑客攻击表明即使是只支持最简化页面描述语言如PCL的设备也可以用来存储任意文件如侵权材料。尽管将打印机变成文件共享服务本身并不是一个安全漏洞但根据企业政策它可能被视为“服务滥用”。

其他攻击

USB驱动器或电缆

数据可以通过USB并行电缆发送到本地打印机,并从打印机接收数据。PRET支持使用这两个通道与设备通信。此外打印机和多功能打印机通常配有Type-A USB端口允许用户直接从USB设备打印。
虽然插入USB驱动器不提供双向通道但在拥挤的复印室使用它们可能不那么引人注目。显然利用USB打印机需要攻击者获得对设备的物理访问权限。然而对于大多数机构和公司来说这并不完全是不现实的。与其他网络组件如服务器或工作站相比获得对打印机的物理访问权限通常被认为较为容易。

跨站点打印

攻击者可以通过滥用客户端网络请求来滥用与客户端内部网络中的任意打印机。
了解如何可能实现这一点。

滥用AD中的Spooler服务

如果您可以找到域内的任何Spool服务监听,您可能能够滥用它以获取新的凭据提升权限
在这里了解有关如何找到滥用Spooler服务的更多信息。

提权

出厂默认设置

有几种可能的方法可以将设备恢复到出厂默认设置,这是一个安全关键的功能,因为它会覆盖用户设置的密码等保护机制。
在这里了解更多信息。

计费绕过

您可以冒充现有或不存在的用户,使用他们的帐户打印页面,或者操纵硬件或软件计数器以便能够打印更多页面。
在这里了解如何做到这一点。

扫描仪和传真

访问扫描仪或传真功能,您可能能够访问其他功能,但这完全取决于供应商。
在这里了解更多信息。

打印作业访问

打印作业保留

作业可以保留在内存中,并在以后的某个时刻从控制面板上重新打印,或者使用PostScript,您甚至可以远程访问将要打印的所有作业,下载它们并打印。
在这里了解更多信息。

打印作业操纵

您可以向要打印的页面添加新内容更改将要打印的所有内容,甚至替换某些字母或单词
在这里了解如何做到这一点。

信息泄露

内存访问

您可以转储NVRAM内存并从中提取敏感信息如密码
在这里阅读如何做到这一点。

文件系统访问

您可以通过滥用PJLPostScript访问文件系统
在这里阅读如何做到这一点。

凭据泄露/暴力破解

您可以通过滥用SNMPLDAP设置来泄露密码,或者可以尝试暴力破解PJLPostScript
在这里阅读如何做到这一点。

代码执行

缓冲区溢出

已经在PJL输入LPD守护程序中发现了几个缓冲区溢出,可能还有更多。
阅读此处获取更多信息。

固件更新

您可以使打印机将驱动程序更新为您特别制作的恶意驱动程序。
阅读此处获取更多信息。

软件包

打印机供应商已经开始引入在其设备上安装自定义软件的可能性,但信息并不公开。编写在打印机上运行的定制软件的功能是为经销商和承包商保留的。
在这里阅读更多信息。

拒绝服务

传输通道

占用所有连接增加服务器的超时可能导致拒绝服务。
在这里了解更多信息。

文档处理

您可以使用PostScriptPJL执行无限循环重新定义命令以避免任何打印,关闭任何打印功能,甚至将打印机设置为脱机模式
在这里了解更多信息。

物理损坏

您可以使用PJLPostScript将数十万次写入NVRAM,以达到破坏芯片或至少使参数被冻结为出厂默认值的目的。
在这里了解更多信息。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥