安全-打印机安全研究

只要你联网,那就有可能存在安全问题。俗称万物皆可’日’。

前言

打印机是现在办公环境中不可或缺的一个硬件设备,其本身存在很多安全问题。打印机服务有:FTP、Telnet、HTTP、PJL等。看到这么多服务,相信研究人员是非常高兴的。因为服务越多,安全隐患也越多。做安全研究最怕的就是服务很少、功能很少、端口不开放这些。
前段时间,由于工作的原因,对打印机安全进行研究与分析。整体流程为:识别打印机→识别服务→常见服务安全分析→打印机专用服务(PJL)安全分析。PJL命令文档可以在HP网站上找到,文档参考1文档参考2

识别打印机

识别打印机可以通过:SNMP发送特定oid识别、Web管理页面识别、PJL命令识别。这里我采用了PJL命令识别,通过向设备的9100端口发送PJL命令,根据返回信息来识别。

1
@PJL INFO ID

通过对打印机发送INFO ID(PJL命令),打印机会返回其对应的型号。
识别.bmp

服务识别

识别服务的话,用nmap就可以了。可以使用全端口扫描来发现对应服务。

1
nmap -p 1-65535 -T4 -A -v targetIP

常见服务分析

打印机常见服务:Telnet、FTP、HTTP。

Telnet

打印机中Telnet基本都是默认密码或者是空密码。登录之后可以查看配置信息、操作打印机等等。

FTP

大部分打印机FTP默认密码或空密码。通过上传文件,文件会直接被打印。

HTTP

打印机的Web存在的问题:爆破破解、越权访问等。这个可通过使用Web渗透的方式进行测试。我测试的时候发现有默认密码、信息泄露等。

打印机专用服务(PJL)分析

PJL是打印机作业语言:printer job language。PJL语言有固定的格式。
报文格式.png
对PJL命令文档中的PJL命令进行了整理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
PJL以"\x1B%-12345@PJL JOB"开始,以"\x1B%-12345"结束,其中每条指令应当独占一行,指令间需要有carriage return0x0D)。使用者可以自定义指令。

@PJL FSDELETE NAME = “pathname” [<CR>]<LF> # 删除文件

@PJL FSDOWNLOAD FORMAT:BINARY [SIZE=int] [<CR>]<LF> # 下载文件到打印机

@PJL FSINIT VOLUME = “pathname” [<CR>]<LF> # 初始化打印机文件系统

@PJL FSMKDIR NAME = “pathname” [<CR>]<LF> # 创建目录

@PJL DINQUIRE CPLOCK # 检查控制面板状态

@PJL DINQUIRE PASSWORD # 检查密码保护状态

@PJL JOB PASSWORD = [Number:0 to 65535] # 当前密码保护密码

@PJL DEFAULT PASSWORD [Number:0 to 65535] # 修改保护密码

@PJL DEFAULT CPLOCK = [ON, OFF] # 控制面板状态

@PJL SET IOBUFFER = [ON, OFF, AUTO] # 设置缓冲区

@PJL SET IOSIZE = [10-100] # 设置缓存区大小

@PJL SET PCNAME = [String] # 设置计算机名称

@PJL SET HOLD = [ON, JOB, STORE, PROOF] # 设置文件保存

@PJL SET HOLDKEY = [Number:0000 to 9999] # 设置保存文件密码

@PJL DEFAULT DISKLOCK = [ON, OFF] # 设置硬盘锁定状态

@PJL SET SPOOLTIME # 设置打印日期

@PJL SET COPIES # 设置打印数

@PJL SET JOBNAME # 设置打印机文件名称

@PJL SET RESOLUTION # 设置分辨率

@PJL SET DRIVERNAME # 设置驱动

@PJL USTATUS JOB # 输出 队列中还未打印任务的 状态

@PJL COMMENT # 添加注释

@PJL SET OUTTRAY #出纸盘(纸张输出位置)

@PJL SET ORIENTATION = [PORTRAIT, LANDSCAPE] #页面方向

@PJL SET DUPLEX = [ON, OFF] #双工模式(双面打印)

@PJL SET BINDING = [LONGEDGE, SHORTEDGE] #双工模式:短边、长边

@PJL RNVRAM ADDRESS #读取内存

@PJL OPMSG DISPLAY #设置打印机离线脱机

@PJL SET SERVICEMODE #设置服务模式

@PJL WNVRAM ADDRESS #写入内存

@PJL FSDIRLIST NAME #读取目录

@PJL FSQUERY NAME #读取文件

@PJL FSUPLOAD NAME #文件上传

@PJL FSDOWNLOAD #写入文件

由于打印机并不去判断PJL命令是谁发起的,因此,只要路由可达任何人都可以对打印机执行PJL命令操作。
我测试的时候,发现对打印机的9100端口发送任何数据,打印机都会将其打印出来。如果,通过对9100端口进行DoS,那么,打印机就会不间断的工作。

工具

  1. Hijetter.exe
  2. PRET
  3. pjl-tool
  4. print.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # coding=utf-8

    import socket
    import time
    import sys


    with open('1', 'rb') as f:
    pdata = f.read()
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((sys.argv[1],9100))
    sock.sendall(pdata)
    recv_data = sock.recv(1024)
    print recv_data
    sock.close()

总结

在对打印机进行安全测试的时候,发现了几个问题特此记录一下:
1.使用网络打印机的时候,流量报文是明文。将流量报文保存,可进行重放,将文档重新打印;

2.测试的打印机使用FTP向打印机上传文件,打印机立即打印,打印之后立马删除。不知道其他打印机是否会立即删除文件;

3.使用Python的socket可以达到快速网络数据发送。