Jirairya

printer

2017-09-19
hack  sec

网络打印机

网络打印机的高级视图:

+----------------------------------------------------+
                       |           网络打印控制协议     |
                       +-------------------------------+--+
     打印通道           |                                  |
                       | IPP, LPD, SMB, raw port 9100     |
                       |                                  |
  +--------------------------------------------------+    |
                       | 打印机控制语言              |       |
 打印机语言              +-----------------------------+--+ |
                       |                                | |
                       |  PJL, PML                      | |
                       |                                | |
                       | +------------------------+     | |
                       | | 页面备注说明语言          |     | |
                       | +------------------------+---+ | |
                       | |                            | | |
                       | | PS, PCL, PDF, XPS, ...     | | |
                       | |                            | | |
                       | +----------------------------+ | |
                       +--------------------------------+ |
                       +----------------------------------

网络打印协议作为部署打印作业的通道,其直接包含页面描述语言和打印机/作业控制语言

基础知识

打印机使用了不同的嵌入式OS,比如:

  • WindRiver Linux:https://www.windriver.com/products/linux/
  • VxWorks:https://www.windriver.com/products/linux/
  • ThreadX:http://rtos.com/products/threadx/

不同的打印机也有很多共同点:

  • 指令精简,指令集较少
  • 使用”传统内核”,内核版本在2.6.XYZ
  • 通过配置文件或者利用补丁使用“隐藏功能”。比如利用配置文件开启ssh功能
  • ssh功能常出现在办公使用的打印机
  • 有些打印机的固件存储方式会很滑稽。比如在一张可移除切换的SD卡上课进行30s的物理访问

因此,打印机会遭受来自不同的方式攻击。

有很多各式各样的网络打印协议,比如NCP或Apple Talk。但在windows中,比较多的是SMB/CIFS协议的打印机,然而网络打印机直接支持的最常见的打印协议是LPD、IPP和原始的9100打印端口,此外还有一些打印机支持通过FTP或HTTP文件上传等通用协议进行打印。

LPD

LPD是Line Printer Daemon’-protocol(线路打印机守护程序)协议的缩写,运行在515/TCP端口上,可以在客户端上使用’lpr’进行连接。为了打印,客户端会向打印机发送一个定义作业/用户名的控制文件和要打印的实际数据的数据文件

IPP

IPP是基于HTTP的可扩展协议,继承了其所有的现有安全功能,如基本的身份验证和SSL/TLS加密。要提交打印作业,使用POST将请求发送到IPP服务器。该服务器监听631/TCP。基于IPP协议实现的CUPS就是许多Linux发行版和MacOS X中的默认打印系统。

SMB

SMB,是Server Message Block(服务器消息块)的缩写,是应用层网络协议,用于处理与打印机共享文件,是Windows默认使用的,通常运行在445/TCP端口上。

9100端口

9100端口也被称为“原始打印”。客户通过9100/TCP端口连接到网络打印机。它是CUPS和Windows打印体系结构使用的默认方法。就像通过TCP的并行连接一样,所有发送的数据都由打印设备直接处理。与LPD、IPP、SMB打印控制/描述语言相比,该原始打印协议可以将状态、错误消息等反馈直接发送到客户端。在此,就是一个双向的通道,直接可以访问打印机控制语言的结果。

打印机控制语言

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

SNMP

SNMP,是简单网络管理协议,其在161/UDP上监听,旨在管理网络组建

PJL

PJL,是”Printer Job Language”(打印机作业语言)的简称。可以用于操作一般设置,还可以永久修改设置。很多供应商只支持PJL参考中给出部分命令,添加自己特有的命令。 PJL也用于设置实际打印数据的文件格式,这使得容易被攻击

PDL

PDL基本上指定实际的文档的样式,打印机驱动程序根据PDL所描述,转换成打印机所理解的指令,然后打印成所指定的样式

PostScript(PS)

PostScript由Adobe发明,广泛用于PDL。PS的能力不仅仅可以用于定义文档的外观和处理矢量图形,还可以用于各种攻击,例如拒绝服务攻击(通过无限循环)、访问打印机的文件系统

PCL

PCL作为简洁的页面描述语言,由各供应商和设备支持,所以并不能直接访问底层的文件系统

攻击向量

远程利用

很多打印机通过9100端口连接到互联网,使用shodan获取具有打印机的IP,若再获得SSH连接就可以做后续攻击。

内部攻击

