打印机安全研究(一):不容乐观的网络打印机安全状况。打印机是人们在生活和办公中经常使用的电子设备,家庭、办公室、公司、政府单位、医院、学校……,几乎每一个单位和机构都会使用打印机。从安全的角度来看,由于打印设备部署于内部网络,通过它们可以直接访问到机密报告、合同或病历等敏感信息,比较关键。近期,来自德国鲁尔大学的安全研究人员对多种品牌型号的网络打印机开展了一项深入的安全研究,以下为他们对这项研究的相关概述和结果分析。
在这篇文章中,我们总结了基于网络打印机的攻击场景概述,同时展示了攻击者可以如何入侵一台存在漏洞的打印机。通过对20种不同品牌型号的打印机进行测试后发现,每一种品牌的打印机都存在不同程度的攻击可能和漏洞。基于分析,我们还给出了测试过程中使用的打印机入侵利用工具-PRinter Exploitation Toolkit (PRET)。主要研究成果可以在Jens Müller发表的PPT和我们发布的公开报告中找到。另外,为了加强打印机安全的研究交流,我们还设立了一个wiki页面http://hacking-printers.net/,其它更多精彩的分享,请关注Jens Müller即将在5月份RuhrSec安全会议上的演讲《How to Hack Your Printer》。
研究背景
打印语言是控制打印机工作的一个命令集,它告诉打印机如何组织被打印的文档,在打印机语言的控制下,从计算机传来的打印数据被转化成可供打印的文字和图像,最终被打印机识别并输出出来。打印语言决定着激光打印机输出版面的复杂程度,是衡量激光打印机性能的一个重要指标。
一个高效的控制语言可减少文件的大小和下载的时间,提高将普通文本格式化成打印文本的速度,目前主要打印控制语言有:PS(PostScript)、PCL和GDI(图形设备接口语言);但总体来说可以分成两类,一类是页描述语言(PDL,Page Descriptional Language),另一类是嵌入式语言(如ESCape Code Language),PCL和 PostScript都属于PDL。(更多了解请参考此文档)。
针对打印机,有多种协议命令和打印语言可以实现打印机设备和打印任务的控制,其中大多数都可能是我们平时都没怎么听过的。相关协议和语言如下图所示:
设备控制
这个命令集语言用于打印机设备控制,使用它们还可以检索设备名称和状态,该集合语言主要为简单网络管理协议SNMP,SNMP是基于UDP,用来管理诸如打印机、路由器、服务器等各种网络设备的基本网络通信协议。
打印通道
打印设备通常支持的协议有:互联网打印协议(IPP)、行式打印后台程序(LPD)、SMB协议和9100原始端口打印协议。这些协议都各有特点,如打印作业队列管理或报告等。在测试分析过程中,我们正是利用了这些打印支持协议,向打印机进行恶意文档传播的。
互联网打印协议(IPP;Internet Printing Protocol)是一个在互联网上打印的标准网络协议,它容许用户可以透过互联网作遥距打印及管理打印工作等工作。用户可以透过相关界面来控制打印品所使用的纸张种类、分辨率等各种参数。
作业控制语言
该命令集语言一般用于管理置纸托盘和纸张数量等打印机设置状态,其中比较标准的作业控制语言则是PJL,与PCL不同的是,PJL提供了不同类别的任务级别的控制。从安全角度来说,PJL更适用,因为它不仅能应用于当前任务,还能作出一些永久性设置,如打印显示或读写状态等。
PJL ,Printer Job Language的简写,它提供了不同类别的打印控制。与PCL不同的是,PJL提供任务级别的控制,而PCL和HP-GL/2只控制打印页面上的打印点的位置。
页面描述语言(PDL)
PS(PostScript)语言是一种标准的PDL语言。虽然PostScript已经不在台式印刷系统中流行,但仍然是激光印刷打印系统的PDL语言首选。PostScript是基于堆栈的图灵完备编程语言,它包含400多种指令和操作符,从安全视角来说,这些指令和操作符可以被攻击利用,入侵控制了PostScript解释器就能实现代码执行等恶意操作。
页面描述语言,是一种面向输出效应的语言,用于描述打印或照排的版面,这种语言不仅具有版面描述功能,还具有计算机设计的特点,即可处理文字,又可处理图象,各种软件在排版和图形处理之后形成PDL形式,就可汇总在一页上输出。
攻击测试
从网络攻击角度来说,打印机算是一个重要且有价值的攻击目标,但打印机的安全和威胁技术研究却非常之少。所以,我们的首要任务是,根据目前CVE漏洞库和安全博客中公布的,有关打印机漏洞和安全技术进行综合分析,通过对现存已知漏洞问题的归纳总结,构建新型或通用攻击模型,测试不同品牌型号打印机存在的漏洞和安全性。
我们认为,最好的攻击目标是那些使用PostScript和PJL解释器进行打印作业处理的打印机,因为远程攻击者可以不依赖于设备支持的打印通道,仅只需要利用单独的’文档打印’功能就能对其进行入侵攻击。在我们的分析中,总体上把打印机攻击分为四类:
DoS攻击
只要执行以下两行PostScript代码,就可实现对打印机的DoS攻击,让打印机陷入一个无限loop任务循环:
%!
{} loop
其它此类攻击:
使打印机进入离线脱机模式:利用PJL语言的操作控制命令让打印机显示其它特定消息或进入离线状态模式;
物理破坏:通过对PJL常变量的持续设置和更改,可能会对打印机具有读写周期的NVRAM(非易失性随机访问存储,打印机主要存储)造成破坏;
重定义打印显示信息:PostScript的’showpage’命令用来对打印文档的每一页显示信息进行设置,可在不影响打印内容的顶部或底部加入自定义标题文字。因此,攻击者可以通过该命令任意定义其它打印显示信息。
安全设置绕过
为了绕过打印机现有的安全设置,最简单的方法就是把打印机重置到出厂状态。由于大多数打印机都可以通过某些按键组合进行出厂状态硬复位,所以对入侵了打印机的攻击者来说,这种操作也比较容易实现。
而且,如果打印机支持RFC1759标准(Printer MIB),攻击者可以远程利用SNMP命令来实现对目标打印机的出厂状态重置:
# snmpset -v1 -c public [printer] 1.3.6.1.2.1.43.5.1.1.3.1 i 6其它特殊机型都提供了类似功能命令语言,如HP的PML, Kyocera的PRESCRIBE等。此外,我们的研究表明,很多流行的CUPS和LPRng打印机都存在技术绕过,实现出厂状态重置的可能。
CUPS(Common UNIX Printing System,集成在大多打印机内的通用Unix打印系统。LPRng(LPR Next Generation),下一代行式打印系统。
打印任务控制
由于一些PDL语言允许修改,所以可能导致攻击者的一些恶作剧攻击,如控制用户打印任务、在打印文档上打印出任意图案文字、自定义任意’showpage’状态信息等。
打印机信息泄露
9100端口打印支持双向通道,因此可导致某些敏感信息泄露,例如Brother(兄弟)打印机可以通过以下PJL命令向NVRAM执行读写操作:
@PJL RNVRAM ADDRESS = X
在我们的实际测试中,可以利用该命令读取打印机的整个NVRAM内存数据,其中就包含了一些敏感信息,如打印机密码、用户自定义打印机支持协议POP3/SMTP密码、FTP密码和活动目录信息等。攻击者可以利用这些信息进行内网提权,或把打印机作为内网渗透摆渡设备。
其它此类攻击:
文件系统入侵:PostScript和PJL命令都具有对打印机文件系统的访问功能,然而某些品牌打印机却未对一些特殊目录设置访问限制,可以导致如密码等其它敏感信息泄露。
打印任务获取:只要打印机使用PostScript命令,攻击者就可以通过其获取到打印任务。主要因为PostScript的两个特性:一是攻击者可通过自定义的操作符’hook’到其它打印用户的打印任务;二是PostScript可以读取数据并进行简单的文档信息存储。
密码泄露:攻击者可以对1-65535范围内的PJL密钥数字进行暴力破解,轻易获取到PJL密码;同样,如果利用每秒高达100000次的密码验证就可破解PostScript密码。