打印机漏洞研究入门

来源:岁月联盟 编辑:猪蛋儿 时间:2023-01-09

打印机介绍

打印机已经成为生活的必备品,学生用来打印文档,企业用来打印资料,数据,机密文件等。由于,打印机连接在内网中,因此大家经常忽略打印机的安全问题,有时为了方便打印,会开启打印机的无线打印,web界面访问等功能。这些方式也带来了多种安全问题,如果加上网络配置不当,可能还会造成内网的打印机暴露在公网。

打印机常见漏洞

信息泄露,如访问内存,可能发现密码或打印文件中的敏感数据,访问文件系统,泄露配置文件或者存储打印作业;DOS攻击;远程代码执行漏洞RCE,缓冲区溢出攻击,执行恶意代码;打印任务的控制,修改打印内容等。

打印机语言

打印机语言主要有两类:一种是页面描述语言(PDL),另一种是嵌入式语言(Escape码语言)。页面描述语言和嵌入式语言的代表分别是adobe公司的postscript语言(简称为ps语言)和hp公司的PCL语言。

每台打印机使用不同的PDL来确定实际文档的外观,并且某些打印机可能具有不同的打印机驱动程序来处理多个PDL。最常见的页面描述语言是PS(PostScript),PDF(Portable Document Format),PCL(Printer Command Language)。PS,PCL等打印语言是一个命令集,告诉打印机如何组织被打印的文档。打印机驱动程序把这些命令嵌入在打印数据中传送给打印机,而不是单独传送,并由打印机的打印控制器在分开解释。

与我们的攻击最相关的PDL是PostScript(PS),这是一种Turing完整的语言,比PDF具有更多的功能。我们的某些攻击行为创建了PS文件,并将其植入MIT打印机中,以修改该打印机上将来打印的文档,同时保留原始数字文件的完整性。

可移植文档格式(PDF)是PDL的后继语言,但只能创建矢量图形。尽管PDF作为典型文档交换中使用的文档格式非常流行,但在我们的工作中并不是很有用。

打印机命令语言(PCL)是一种极简的PDL,对计算机字眼种子能够用比较少,同时对字库,图像的解释能力比较强等,也很流行。但是,它的功能有限,不能像PS那样用于开发打印机。

打印任务语言(PJL)打印任务语言(PJL)用于指导打印机行为,利用PJL语言可以对打印任务执行管理性的更改设置,对打印文件形成有限管理控制,例如,在打印机文件系统下用户不经常留意的以下特定位置中,它可对打印文件执行存储删除操作。其它打印机语言是PCL的扩展,如打印机作业语言PJL是 PCL的扩展,用于控制打印机的行为,上面提到PCL只处理内容,扩展的PJL则可以永久性的修改设备的设置,如印纸张大小和数量。而 PJL可以被用来执行DoS攻击、打印页面控制、读取文件系统和内存,甚至恶意固件更新。供应商往往只支持PJL 控制语言中的部分命令,并根据打印机的需要自行添加专有的功能。

打印机描述(PPD)PS、PCL都是一种与设备无关的打印机语言,它们只处理打印的内容,而与设备相关的分辨率、纸张大小它们不处理。PS 、PCL可以将打印内容解释成页面描述文件,这个文件会被控制器解析并打印。但是对譬如分辨率、纸张大小、进纸盒进行选择时,调用的是打印机描述(PostScript Printer Description ,即PPD)文件来实行各种打印机的不同特性,PS、PCL 语言在打印的时候,即定义图像时根本不用去考虑打印机的分辨率、纸张大小,由打印机的PPD文件来决定,给处理字体带来了极大的灵活性。

PPD文件主要提供以下与打印机有关的特定信息::默认/ 最高分辨率,是否支持半色调监控,用户设定的监控信息,页面大小定义,页面可打印区域,默认字体(通常为Courier),是否支持双面打印等等。每一种不同的 PostScript打印机都分别对应有专门的PPD文件。

关于PostScript仿真,因为目前使用PostScrit语言需要向 Adobe公司支付一笔费用,成本较高,因此才有与PostScript完全兼容的PostScript仿真,像 HP公司的一些激光打印机中使用的PostScript仿真,也无需再支付Adobe公司相应的费用利用。

PS可以用于各种攻击,例如拒绝服务,打印作业处理和保留以及访问打印机的文件系统等恶意操作。打印机指令语言PCL很难被攻击利用,该页面描述语言不直接访问底层文件系统,因此和PS相比,该描述语言并不是很适合用于攻击的目的,不过PCL的扩展PJL容易受到攻击,下文基本上是基于PJL。

打印机搜索

1.nmap扫描

主要查看开放了哪些端口,服务,检测操作系统指纹等。

这是某一台打印机开放的服务和端口,打印机一般开放的端口和服务如下:

2.SmartDeviceMonitor工具进行局域网内扫描

3.使用Google语法进行搜索

漏洞利用

1.DOS

当向打印机9100端口发送任何数据,打印机都可将其打印出来,文章前部分发现,9100端口还支持原始打印、PCL、PostScript和PJL,即可以通过9100端口执行PJL。当执行DOS,则可无限循环打印任务,导致打印任务不断执行,资源耗尽,无法执行打印操作。按个人理解简单点说,就是当发起打印任务时,打印机等任务发起结束,才会执行下一步的打印操作,如果一直循环打印任务,则无法到达下一步。通过几行PostScript代码实现DOS。

%!
{} loop

下面是一些常用的PJL命令

```@PJL