通过物理访问打印机,比如插入USB驱动器或者SD卡

可能造成的攻击

拒绝服务

  • 传输通道:阻止打印端口,保持打印机繁忙,不再打印任何东西
  • 文档处理:通过PDL操作文档,让打印机解释它。比如,在PS中设置无限循环
  • 物理损坏:恶意程序造成NVRAM芯片(https://en.wikipedia.org/wiki/Non-volatile_memory)损坏(只有10^5周期的写入寿命)

提权

  • 出厂设置: 重置到出厂设置,绕过身份验证
  • 绕过账户: 未认证身份的打印

打印作业

  • 保留的打印作业:尝试在打印机上查找存储的打印作业
  • 操作打印作业:更改打印作业

信息泄露

  • 访问内存:内存访问导致泄露密码和所打印文档的敏感数据
  • 访问文件系统:导致检索出敏感信息,如配置文件和存储的打印作业
  • 凭证泄露: 对默认登陆凭据进行暴力破解来获得访问权限

代码执行

  • 缓冲区溢出:打印机提供额外的语言和网络服务,引发此攻击
  • 固件更新:打印机固件更新为普通的打印作业
  • 软件包:定制和可操作打印机程序

Misc

恶意软件入侵网络打印机,并传播到打印机所在网络

利用组合拳对打印机入侵是比较好的选择,比如可以物理访问和网络访问 多维度的进行攻击,也可以通过简单的打印作业进行恶意软件更新,提取敏感数据,对打印机进行深层次的入侵

工具

Nmap

BeEF

它可以针对WEB浏览器进行渗透测试,可以对打印机进行跨站点打印(http://hacking-printers.net/wiki/index.php/Cross-site_printing)

Pradeda

Pradea是用perl编写的自动采集打印机数据,可从网络上收集设备的用户名、密码、邮件地址

PRET

PRET(https://github.com/RUB-NDS/PRET) 是python编写的工具,可以检测打印机的攻击向量,可以尝试通过网络或者USB连接到打印机,可以利用打印机所使用的语言(目前支持PS、PJL、PCL)进行攻击。

LES

Linux Exploit Suggester(https://github.com/PenturaLabs/Linux_Exploit_Suggester/blob/master/Linux_Exploit_Suggester.pl)是perl编写的小脚本,可根绝内核版本提供一些漏洞,然后利用漏洞攻击

手动进行PJL注入

echo "@PJL FSUPLOAD FORMAT:BINARY NAME="../../etc/passwd" OFFSET=0 SIZE=648" | nc -v -v 192.168.1.108 9100
//如果成功就会返回 */etc/passwd* 文件信息
echo "@PJL INFO ID" | nc -v -v 192.168.1.108 9100
//如果成功,就会显示打印机设备信息

总结

  • 找到进入系统的方式
  • 检查使用的打印机语言,并尝试代码注入
  • 尝试从Web界面入侵到文件系统
  • 如果支持更新,就上传自己创建的恶意固件更新包

资源

  • LPD RFC:https://www.ietf.org/rfc/rfc1179.txt
  • SMB RFC1:http://www.icir.org/gregor/tools/ms-smb-protocols.html
  • IPP RFC:https://www.ietf.org/wg/concluded/ipp.html
  • How Network Printing Works1:https://technet.microsoft.com/en-us/library/cc783789(v=ws.10).aspx
  • PostScript:https://www.adobe.com/products/postscript/pdfs/PLRM.pdf
  • BeEF:http://beefproject.com/
  • Praeda:https://github.com/percx/Praeda
  • PRET14:https://github.com/RUB-NDS/PRET
  • Linux Exploit Suggester3:https://github.com/PenturaLabs/Linux_Exploit_Suggester
  • Printer Security Test Cheat Sheet3:http://hacking-printers.net/wiki/index.php/Printer_Security_Testing_Cheat_Sheet
  • Hacking Printers Wiki1: http://hacking-printers.net/wiki/index.php/Main_Page

  • https://www.contextis.com/blog/hacking-canon-pixma-printers-doomed-encryption
  • http://foofus.net/goons/percx/Xerox_hack.pdf
  • http://www.techradar.com/news/thousands-of-printers-hacked-across-the-globe-after-critical-flaw-exposed
  • https://helpnetsecurity.com/dl/articles/CrossSitePrinting.pdf

Similar Posts

上一篇 日常使用Linux

下一篇 RDP劫持

Comments