打印机漏洞研究入门

硬件安全
2023-01-07 18:28
127454

打印机介绍

打印机已经成为生活的必备品,学生用来打印文档,企业用来打印资料,数据,机密文件等。由于,打印机连接在内网中,因此大家经常忽略打印机的安全问题,有时为了方便打印,会开启打印机的无线打印,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公司相应的费用利用。

image.png

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

打印机搜索

1.nmap扫描

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

image.png

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

image.png

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

image.png

3.使用Google语法进行搜索

image.png

image.png

漏洞利用

1.DOS

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

%!
{} loop

下面是一些常用的PJL命令


@PJL FSDOWNLOAD FORMAT:BINARY [SIZE=int] [<CR>]<LF>                 # 下载文件到打印机

@PJL FSINIT VOLUME = “pathname” [<CR>]<LF>                           # 初始化打印机文件系统

@PJL FSMKDIR NAME = “pathname” [<CR>]<LF>                           # 创建目录

@PJL DINQUIRE CPLOCK                                                 # 检查控制面板状态

@PJL DINQUIRE PASSWORD                                               # 检查密码保护状态

@PJL JOB PASSWORD = [Number:0 to 65535]                             # 当前密码保护密码

@PJL DEFAULT PASSWORD [Number:0 to 65535]                           # 修改保护密码

@PJL DEFAULT CPLOCK = [ON, OFF]                                     # 控制面板状态

@PJL SET IOBUFFER = [ON, OFF, AUTO]                                 # 设置缓冲区

@PJL SET IOSIZE = [10-100]                                           # 设置缓存区大小

@PJL SET PCNAME = [String]                                           # 设置计算机名称

@PJL SET HOLD = [ON, JOB, STORE, PROOF]                             # 设置文件保存

@PJL SET HOLDKEY = [Number:0000 to 9999]                             # 设置保存文件密码

@PJL DEFAULT DISKLOCK = [ON, OFF]                                   # 设置硬盘锁定状态

@PJL SET SPOOLTIME                                                   # 设置打印日期

@PJL SET COPIES                                                     # 设置打印数

@PJL SET JOBNAME                                                     # 设置打印机文件名称

@PJL SET RESOLUTION                                                 # 设置分辨率

@PJL SET DRIVERNAME                                                 # 设置驱动

@PJL USTATUS JOB                                                     # 输出 队列中还未打印任务的 状态

@PJL COMMENT                                                         # 添加注释

@PJL SET OUTTRAY                                                     #出纸盘(纸张输出位置)

@PJL SET ORIENTATION = [PORTRAIT, LANDSCAPE]                         #页面方向

@PJL SET DUPLEX = [ON, OFF]                                         #双工模式(双面打印)

@PJL SET BINDING = [LONGEDGE, SHORTEDGE]                             #双工模式:短边、长边

@PJL RNVRAM ADDRESS                                                 #读取内存

@PJL OPMSG DISPLAY                                                   #设置打印机离线脱机

@PJL SET SERVICEMODE                                                 #设置服务模式

@PJL WNVRAM ADDRESS                                                 #写入内存

@PJL FSDIRLIST NAME                                                 #读取目录

@PJL FSQUERY NAME                                                   #读取文件

@PJL FSUPLOAD NAME                                                   #文件上传

@PJL FSDOWNLOAD                                                     #写入文件

2.PRET

image.png

这里我可以看到已经成功连接打印机,打印机的型号是hp LaserJet 1320 series,能够执行命令如上图;

image.png

查看配置信息,这里我们进行一下修改

image.png

这里我们已经成功更改了配置。

总结

随着对支持移动设备打印的需求越来越大,支持Wi—Fi直连、NFC打印、云打印等移动功能的网络打印机逐渐成为人们日常生活办公中不可缺少的电子设备。学校、政府部门、医院等各个单位与机构都会使用打印机从安全的角度来看,由于打印设备部署于内部网络,通过它们可以直接访问到各种敏感信息,因此其安全性比较重要。但由于其功能特殊性,人们往往忽略其安全性,导致打印机安全问题颇多,弓发的安全事件也逐渐增多。

-end

分享到

参与评论

0 / 200

全部评论 2

zebra的头像
学习大佬思路
2023-03-19 12:15
Hacking_Hui的头像
学习了
2023-02-01 14:20
投稿
签到
联系我们
关于我们