.. | ||
accounting-bypass.md | ||
buffer-overflows.md | ||
credentials-disclosure-brute-force.md | ||
cross-site-printing.md | ||
document-processing.md | ||
factory-defaults.md | ||
file-system-access.md | ||
firmware-updates.md | ||
memory-access.md | ||
physical-damage.md | ||
print-job-manipulation.md | ||
print-job-retention.md | ||
README.md | ||
scanner-and-fax.md | ||
software-packages.md | ||
transmission-channel.md |
打印机渗透测试
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
-
你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品The PEASS Family
-
加入💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
-
通过向hacktricks仓库和hacktricks-cloud仓库提交PR来分享你的黑客技巧。
请注意,与打印机渗透测试相关的大部分内容都是从http://hacking-printers.net/上的大量且令人惊叹的研究中获取的。我试图在这里总结这些信息,但你始终可以去源头了解更多关于这个主题的内容。
基础知识
下图显示了打印机语言封装的关系示意图:\
网络打印协议
将数据发送到打印机设备可以通过USB/并行电缆或通过网络完成。本wiki侧重于网络打印,但是大多数介绍的攻击也可以针对本地打印机执行。网络打印有各种奇特的协议,如Novell的NCP或AppleTalk。在Windows世界中,SMB/CIFS_打印机共享变得非常流行。此外,一些设备支持通过通用协议(如_FTP_或_HTTP_文件上传)进行打印。然而,直接支持网络打印的最常见的打印协议是LPD**、IPP**和原始端口9100_打印。网络打印协议可以直接受到攻击,例如利用打印机的LPD守护程序中的缓冲区溢出。然而,在许多攻击场景中,它们只是作为部署恶意打印机语言代码的载体/通道。请注意,**网络打印机通常支持多种协议来“打印”**文档,这扩大了攻击面。
在这里了解更多关于原始端口9100的信息。
在这里了解更多关于Pentesting 515中的LPD的信息。
在这里了解更多关于Pentesting 631中的IPP的信息。
打印机控制语言
作业控制语言管理当前打印作业的设置,如输出托盘。虽然它通常位于打印协议和页面描述语言之间的可选层中,但功能可能重叠。供应商特定的作业控制语言的示例包括CPCA、XJCL、EJL和PJL - 这是许多打印机支持的,并将在下面讨论。此外,打印机控制和管理语言旨在影响不仅仅是单个打印作业,而是整个设备。定义此任务的一个常见标准的方法是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检索hrDeviceDescr
值(OID 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,而实际的渲染是由打印机驱动程序完成的。有各种各样的专有页面描述语言,如京瓷的PRESCRIBE、SPL、XES、CaPSL、RPCS、ESC/P(主要用于点阵打印机)或HP-GL和HP-GL/2(专为绘图仪设计)。新型打印机通常支持直接打印PDF和XPS。然而,最常见的“标准”页面描述语言是PostScript和PCL。
PostScript(PS)
术语“页面描述”可能会引起误解,因为PostScript能够做的远不止创建矢量图形。PostScript是一种基于堆栈的、图灵完备的编程语言,由Adobe创建,包含近400个用于算术、堆栈和图形操作的运算符以及各种数据类型,如数组或字典。
从技术上讲,访问PostScript解释器已经可以被归类为代码执行,因为任何算法函数理论上都可以在PostScript中实现。当然,在没有访问网络堆栈或其他操作系统库的情况下,可能只能进行任意的数学计算,如挖掘比特币。然而,PostScript能够进行基本的文件系统I/O,以存储经常使用的代码、图形或字体文件。
在打印机互联之前,这种功能的危险性是有限的,风险主要在主机型PostScript解释器的上下文中讨论。在这方面,封装的PostScript(EPS)也值得注意,因为它可以包含在其他文件格式中,以在主机上进行解释,如LaTeX文档。与PJL和PCL一样,PostScript支持主机和打印机之间的双向通信。
下面是一个将Hello world回显到stdout的示例PostScript代码:
%!
(Hello world) print
Brother和Kyocera使用自己的PostScript克隆版本:Br-Script和KPDL。这些PostScript语言的变种并不完全兼容,特别是在安全功能方面,如退出服务器循环。PostScript可以用于各种攻击,例如拒绝服务(例如通过无限循环),打印作业操纵和保留,以及访问打印机的文件系统。
退出服务器循环
通常,每个打印作业都封装在自己独立的环境中。PostScript的一个有趣特性是,程序可以绕过打印作业的封装,并修改后续作业的初始虚拟机。为此,它可以使用startjob,这是一个Level 2的功能:
true 0 startjob
或者exitserver(在包含作业服务器的所有实现中可用):
serverdict begin 0 exitserver
该功能由StartJobPassword控制,默认为0
(比较凭据泄露)。由于作业服务器循环通常负责在作业之间清理解释器的状态,在服务器循环之外进行的任何更改都将保留为解释器的永久状态,适用于所有后续作业。换句话说,打印作业可以访问和修改其他作业。太棒了!
操作符重定义
当PostScript文档调用一个操作符时,使用字典栈上找到的第一个版本。操作符通常驻留在systemdict字典中,但通过将新版本放入userdict字典中,可以实际上覆盖操作符,因为用户定义的版本是字典栈上找到的第一个版本。使用startjob/exitserver操作符,可以使这些更改变得永久-至少在打印机重新启动之前。下图显示了PostScript字典栈的结构:
重新定义操作符的潜在影响仅受创造力的限制。当打印其他合法文档并调用重新定义的操作符时,攻击者的版本将被执行。这可能导致各种攻击,例如拒绝服务、打印作业保留和篡改。但请注意,这不一定是一个安全漏洞,而是一个存在了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内存并从中提取敏感信息(如密码)。
在这里阅读如何做到这一点。
文件系统访问
您可以通过滥用PJL或PostScript来访问文件系统。
在这里阅读如何做到这一点。
凭据泄露/暴力破解
您可以通过滥用SNMP或LDAP设置来泄露密码,或者可以尝试暴力破解PJL或PostScript。
在这里阅读如何做到这一点。
代码执行
缓冲区溢出
已经在PJL输入和LPD守护程序中发现了几个缓冲区溢出,可能还有更多。
阅读此处获取更多信息。
固件更新
您可以使打印机将驱动程序更新为您特别制作的恶意驱动程序。
阅读此处获取更多信息。
软件包
打印机供应商已经开始引入在其设备上安装自定义软件的可能性,但信息并不公开。编写在打印机上运行的定制软件的功能是为经销商和承包商保留的。
在这里阅读更多信息。
拒绝服务
传输通道
占用所有连接并增加服务器的超时可能导致拒绝服务。
在这里了解更多信息。
文档处理
您可以使用PostScript和PJL执行无限循环,重新定义命令以避免任何打印,关闭任何打印功能,甚至将打印机设置为脱机模式。
在这里了解更多信息。
物理损坏
您可以使用PJL或PostScript将数十万次写入NVRAM,以达到破坏芯片或至少使参数被冻结为出厂默认值的目的。
在这里了解更多信息。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得最新版本的PEASS或以PDF格式下载HackTricks吗?请查看订阅计划!
-
发现我们的独家NFT收藏品The PEASS Family
-
加入💬 Discord群组或电报群组,或在Twitter上关注我[🐦](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e114446
-
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享您的黑客技巧。