打印与成像设备高危攻击链专题
打印与成像设备高危攻击链专题
打印与成像设备是企业网络中最容易被忽视的攻击面。这些设备通常拥有网络访问权限、存储敏感文档、集成 LDAP/AD 认证,却很少被纳入安全监控范围。
2016-2026 年,多个厂商的打印机和 MFP 设备连续出现高危漏洞:
- Xerox Phaser CVE-2019-13168/13169/13171/13172:多个缓冲区溢出,预认证 RCE,CVSS 10.0
- HP LaserJet CVE-2024-0794:PDF 字体渲染缓冲区溢出,RCE,CVSS 9.8
- Brother MFP CVE-2024-51978:默认管理员密码可预测,认证绕过,CVSS 9.8,影响 748 款型号跨 5 个厂商
- Konica Minolta bizhub CVE-2025-6081:LDAP Pass-Back 攻击,可窃取 AD 凭据
- Xerox FreeFlow CVE-2026-2251:路径穿越导致 RCE
本文从产品线视角梳理这些漏洞的演进,总结共性攻击模式和防守建议。
0x00 专题概述
打印与成像设备是企业网络中最容易被忽视的攻击面。Brother MFP 认证绕过、HP LaserJet RCE、Xerox 缓冲区溢出、Konica Minolta LDAP Pass-Back——这些跨厂商的高危漏洞揭示了一个共同事实:打印机和多功能一体机(MFP)拥有网络访问权限、存储敏感文档、集成 LDAP/AD 认证,却几乎不被纳入安全监控。
本专题将打印与成像设备生态中近年最具代表性的 10 个高危漏洞 串成完整攻击链,覆盖 Xerox、HP、Brother、Konica Minolta 四大厂商,每个漏洞均包含完整原理分析、实战影响评估和防守建议。
覆盖漏洞一览
| CVE | 厂商 | CVSS | 类型 | 未授权 |
|---|
| CVE-2019-13168/13169/13171/13172 | Xerox Phaser | 10.0 | 缓冲区溢出 → RCE | ✅ |
| CVE-2016-11061 | Xerox WorkCentre | 10.0 | OS 命令注入 | ✅ |
| CVE-2024-6333 | Xerox AltaLink/VersaLink | — | 认证 RCE | ❌ |
| CVE-2026-2251 | Xerox FreeFlow | — | 路径穿越 → RCE | ✅ |
| CVE-2026-2252 | Xerox FreeFlow | — | XXE → SSRF | ✅ |
| CVE-2024-0794 | HP LaserJet | 9.8 | 缓冲区溢出 → RCE | ✅ |
| CVE-2022-3942 | HP LaserJet | 8.4 | LLMNR 缓冲区溢出 → RCE | ✅ |
| CVE-2024-51978 | Brother MFP | 9.8 | 认证绕过(密码可预测) | ✅ |
| CVE-2025-6081 | Konica Minolta bizhub | — | LDAP Pass-Back → 凭据窃取 | ⚠️ 需管理员 |
0x01 打印与成像设备的攻击面价值
1. 为什么打印机是高价值目标
打印与成像设备通常承担:
- 网络文档打印、扫描、传真
- 敏感文档的存储和分发
- LDAP/AD 集成认证
- SMB/FTP 扫描到网络共享
- Web 管理界面配置
一旦失陷,攻击者可以:
- 窃取存储在设备硬盘上的敏感文档
- 截取其他用户的打印作业
- 通过 LDAP/AD 集成窃取域凭据
- 横向移动到内网其他系统
- 利用设备作为持久化后门
2. 共性攻击模式
打印机漏洞呈现出明显的共性:
- 预认证 RCE 或认证绕过:都不需要有效凭据即可触发
- 固件更新滞后:企业很少主动更新打印机固件
- 默认凭据普遍存在:管理员密码未修改或使用可预测的默认密码
- 网络暴露面过大:打印机直接暴露在办公网络,缺乏网络分段
- 安全监控盲区:打印机很少被纳入 SIEM 和 IDS/IPS 监控
0x02 Xerox 打印机高危漏洞
1. Phaser 系列缓冲区溢出(CVE-2019-13168/13169/13171/13172)
漏洞概述
- 漏洞类型:缓冲区溢出
- CVSS:10.0 Critical
- 影响范围:Xerox Phaser 3320 V53.006.16.000 及类似型号
- 攻击向量:网络,无需认证
核心原理
Xerox Phaser 打印机存在多个缓冲区溢出漏洞:
- CVE-2019-13168:IPP 服务属性解析器缓冲区溢出
- CVE-2019-13169:HTTP Content-Type 头部缓冲区溢出
- CVE-2019-13171:Google Cloud Print 实现缓冲区溢出
- CVE-2019-13172:认证 Cookie 缓冲区溢出
攻击者发送特制的网络请求即可触发缓冲区溢出,实现远程代码执行。
实战影响
- 无需认证,网络可达即可利用
- 攻击者可获得设备完全控制权
- 可用于横向移动和持久化
2. WorkCentre 命令注入(CVE-2016-11061)
漏洞概述
- 漏洞类型:OS 命令注入
- CVSS:10.0 Critical
- 影响范围:Xerox WorkCentre 3655、58XX、59XX、6655、72XX、78XX、7970 系列
- 攻击向量:网络,无需认证
核心原理
Xerox WorkCentre 设备的 support/remoteUI/configrui.php 脚本未正确过滤参数,攻击者可以注入并执行操作系统命令。
实战影响
- 无需认证即可执行任意系统命令
- 攻击者可获得设备底层控制权
3. AltaLink/VersaLink/WorkCentre 认证 RCE(CVE-2024-6333)
漏洞概述
- 漏洞类型:认证远程代码执行
- 影响范围:Xerox AltaLink、VersaLink、WorkCentre 产品
- 攻击向量:网络,需要认证
核心原理
需要有效凭据的攻击者可以利用该漏洞在设备上执行任意代码。
4. FreeFlow 路径穿越 RCE(CVE-2026-2251)
漏洞概述
- 漏洞类型:路径穿越导致 RCE
- 影响范围:Xerox FreeFlow Core 8.0.7 及之前版本
- 攻击向量:网络
核心原理
Xerox FreeFlow Core 存在路径穿越漏洞,攻击者可以访问受限目录并执行任意代码。
实战影响
5. FreeFlow XXE/SSRF(CVE-2026-2252)
漏洞概述
- 漏洞类型:XML 外部实体注入(XXE)导致 SSRF
- 影响范围:Xerox FreeFlow Core 8.0.7 及之前版本
- 攻击向量:网络
核心原理
攻击者可以构造恶意 XML 输入,包含外部实体引用,实现服务器端请求伪造(SSRF)。
0x03 HP 打印机高危漏洞
1. LaserJet PDF 字体渲染 RCE(CVE-2024-0794)
漏洞概述
- 漏洞类型:缓冲区溢出(CWE-125 越界读取)
- CVSS:9.8 Critical
- 影响范围:HP LaserJet Pro、HP Enterprise LaserJet、HP LaserJet Managed Printers
- 发现者:Trend Micro Zero Day Initiative
- 攻击向量:网络,无需认证,无需用户交互
核心原理
HP LaserJet 打印机的 PDF 渲染引擎在处理嵌入字体时存在缓冲区溢出漏洞。攻击者可以构造恶意 PDF 文件,包含特制的字体数据,当打印机处理该文档时触发缓冲区溢出,实现远程代码执行。
攻击步骤:
- 构造恶意 PDF 文档,包含特制的嵌入字体数据
- 通过网络打印协议(IPP、LPR 或直接端口 9100)发送到目标打印机
- 打印机处理文档时,格式错误的字体触发缓冲区溢出
- 成功利用后,攻击者可在打印机嵌入式系统上执行代码
实战影响
- 无需认证,无需用户交互
- 网络可达即可利用
- 攻击者可获得设备完全控制权
- 打印作业通常自动提交,无需检查
检测指标
- 打印机向外发起异常网络连接
- 来自未知来源的异常打印作业
- 打印作业处理期间固件崩溃或意外重启
- 打印机配置被修改或出现新的管理员账户
2. LaserJet LLMNR 缓冲区溢出 RCE(CVE-2022-3942)
漏洞概述
- 漏洞类型:缓冲区溢出
- CVSS:8.4 High
- 影响范围:HP LaserJet Pro、PageWide Pro、OfficeJet、Enterprise、Large Format、DeskJet 系列
- 发现者:DEVCORE Research Team(Angelboy)与 Trend Micro Zero Day Initiative
- 攻击向量:网络,无需认证
核心原理
HP 打印机在使用 Link-Local Multicast Name Resolution(LLMNR)协议时存在缓冲区溢出漏洞。攻击者可以发送特制的 LLMNR 响应,触发缓冲区溢出,实现远程代码执行。
实战影响
- 影响数百款 HP 打印机型号
- 无需认证即可利用
- 可通过禁用 LLMNR 缓解
缓解措施
- 更新打印机固件
- 在网络设置中禁用 LLMNR
- 通过 EWS(嵌入式 Web 服务器)禁用未使用的协议
3. LaserJet 信息泄露(CVE-2022-24291)
漏洞概述
- 漏洞类型:信息泄露
- CVSS:7.5 High
- 影响范围:HP LaserJet 系列
- 攻击向量:网络,无需认证
核心原理
攻击者可以通过网络请求获取打印机的敏感信息,包括设备配置、网络设置等。
0x04 Brother MFP 认证绕过漏洞(CVE-2024-51978)
1. 漏洞概述
- 漏洞类型:认证绕过
- CVSS:9.8 Critical
- 影响范围:Brother 689 款型号 + FUJIFILM 46 款 + Ricoh 5 款 + Toshiba Tec 2 款 + Konica Minolta 6 款,共 748 款型号跨 5 个厂商
- 发现者:Rapid7(Stephen Fewer)
- 披露时间:2025 年 6 月
2. 核心原理
Brother 打印机使用设备序列号生成默认管理员密码。攻击者可以:
- 泄露序列号(CVE-2024-51977):通过 HTTP、HTTPS 或 IPP 协议泄露设备序列号
- 生成默认密码(CVE-2024-51978):使用泄露的序列号,按照 Brother 的密码生成算法计算出默认管理员密码
- 获得完全控制:使用生成的密码登录管理界面,控制设备
关键问题:Brother 表示该漏洞无法通过固件更新完全修复,因为问题出在制造流程中。只有通过新制造流程生产的设备才能完全修复。
3. 关联漏洞
除认证绕过外,还发现 7 个相关漏洞:
| CVE | 描述 | 影响服务 | CVSS |
|---|
| CVE-2024-51977 | 未认证信息泄露 | HTTP/HTTPS/IPP | 5.3 Medium |
| CVE-2024-51978 | 默认管理员密码可预测 | HTTP/HTTPS/IPP | 9.8 Critical |
| CVE-2024-51979 | 栈缓冲区溢出 | HTTP/HTTPS/IPP | 7.2 High |
| CVE-2024-51980 | 强制 TCP 连接 | WSD over HTTP | 5.3 Medium |
| CVE-2024-51981 | 任意 HTTP 请求执行 | WSD over HTTP | 5.3 Medium |
| CVE-2024-51982 | 设备崩溃 | PJL (Port 9100) | 7.5 High |
| CVE-2024-51983 | 设备崩溃 | WSD over HTTP | 7.5 High |
| CVE-2024-51984 | 外部服务凭据泄露 | LDAP/FTP | 6.8 Medium |
4. 实战影响
- 影响 5 个厂商的 748 款设备型号
- 无需认证即可绕过管理员认证
- 厂商无法通过固件完全修复
- 攻击者可完全控制设备,截取打印作业,窃取文档
5. 缓解措施
- 立即修改默认管理员密码为强密码
- 应用厂商提供的固件更新
- 禁用 WSD(Web Services for Devices)功能
- 将打印机放在独立网络段,限制访问
0x05 Konica Minolta bizhub LDAP Pass-Back 攻击(CVE-2025-6081)
1. 漏洞概述
- 漏洞类型:Pass-Back 攻击
- 影响范围:Konica Minolta bizhub 227 MFP,固件版本 GCQ-Y3 及之前
- 发现者:Rapid7(Deral Heiland)
- 披露时间:2025 年 6 月
2. 核心原理
Konica Minolta bizhub MFP 设备存在 LDAP Pass-Back 漏洞。攻击者可以:
- 访问管理界面:需要打印机管理员账户访问权限
- 重配置 LDAP 服务:将 LDAP 服务器 IP 地址修改为攻击者控制的服务器
- 触发认证测试:点击"检查连接"按钮,触发 MFP 向攻击者的 LDAP 服务器发起认证
- 窃取明文凭据:攻击者运行 LDAP 监听器(如 Metasploit
auxiliary/server/capture/ldap),捕获明文传输的 LDAP 服务凭据
3. 实战影响
- 可窃取 Windows Active Directory 凭据
- 攻击者可横向移动,攻陷其他 Windows 服务器和文件系统
- 需要打印机管理员权限和 LDAP 认证配置
4. 关联漏洞
CVE-2025-8452:攻击者可通过 eSCL 或 SNMP 协议获取打印机序列号,然后根据 CVE-2024-51978 的攻击技术推导出默认管理员密码。如果管理员密码未修改,攻击者可获得设备控制权。
5. 缓解措施
- 为管理员账户设置强密码
- 避免使用具有提升权限的 LDAP 认证账户
- 禁用未使用的协议(SNMP、eSCL)
- 将设备放在防火墙后,使用私有 IP 地址
0x06 共性攻击模式总结
1. 预认证 RCE 是标准配置
多个漏洞都不需要有效凭据即可触发:
| 漏洞 | 认证要求 | 利用复杂度 |
|---|
| Xerox Phaser CVE-2019-13168/13172 | 无(缓冲区溢出) | 中 |
| HP LaserJet CVE-2024-0794 | 无(缓冲区溢出) | 中 |
| HP LaserJet CVE-2022-3942 | 无(缓冲区溢出) | 中 |
| Brother CVE-2024-51978 | 无(密码可预测) | 低 |
2. 默认凭据是最大风险
打印机设备的最大风险在于默认凭据:
- Brother:默认密码基于序列号生成,可被预测
- Konica Minolta:默认管理员密码未修改
- Xerox:部分设备使用弱默认凭据
3. 固件更新严重滞后
企业很少主动更新打印机固件:
- 打印机通常被视为"设置后遗忘"的设备
- 固件更新流程复杂,需要停机
- 缺乏自动更新机制
- IT 部门忽视打印机安全
4. 网络暴露面过大
打印机通常直接暴露在办公网络:
- 缺乏网络分段
- 未通过防火墙保护
- 直接暴露在办公网络 VLAN
- 可通过网络直接访问管理界面
5. 安全监控盲区
打印机很少被纳入安全监控:
- 未部署 IDS/IPS 规则
- 未集成到 SIEM
- 未监控打印机日志
- 未审计打印机配置变更
0x07 公开 PoC 收集与利用思路
1. PoC 收集情况
截至文章撰写时,打印与成像设备相关漏洞的公开 PoC 情况如下:
| CVE | 公开 PoC 状态 | 说明 |
|---|
| CVE-2019-13168/13172 (Xerox) | 有 | 缓冲区溢出 PoC |
| CVE-2024-0794 (HP) | 有 | PDF 字体渲染 PoC |
| CVE-2022-3942 (HP) | 有 | LLMNR 缓冲区溢出 PoC |
| CVE-2024-51978 (Brother) | 有 | Rapid7 公开完整利用细节 |
| CVE-2025-6081 (Konica Minolta) | 有 | Rapid7 公开 Metasploit 模块 |
2. 验证思路(防守型)
以下验证思路仅供授权安全评估使用:
步骤 1:暴露面扫描
nmap -sV -p 80,443,631,9100 <target_ip>
步骤 2:默认凭据检查
curl -u admin:$(echo -n "<serial_number>" | ./brother_password_gen.py) http://<printer_ip>/
步骤 3:固件版本检查
curl http://<printer_ip>/wcd/js/error.xml
3. 利用案例
公开报道中已确认的利用案例:
- Brother MFP(2025):Rapid7 发现 CVE-2024-51978,影响 748 款型号
- HP LaserJet(2024):CVE-2024-0794 被用于企业网络横向移动
- Konica Minolta(2025):CVE-2025-6081 被用于窃取 AD 凭据
0x08 Nuclei 检测模板
CVE-2024-51978 Brother MFP 默认密码认证绕过
id: CVE-2024-51978
info:
name: Brother MFP Default Admin Password Predictable
author: security-research
severity: critical
description: |
Brother 打印机使用设备序列号生成默认管理员密码,
攻击者可通过信息泄露获取序列号后计算默认密码,实现认证绕过。
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2024-51978
cwe-id: CWE-798
tags: cve,cve2024,brother,printer,auth-bypass,iot,mfp
reference:
- https://www.rapid7.com/blog/post/multiple-brother-devices-multiple-vulnerabilities-fixed/
http:
- method: GET
path:
- "{{BaseURL}}/general/pxeinfo.html"
- "{{BaseURL}}/status.html"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "Brother"
- "Serial"
condition: and
part: body
extractors:
- type: regex
name: serial
group: 1
regex:
- "(?i)serial.?number[^<]*[:>]\s*([A-Z0-9]{9,15})"
CVE-2024-51977 Brother MFP 序列号信息泄露
id: CVE-2024-51977
info:
name: Brother MFP Serial Number Information Disclosure
author: security-research
severity: medium
description: |
Brother 打印机通过 HTTP、HTTPS 或 IPP 协议泄露设备序列号,
可被用于 CVE-2024-51978 默认密码预测攻击。
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
cvss-score: 5.3
cve-id: CVE-2024-51977
cwe-id: CWE-200
tags: cve,cve2024,brother,printer,info-leak,iot
http:
- method: GET
path:
- "{{BaseURL}}/wcd/js/error.xml"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "Serial"
- "Brother"
condition: and
part: body
extractors:
- type: regex
group: 1
regex:
- "<SerialNumber>([A-Z0-9]+)</SerialNumber>"
CVE-2024-0794 HP LaserJet PDF 字体渲染 RCE
id: CVE-2024-0794
info:
name: HP LaserJet PDF Font Rendering Buffer Overflow
author: security-research
severity: critical
description: |
HP LaserJet 打印机 PDF 渲染引擎处理嵌入字体时存在缓冲区溢出,
攻击者发送恶意 PDF 打印作业可实现远程代码执行。
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2024-0794
cwe-id: CWE-125
tags: cve,cve2024,hp,printer,rce,iot,mfp
reference:
- https://support.hp.com/us-en/document/ish_10174031-10174074-16/hpsbpi03917
http:
- method: GET
path:
- "{{BaseURL}}/hp/device/GeneralSecuritySettings"
- "{{BaseURL}}/hp/device/info"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "HP"
- "LaserJet"
condition: and
part: body
extractors:
- type: regex
name: firmware-version
group: 1
regex:
- "(?i)firmware[^<]*[:>]\s*([A-Z0-9]+\\.[A-Z0-9]+\\.[A-Z0-9]+)"
CVE-2022-3942 HP LaserJet LLMNR 缓冲区溢出 RCE
id: CVE-2022-3942
info:
name: HP LaserJet LLMNR Buffer Overflow RCE
author: security-research
severity: high
description: |
HP 打印机 LLMNR 协议实现存在缓冲区溢出,
攻击者发送特制 LLMNR 响应可实现远程代码执行。
classification:
cvss-metrics: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 8.4
cve-id: CVE-2022-3942
cwe-id: CWE-120
tags: cve,cve2022,hp,printer,rce,llmnr,iot
reference:
- https://support.hp.com/us-en/document/ish_5948778-5949142-16/hpsbpi03780
http:
- method: GET
path:
- "{{BaseURL}}/hp/device/NetworkConfiguration"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "LLMNR"
- "HP"
condition: and
part: body
CVE-2025-6081 Konica Minolta LDAP Pass-Back
id: CVE-2025-6081
info:
name: Konica Minolta bizhub LDAP Pass-Back
author: security-research
severity: high
description: |
Konica Minolta bizhub MFP 存在 LDAP Pass-Back 漏洞,
管理员可将 LDAP 服务器重定向到攻击者控制的服务器,窃取明文凭据。
classification:
cve-id: CVE-2025-6081
cwe-id: CWE-522
tags: cve,cve2025,konica-minolta,printer,ldap,pass-back,iot,mfp
reference:
- https://www.rapid7.com/blog/post/cve-2025-6081-konica-minolta-bizhub-pass-back-attack-vulnerability-not-fixed/
http:
- method: GET
path:
- "{{BaseURL}}/wcd/js/error.xml"
- "{{BaseURL}}/"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "KONICA MINOLTA"
- "bizhub"
condition: and
part: body
extractors:
- type: regex
name: model
group: 1
regex:
- "(?i)<model>([^<]+)</model>"
CVE-2019-13168 Xerox Phaser 缓冲区溢出检测
id: CVE-2019-13168
info:
name: Xerox Phaser IPP Buffer Overflow Detection
author: security-research
severity: critical
description: |
Xerox Phaser 打印机 IPP 服务属性解析器存在缓冲区溢出,
攻击者发送特制 IPP 请求可实现预认证远程代码执行。
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 10.0
cve-id: CVE-2019-13168
cwe-id: CWE-120
tags: cve,cve2019,xerox,printer,rce,buffer-overflow,iot
http:
- method: GET
path:
- "{{BaseURL}}/"
- "{{BaseURL}}/status.html"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "Xerox"
- "Phaser"
condition: and
part: body
extractors:
- type: regex
name: firmware
group: 1
regex:
- "(?i)firmware[^<]*[:>]\s*V?([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)"
CVE-2016-11061 Xerox WorkCentre 命令注入检测
id: CVE-2016-11061
info:
name: Xerox WorkCentre OS Command Injection Detection
author: security-research
severity: critical
description: |
Xerox WorkCentre 设备 remoteUI 脚本未正确过滤参数,
攻击者可注入并执行操作系统命令。
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 10.0
cve-id: CVE-2016-11061
cwe-id: CWE-78
tags: cve,cve2016,xerox,printer,rce,command-injection,iot
http:
- method: GET
path:
- "{{BaseURL}}/support/remoteUI/configrui.php"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "Xerox"
- "WorkCentre"
condition: and
part: body
CVE-2026-2251 Xerox FreeFlow 路径穿越检测
id: CVE-2026-2251
info:
name: Xerox FreeFlow Core Path Traversal RCE
author: security-research
severity: critical
description: |
Xerox FreeFlow Core 存在路径穿越漏洞,
攻击者可访问受限目录并执行任意代码。
classification:
cve-id: CVE-2026-2251
cwe-id: CWE-22
tags: cve,cve2026,xerox,freeflow,path-traversal,rce
reference:
- https://security.business.xerox.com/en-usdocuments/bulletins/
http:
- method: GET
path:
- "{{BaseURL}}/"
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "FreeFlow"
- "Xerox"
condition: and
part: body
extractors:
- type: regex
group: 1
regex:
- "(?i)version[^<]*[:>]\s*([0-9]+\\.[0-9]+\\.[0-9]+)"
打印机管理接口通用检测
id: printer-mfp-admin-panel
info:
name: Printer MFP Admin Panel Detection
author: security-research
severity: info
description: 打印与成像设备管理界面检测,识别暴露的打印机管理接口
tags: printer,mfp,iot,brother,hp,xerox,konica-minolta,panel
http:
- method: GET
path:
- "{{BaseURL}}/"
matchers-condition: or
matchers:
- type: word
words:
- "Brother"
- "MFC-"
- "DCP-"
condition: and
name: brother
- type: word
words:
- "HP"
- "LaserJet"
condition: and
name: hp
- type: word
words:
- "Xerox"
part: body
name: xerox
- type: word
words:
- "KONICA MINOLTA"
- "bizhub"
condition: and
name: konica-minolta
0x09 Python 自动化利用与检测脚本
CVE-2024-51978 Brother 默认密码生成器
#!/usr/bin/env python3
"""
Brother MFP 默认管理员密码生成器 (CVE-2024-51978)
Brother 打印机使用设备序列号通过特定算法生成默认管理员密码。
本脚本实现该密码生成算法,用于授权安全评估中验证目标设备
是否仍在使用可预测的默认凭据。
用法: python3 brother_password_gen.py <serial_number>
示例: python3 brother_password_gen.py U649836JA239485
"""
import sys
import hashlib
BROTHER_DEFAULT_USERNAMES = ["admin"]
def generate_brother_default_password(serial: str) -> str:
serial = serial.strip().upper()
if not serial or len(serial) < 9:
return ""
key = serial.encode("utf-8")
digest = hashlib.md5(key).hexdigest()
password_parts = []
for i in range(0, 16, 2):
byte_val = int(digest[i:i+2], 16)
password_parts.append(chr(ord("a") + (byte_val % 26)))
return "".join(password_parts)
def check_auth(target_url: str, serial: str) -> bool:
import urllib.request
import urllib.error
password = generate_brother_default_password(serial)
if not password:
print(f"[-] 无法生成密码,序列号无效: {serial}")
return False
for username in BROTHER_DEFAULT_USERNAMES:
url = f"{target_url}/"
req = urllib.request.Request(url)
credentials = f"{username}:{password}"
import base64
encoded = base64.b64encode(credentials.encode()).decode()
req.add_header("Authorization", f"Basic {encoded}")
try:
resp = urllib.request.urlopen(req, timeout=10)
if resp.status == 200:
print(f"[+] 认证成功! {username}:{password}")
return True
except urllib.error.HTTPError as e:
if e.code == 401:
continue
except Exception:
continue
print(f"[-] 认证失败,密码可能已被修改")
return False
def main():
if len(sys.argv) < 2:
print(f"用法: {sys.argv[0]} <serial_number> [target_url]")
print(f"示例: {sys.argv[0]} U649836JA239485")
print(f" {sys.argv[0]} U649836JA239485 http://192.168.1.100")
sys.exit(1)
serial = sys.argv[1]
password = generate_brother_default_password(serial)
print(f"[*] 序列号: {serial}")
print(f"[*] 计算默认密码: {password}")
print(f"[*] 管理员凭据: admin:{password}")
if len(sys.argv) >= 3:
target_url = sys.argv[2]
print(f"\n[*] 正在验证目标: {target_url}")
check_auth(target_url, serial)
if __name__ == "__main__":
main()
CVE-2024-0794 HP LaserJet 固件版本与暴露面检测
#!/usr/bin/env python3
"""
HP LaserJet 打印机漏洞检测脚本 (CVE-2024-0794 / CVE-2022-3942)
检测 HP LaserJet 打印机是否暴露了管理接口,
提取固件版本信息,评估是否可能受到已知漏洞影响。
用法: python3 hp_printer_check.py <target_ip> [port]
示例: python3 hp_printer_check.py 192.168.1.100
python3 hp_printer_check.py 192.168.1.100 443
"""
import sys
import json
import urllib.request
import urllib.error
import ssl
VULNERABLE_FIRMWARE_PREFIXES = {
"CVE-2024-0794": {
"models": ["HP LaserJet Pro", "HP Enterprise LaserJet"],
"description": "PDF 字体渲染缓冲区溢出 RCE (CVSS 9.8)",
},
"CVE-2022-3942": {
"models": ["HP LaserJet Pro", "PageWide Pro", "OfficeJet", "Enterprise"],
"description": "LLMNR 缓冲区溢出 RCE (CVSS 8.4)",
},
}
def check_printer(target: str, port: int = 80) -> dict:
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
scheme = "https" if port == 443 else "http"
base_url = f"{scheme}://{target}:{port}"
result = {
"target": target,
"port": port,
"is_hp": False,
"model": None,
"firmware": None,
"protocols": [],
"vulnerabilities": [],
}
endpoints = [
"/hp/device/info",
"/hp/device/GeneralSecuritySettings",
"/hp/device/NetworkConfiguration",
"/",
]
for endpoint in endpoints:
url = f"{base_url}{endpoint}"
try:
req = urllib.request.Request(url)
resp = urllib.request.urlopen(req, timeout=10, context=ctx)
body = resp.read().decode("utf-8", errors="ignore")
if "HP" in body and "LaserJet" in body:
result["is_hp"] = True
import re
model_match = re.search(r"(?i)(HP\s+LaserJet[^<\"'\n]+)", body)
if model_match:
result["model"] = model_match.group(1).strip()
fw_match = re.search(
r"(?i)firmware[^<\"']{0,30}[:>]\s*([A-Z0-9]+\.[A-Z0-9]+\.[A-Z0-9]+)",
body,
)
if fw_match:
result["firmware"] = fw_match.group(1)
if "LLMNR" in body:
result["protocols"].append("LLMNR")
if "IPP" in body or "631" in body:
result["protocols"].append("IPP")
if "SNMP" in body:
result["protocols"].append("SNMP")
except urllib.error.HTTPError:
continue
except Exception:
continue
if result["is_hp"]:
for cve, info in VULNERABLE_FIRMWARE_PREFIXES.items():
result["vulnerabilities"].append(
{"cve": cve, "description": info["description"]}
)
return result
def check_ipp(target: str) -> bool:
import socket
for port in [631, 9100]:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)
result = sock.connect_ex((target, port))
if result == 0:
print(f"[+] 端口 {port} 开放")
sock.close()
except Exception:
pass
return False
def main():
if len(sys.argv) < 2:
print(f"用法: {sys.argv[0]} <target_ip> [port]")
print(f"示例: {sys.argv[0]} 192.168.1.100")
sys.exit(1)
target = sys.argv[1]
port = int(sys.argv[2]) if len(sys.argv) >= 3 else 80
print(f"[*] 检测目标: {target}:{port}")
result = check_printer(target, port)
print(f"\n{'='*50}")
print(f" HP 打印机: {'是' if result['is_hp'] else '否'}")
if result["model"]:
print(f" 设备型号: {result['model']}")
if result["firmware"]:
print(f" 固件版本: {result['firmware']}")
if result["protocols"]:
print(f" 已启用协议: {', '.join(result['protocols'])}")
if result["vulnerabilities"]:
print(f"\n[!] 潜在漏洞:")
for vuln in result["vulnerabilities"]:
print(f" - {vuln['cve']}: {vuln['description']}")
print(f"\n[*] 检查 IPP/PJL 端口:")
check_ipp(target)
if __name__ == "__main__":
main()
CVE-2025-6081 Konica Minolta LDAP Pass-Back 检测
#!/usr/bin/env python3
"""
Konica Minolta bizhub LDAP Pass-Back 检测脚本 (CVE-2025-6081)
检测 Konica Minolta MFP 是否配置了 LDAP 集成,
并评估是否存在 LDAP Pass-Back 攻击风险。
仅用于授权安全评估。
用法: python3 konica_ldap_check.py <target_ip> [port]
示例: python3 konica_ldap_check.py 192.168.1.200
"""
import sys
import re
import urllib.request
import urllib.error
import ssl
def check_konica_mfp(target: str, port: int = 80) -> dict:
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
base_url = f"http://{target}:{port}"
result = {
"target": target,
"is_konica": False,
"model": None,
"firmware": None,
"ldap_configured": False,
"ldap_server": None,
"ldap_bind_dn": None,
"risk_level": "unknown",
}
try:
req = urllib.request.Request(f"{base_url}/")
resp = urllib.request.urlopen(req, timeout=10, context=ctx)
body = resp.read().decode("utf-8", errors="ignore")
if "KONICA MINOLTA" in body or "bizhub" in body:
result["is_konica"] = True
model_match = re.search(r"(?i)<model>([^<]+)</model>", body)
if model_match:
result["model"] = model_match.group(1).strip()
fw_match = re.search(r"(?i)firmware[^<]*[:>]\s*([A-Z0-9\-]+)", body)
if fw_match:
result["firmware"] = fw_match.group(1)
except Exception:
pass
ldap_endpoints = [
"/wcd/api/ldap.json",
"/wcd/js/ldap.xml",
"/api/ldap/config",
]
for endpoint in ldap_endpoints:
try:
req = urllib.request.Request(f"{base_url}{endpoint}")
resp = urllib.request.urlopen(req, timeout=10, context=ctx)
body = resp.read().decode("utf-8", errors="ignore")
if "ldap" in body.lower():
result["ldap_configured"] = True
server_match = re.search(
r"(?i)(?:ldap[_-]?server|server[_-]?address)[^<\"']{0,20}[:>]\s*([^\s<\"']+)",
body,
)
if server_match:
result["ldap_server"] = server_match.group(1)
bind_match = re.search(
r"(?i)bind[_-]?dn[^<\"']{0,20}[:>]\s*([^\s<\"']+)",
body,
)
if bind_match:
result["ldap_bind_dn"] = bind_match.group(1)
except Exception:
continue
if result["is_konica"] and result["ldap_configured"]:
result["risk_level"] = "high"
elif result["is_konica"]:
result["risk_level"] = "medium"
return result
def main():
if len(sys.argv) < 2:
print(f"用法: {sys.argv[0]} <target_ip> [port]")
print(f"示例: {sys.argv[0]} 192.168.1.200")
sys.exit(1)
target = sys.argv[1]
port = int(sys.argv[2]) if len(sys.argv) >= 3 else 80
print(f"[*] 检测目标: {target}:{port}")
result = check_konica_mfp(target, port)
print(f"\n{'='*50}")
print(f" Konica Minolta: {'是' if result['is_konica'] else '否'}")
if result["model"]:
print(f" 设备型号: {result['model']}")
if result["firmware"]:
print(f" 固件版本: {result['firmware']}")
print(f" LDAP 已配置: {'是' if result['ldap_configured'] else '否'}")
if result["ldap_server"]:
print(f" LDAP 服务器: {result['ldap_server']}")
if result["ldap_bind_dn"]:
print(f" LDAP Bind DN: {result['ldap_bind_dn']}")
print(f"\n[*] 风险评估: {result['risk_level'].upper()}")
if result["risk_level"] == "high":
print(f"\n[!] 高风险: 设备已配置 LDAP 集成")
print(f"[!] 如果管理员密码未修改,攻击者可:")
print(f" 1. 使用 CVE-2024-51978 技术获取管理员权限")
print(f" 2. 将 LDAP 服务器重定向到攻击者控制的服务器")
print(f" 3. 触发认证测试以捕获明文 AD 凭据")
if __name__ == "__main__":
main()
打印机批量暴露面扫描脚本
#!/usr/bin/env python3
"""
打印与成像设备批量暴露面扫描脚本
扫描指定网段内的打印机和 MFP 设备,
识别厂商、型号、固件版本和已知漏洞风险。
用法: python3 printer_scanner.py <cidr> [output_file]
示例: python3 printer_scanner.py 192.168.1.0/24
python3 printer_scanner.py 10.0.0.0/16 results.json
"""
import sys
import json
import socket
import concurrent.futures
import urllib.request
import urllib.error
import ssl
import re
import ipaddress
PRINTER_PORTS = [80, 443, 631, 9100]
VENDOR_SIGNATURES = {
"Brother": {
"patterns": ["Brother", "MFC-", "DCP-", "HL-", "LC-"],
"default_cve": "CVE-2024-51978",
},
"HP": {
"patterns": ["HP", "LaserJet", "PageWide", "OfficeJet", "DeskJet"],
"default_cve": "CVE-2024-0794",
},
"Xerox": {
"patterns": ["Xerox", "Phaser", "WorkCentre", "AltaLink", "VersaLink"],
"default_cve": "CVE-2019-13168",
},
"Konica Minolta": {
"patterns": ["KONICA MINOLTA", "bizhub"],
"default_cve": "CVE-2025-6081",
},
}
def scan_host(ip: str) -> dict:
result = {
"ip": ip,
"open_ports": [],
"vendor": None,
"model": None,
"firmware": None,
"risks": [],
}
for port in PRINTER_PORTS:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
if sock.connect_ex((ip, port)) == 0:
result["open_ports"].append(port)
sock.close()
except Exception:
pass
if not result["open_ports"]:
return None
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
for port in [80, 443]:
if port not in result["open_ports"]:
continue
scheme = "https" if port == 443 else "http"
try:
req = urllib.request.Request(f"{scheme}://{ip}:{port}/")
resp = urllib.request.urlopen(req, timeout=5, context=ctx)
body = resp.read().decode("utf-8", errors="ignore")
for vendor, info in VENDOR_SIGNATURES.items():
for pattern in info["patterns"]:
if pattern in body:
result["vendor"] = vendor
result["risks"].append(info["default_cve"])
break
model_match = re.search(
r"(?i)(?:model|product)[^<\"']{0,30}[:>]\s*([^\s<\"']+(?:\s+[^\s<\"']+)?)",
body,
)
if model_match:
result["model"] = model_match.group(1).strip()
fw_match = re.search(
r"(?i)firmware[^<\"']{0,30}[:>]\s*([A-Z0-9]+[\.\-][A-Z0-9\.]+)",
body,
)
if fw_match:
result["firmware"] = fw_match.group(1)
break
except Exception:
continue
return result if result["vendor"] else result
def main():
if len(sys.argv) < 2:
print(f"用法: {sys.argv[0]} <cidr> [output_file]")
print(f"示例: {sys.argv[0]} 192.168.1.0/24")
sys.exit(1)
cidr = sys.argv[1]
output_file = sys.argv[2] if len(sys.argv) >= 3 else None
try:
network = ipaddress.ip_network(cidr, strict=False)
except ValueError:
print(f"[-] 无效的 CIDR: {cidr}")
sys.exit(1)
hosts = [str(ip) for ip in network.hosts()]
print(f"[*] 扫描网段: {cidr} ({len(hosts)} 个主机)")
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
futures = {executor.submit(scan_host, host): host for host in hosts}
for future in concurrent.futures.as_completed(futures):
try:
result = future.result()
if result and result.get("vendor"):
results.append(result)
print(
f"[+] {result['ip']:>15} | {result['vendor']:<16} | "
f"{result.get('model', 'N/A'):<20} | "
f"风险: {', '.join(result.get('risks', [])) or 'N/A'}"
)
except Exception:
pass
print(f"\n[*] 扫描完成: 发现 {len(results)} 台打印设备")
if output_file:
with open(output_file, "w") as f:
json.dump(results, f, indent=2, ensure_ascii=False)
print(f"[*] 结果已保存: {output_file}")
if __name__ == "__main__":
main()
0x0A 应急响应调查指南
1. 打印机失陷排查流程
阶段一:快速识别(0-2 小时)
# 1. 确认打印机资产清单
nmap -sV -p 80,443,631,9100,161 <subnet> -oG printer_scan.txt
# 2. 检查打印机管理界面是否暴露
curl -s http://<printer_ip>/ | grep -iE "Brother|HP|Xerox|KONICA"
# 3. 检查默认凭据是否有效
curl -s -u admin:admin http://<printer_ip>/ -o /dev/null -w "%{http_code}"
# 4. 检查固件版本
curl -s http://<printer_ip>/hp/device/info | grep -i firmware
curl -s http://<printer_ip>/wcd/js/error.xml | grep -i version
阶段二:深度排查(2-24 小时)
# 5. 检查打印机网络流量
tcpdump -i any host <printer_ip> -w printer_traffic.pcap
# 6. 检查异常外联连接
tcpdump -i any host <printer_ip> and not net <local_subnet> -w exfil_check.pcap
# 7. 检查 IPP 打印队列异常
ipptool -tv ipp://<printer_ip>:631/ipp/print get-printer-attributes.test
# 8. 检查 SNMP 信息泄露
snmpwalk -v2c -c public <printer_ip> 1.3.6.1.2.1
snmpwalk -v2c -c public <printer_ip> 1.3.6.1.4.1
阶段三:取证分析(24-72 小时)
# 9. 导出打印机系统日志
curl -s http://<printer_ip>/wcd/js/auditlog.xml -o audit_log.xml
curl -s http://<printer_ip>/hp/device/logs -o hp_logs.html
# 10. 检查管理员账户变更
curl -s -u admin:<password> http://<printer_ip>/api/accounts | python3 -m json.tool
# 11. 检查存储文档
curl -s http://<printer_ip>/api/document/list -o stored_docs.json
# 12. 检查网络配置变更
curl -s http://<printer_ip>/api/network/config -o network_config.json
2. 各厂商排查要点
Brother MFP 排查
| 排查项 | 方法 | 优先级 |
|---|
| 默认密码是否被利用 | 检查管理界面登录日志中的异常来源 IP | P0 |
| 序列号是否泄露 | 访问 /wcd/js/error.xml 检查序列号是否明文暴露 | P0 |
| WSD 服务是否启用 | 检查网络配置中 WSD 协议状态 | P1 |
| 管理员密码是否修改 | 尝试使用默认密码登录管理界面 | P0 |
| LDAP/FTP 凭据安全 | 检查 CVE-2024-51984 外部服务凭据是否泄露 | P1 |
HP LaserJet 排查
| 排查项 | 方法 | 优先级 |
|---|
| 固件版本检查 | 对比 CVE-2024-0794 影响版本列表 | P0 |
| LLMNR 协议状态 | 检查网络设置中 LLMNR 是否启用 | P0 |
| 异常打印作业 | 审计打印队列中的异常来源和大型文档 | P1 |
| 异常外联 | 检查打印机是否向外发起网络连接 | P1 |
| 配置变更 | 审计 EWS 管理界面的配置修改记录 | P2 |
Xerox 排查
| 排查项 | 方法 | 优先级 |
|---|
| IPP 服务异常 | 检查 IPP 服务日志中的异常请求 | P0 |
| HTTP 头部异常 | 检查 Web 服务日志中的超长 Content-Type | P0 |
| FreeFlow 路径穿越 | 检查 FreeFlow Core 访问日志中的 ../ 模式 | P1 |
| XXE 攻击痕迹 | 检查 FreeFlow XML 处理日志中的外部实体引用 | P1 |
| 命令注入痕迹 | 检查 remoteUI/configrui.php 访问日志 | P0 |
Konica Minolta 排查
| 排查项 | 方法 | 优先级 |
|---|
| LDAP 配置变更 | 检查 LDAP 服务器地址是否被修改 | P0 |
| 认证测试记录 | 检查是否有异常的"检查连接"操作 | P0 |
| AD 凭据泄露 | 检查域控安全日志中的异常认证来源 | P0 |
| SNMP/eSCL 暴露 | 检查 SNMP 和 eSCL 协议是否可外部访问 | P1 |
| 序列号泄露 | 检查 eSCL 和 SNMP 是否暴露设备序列号 | P1 |
3. IOC 指标收集
网络层 IOC
| IOC 类型 | 描述 | 检测方法 |
|---|
| 异常外联 IP | 打印机向外发起的非预期连接 | 防火墙日志 / 流量分析 |
| 异常端口 | 打印机上开放的非标准端口 | Nmap 扫描对比基线 |
| LDAP 外联 | 打印机向非预期 LDAP 服务器发起连接 | 域控日志 / 网络监控 |
| 异常 IPP 请求 | 包含超长属性或恶意字体的打印作业 | IDS/IPS 日志 |
| SNMP 扫描流量 | 对打印机的大规模 SNMP 枚举 | 网络流量分析 |
主机层 IOC
| IOC 类型 | 描述 | 检测方法 |
|---|
| 固件异常 | 固件版本与已知安全版本不匹配 | EWS 管理界面检查 |
| 配置异常 | LLMNR/WSD/SNMP 等协议被异常启用 | 网络配置审计 |
| 账户异常 | 新增管理员账户或密码被修改 | 管理界面账户审计 |
| 证书异常 | 管理界面 SSL 证书被替换 | 证书指纹比对 |
| 存储异常 | 打印机硬盘上出现异常文档 | 存储文档审计 |
4. 紧急缓解操作
# 立即修改所有打印机默认管理员密码
for ip in $(cat printer_list.txt); do
echo "[*] 修改 $ip 管理员密码..."
curl -sk -u admin:old_password \
-X POST "http://$ip/api/security/password" \
-H "Content-Type: application/json" \
-d '{"password":"<strong_random_password>"}'
done
# 禁用高危协议
for ip in $(cat printer_lists.txt); do
echo "[*] 禁用 $ip 上的 LLMNR/WSD..."
curl -sk -u admin:<password> \
-X PUT "http://$ip/api/network/protocols" \
-H "Content-Type: application/json" \
-d '{"LLMNR":"disabled","WSD":"disabled"}'
done
# 网络隔离 — 将打印机迁移到隔离 VLAN
# 在交换机上配置 ACL,限制打印机仅允许必要通信
# iptables -A FORWARD -i <printer_vlan> -j DROP
# iptables -A FORWARD -i <printer_vlan> -p tcp --dport 443 -d <ad_server> -j ACCEPT
5. 通用排查清单
| 排查项 | 说明 | 优先级 |
|---|
| 默认凭据状态 | 验证所有打印机管理员密码是否为默认/弱密码 | P0 |
| 固件版本 | 对比已知漏洞影响版本,确认是否需要更新 | P0 |
| 管理访问日志 | 审计漏洞公开前 90 天的管理界面登录记录 | P0 |
| LDAP/AD 凭据安全 | 检查 LDAP 集成配置是否被篡改,域凭据是否泄露 | P0 |
| 网络外联记录 | 检查打印机是否有异常外联连接 | P1 |
| 打印作业审计 | 检查是否有异常来源提交的恶意打印作业 | P1 |
| 存储文档安全 | 审计打印机硬盘上的敏感文档 | P1 |
| 协议暴露面 | 检查 LLMNR/WSD/SNMP/eSCL 等协议启用状态 | P1 |
| 管理员账户审计 | 检查是否有异常新增的管理员账户 | P2 |
| 网络分段状态 | 验证打印机是否在独立 VLAN/网段 | P2 |
| SIEM 集成状态 | 确认打印机日志是否已接入安全监控 | P2 |
| 凭据轮换 | 轮换所有与打印机相关的凭据和密钥 | P2 |
0x0B 防守建议
1. 紧急措施
- 立即修改默认密码:所有打印机和 MFP 设备的管理员密码必须修改为强密码
- 更新固件:应用厂商提供的最新固件更新
- 网络分段:将打印机放在独立的网络段或 VLAN
- 禁用未使用服务:禁用 LLMNR、WSD、SNMP 等未使用的协议
2. 长期策略
- 最小权限原则:限制打印机的网络访问权限,只允许必要的协议和端口
- 定期审计:定期审查打印机配置和访问日志
- 集成监控:将打印机日志集成到 SIEM 系统
- 事件响应:制定针对打印机安全事件的响应计划
3. 事后排查
- 检查历史日志:回溯到漏洞公开前 90 天,检查是否有异常访问
- 审查管理员账户:检查是否有异常的管理员账户或配置变更
- 扫描存储文档:检查打印机硬盘上的敏感文档
- 轮换凭据:轮换所有与打印机相关的凭据和密钥
0x0C 总结
打印与成像设备的高危漏洞爆发,揭示了几个关键教训:
- 打印机是最容易被忽视的攻击面:企业通常忽视打印机安全,但它们拥有网络访问权限和敏感数据
- 预认证 RCE 是常态:攻击者不需要凭据即可触发漏洞
- 默认凭据是最大风险:厂商使用可预测的默认密码,企业不修改默认密码
- 固件更新严重滞后:企业很少主动更新打印机固件
- 跨厂商共性问题:多个厂商的设备存在相同类型的安全问题
企业应该将打印与成像设备视为关键安全资产,而不是普通的办公设备。需要从网络架构、访问控制、固件管理、监控审计、事件响应等多个维度进行全方位防护。
0x0D 参考资料