- A+
0x01 挖掘前知识铺垫
命令 | 使用方法 | 中文解释 |
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> | 状态关闭 |
使用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)
2、SNMP协议语言
3、打印机管理语言PML
4、打印机9100端口溢出漏洞
漏洞 | 攻击面 | 概要 |
用户名枚举 | *管理界面
*设备Web界面 *云界面 *移动应用程序 |
*能够通过认证交互收集一组有效的用户名 |
弱密码 | *管理界面
*设备Web界面 *云界面 *移动应用程序 |
*例如,能够将帐户密码设置为“1234”或“123456”。
*使用预先编程的默认密码 |
账号锁定 | *管理界面
*设备Web界面 *云界面 *移动应用程序 |
*能够在3 - 5次登录尝试失败后,继续发送身份验证尝试 |
非加密服务 | *设备网络服务 | *网络服务未作适当加密来防止攻击者窃听或篡改 |
双因素认证 | *管理界面
*云Web界面 *移动应用程序 |
*缺少双因素认证机制,如安全令牌或指纹扫描器 |
轻度加密 | *设备网络服务 | *虽然已执行加密,但是该配置不正确或未被能准确更新。例如使用SSL v2 |
非加密更新 | *更新机制 | *更新是在没有使用TLS或加密情况下通过网络传输更新文件的 |
更新位置为可写 | *更新机制 | *更新文件的存储位置为可写,并允许修改固件并分发给所有用户 |
拒绝服务 | *设备网络服务 | *服务能够以拒绝该服务或整个设备的服务方式进行攻击 |
删除存储介质 | *设备物理接口 | *能够从设备中删除物理存储介质 |
无手动更新机制 | *更新机制 | *无法手动强制更新检查设备 |
缺乏更新机制 | *更新机制 | *无法更新设备 |
固件版本显示及最后更新日期 | *设备固件 | *当前固件版本不显示,或者最后更新日期不显示,也有可能两者都不显示。 |
固件和存储提取 | *JTAG / SWD接口
*拦截OTA更新 *从制造商网页进行下载 *取消链接SPI Flash / eMMC芯片并在适配器中进行读取 |
*固件包含许多有用的信息,例如,运行服务的源代码和二进制文件、预设密码、ssh密钥等。 |
操纵设备的代码执行流程 | *JTAG / SWD接口 | *借助于JTAG适配器和gdb,我们可以修改设备中固件的执行程序,并绕过几乎所有基于软件的安全控制。
*侧面通道攻击还可以修改执行流程,或者可以用来获取设备泄漏的有趣信息 |
获取控制台访问 | *串行接口(SPI / UART) | *通过连接到串行接口,我们将获得对设备的完全控制台访问
*通常来说,安全措施包括防止攻击者进入单独用户模式的自定义启动程序,但它也可以绕过攻击者。 |
不安全的第三方组件 | *软件 | *使用过期版本的busybox、openssl、ssh、web服务器等 |
vr_system,目前担任某大型安全公司技术研究院安全研究员,owasp中国会员,曾发现CVE、CNVD、CNNVD原创漏洞几十个,主要挖掘联想、惠普、富士施乐、用友云、中国联通、中国移动等厂商漏洞。乐于分享技术,投稿于各大安全论坛以及机构和公司。