本文翻译自:https://research.checkpoint.com/sending-fax-back-to-the-dark-ages/
Research By: Eyal Itkin and Yaniv Balmas
Fax传真,是一种传输静态图像的通信手段,是指把纸上的文字、图表、相片等静止的图像变换成电信号,经传输路线传输到接收方的通信方式。有了email、微信、手机、web服务、卫星通信等等新型通信技术之后,传真就离我们越来越远了。
然而并不是,传真仍然被广泛地使用着。根据Google调查的结果,有超过3亿传真号码仍在使用中。因此Check Point研究人员对传真这种相对古老的通信形式进行了分析,想确认传真是否会是网络安全的主要威胁之一。
一个传真号码就可以接管网络
传真目前广泛应用于许多行业的多功能打印机设备中,而这些打印机大多通过以太网、WiFi、Bluetooth等接口连接到内部网络或公司网络中。更重要的是多功能打印机还连接着PSTN电话线来支持传真功能。
本研究的设定情景是攻击者在没有其他信息的情况下,通过发送恶意传真到目标传真号码攻击多功能打印机。如果攻击成功,攻击者就可以完全控制打印机,然后可能渗透到打印机连接的网络中。功夫不负有心人,研究人员研究发现,这个假设是成立的,攻击可以完成。
事实上研究人员发现了打印机的许多关键漏洞,然后攻击者通过发送伪造的恶意传真利用打印机漏洞来获取对打印机的完全控制权。获取了打印机的完全控制权后,做任何事情都是可能的了。研究人员选择使用Eternal Blue来获取PC连接的相同网络的控制权,然后利用PC来窃取数据并通过传真发送给攻击者。研究人员将该攻击命名为Faxploit攻击。
Faxploit攻击视频:
https://www.youtube.com/embed/1VDZTjngNqs
技术细节
逆向固件Reversing the Firmware
侦查阶段
加载到IDA后,逆向固件的第一步是了解执行了什么和在什么缓解下执行的。侦查后研究人员发现:
架构
固件是通过ARM 32bit CPU加载和执行的,运行在Big Endian模式(字节高位优先)。主CPU使用共享内存区域与MCU通信,而MCU负责对LCD屏幕的控制。
图1: 打印机架构
操作系统
操作系统为基于ThreadX的实时操作系统(Green Hills)。操作系统使用平坦内存模型(flat memory model),即许多任务都在kernel-mode模式下运行,共享所有虚拟地址空间。因为是flat memory model,所以所有任务通信都应使用消息队列(先进先出)。而且虚拟地址空间是固定的,也没有应用基于ASLR的机制。
DSID值
在分析T.30 state machine task(状态机任务)时,研究人员发现许多使用唯一ID的trace。深入分析发现这些id也用于“DSID_”前缀的字符串列表。这些字符串看似是为了匹配trace的逻辑,因为研究人员建立了不同DSID列表的枚举,对任务trace进行文本描述。
图2: trace函数中使用的DSID值
图3: T.30 state machine使用的DSIS列表
图4: 使用DSID Enum和trace函数
任务间的差距
在逆向T.30状态机和处理HDLC猫的任务时,研究人员发现缺少许多函数指针表。然后发现两个常见的代码模式看起来比较像allocation / deallocation路径。每个模块中都使用了这些函数来从其他模块接收信息,也可能是用于解压到下一模块的缓存,如图5所示。
图5: 从使用函数表的任务中逆向帧
如果不定位这些函数就不了解数据在固件中的流向,也限制了对固件的理解。因为无法追踪大多数函数指针的初始化,所以需要用更加动态的方法,即需要一个调试器。
构建调试器
串行调试接口
首先分析面板,寻找并连接串行调试接口。
图6: 连接JTAGULATOR到打印机的串行调试器
然后研究人员发现调试接口默认是限制的:
图7: 串行调试器拒绝执行命令
貌似需要提升权限,所以研究人员找了一个漏洞。
寻找1-Days
在尝试利用给定固件漏洞时间,常用的方法就是检查使用了哪些开源代码并与已知的CVE进行比较。识别使用的开源代码的方法:
- 在固件中进行字符串搜索,从主流开源代码中找出关键字符串
- 从厂商网站上搜索产品的开源证书
寻找开源代码中漏洞的方法有:
- 寻找匹配相关库版本的CVE细节
- 如果对相关漏洞比较熟悉,直接检查是否相关
- US CERT每周会发送新公布的CVE的邮件
gSOAP调试漏洞– Devil’s Ivy
分析过程中研究人员发现固件使用了gSOAP库,然后twitter上也报告了关于Devil’s Ivy的漏洞,然后研究人员马上进行了检查。漏洞编号为CVE 2017-9765即“Devil’s Ivy”,如图8。
图8: “Devil’s Ivy”漏洞的反编译代码
通过TCP 53048端口发送大XML(> 2GB)文件给打印机开源触发基于栈的缓冲区溢出漏洞。利用该漏洞可以获取打印机的完全控制权限,也就是说可以将该漏洞看作调试漏洞。
但是该方案有两个缺点:
- 利用该漏洞发送的恶意文件需要大量时间,经过优化,传输时间还需要7分钟左右;
- 需要开发基于IDA的漏洞利用。
利用Devil’s Ivy
攻击者利用该漏洞可以触发基于栈的缓冲区溢出漏洞,会对字符进行限制。限制的字符有:
- 0x00 – 0x19不能打印
- ‘?’: 0x3F
该漏洞的一个好处是溢出是没有限制的,即攻击者可以发送整个漏洞利用链到目标设备的栈中。
漏洞利用的一个限制是嵌入式环境下CPU有许多缓存。一个接收到的包会保存在Data Cache (D-Cache)中,而执行会在Instruction Cache (I-Cache)中执行。也就是说即使没有NX位支持,也不能直接从栈缓存中执行payload,因为CPU执行的代码要经过I-Cache。
为了绕过这些限制,研究人员必须利用含有下面及部分的bootstrapping利用:
- 能够复制D-Cache和I-Cache的ROP;
- 解码加载调试器网络加载器的shellcode;
- 调试器会通过网络发送给加载器。
Scout调试器
研究人员构建的调试器是一个基于指令的网络调试器,支持基本的内存读写请求,还可以扩展到支持特定固件指令。研究人员使用调试器从打印机中提取内存副本,然后进行扩展来测试一些特征。
调试器配置为固件API函数(memcpy, sleep, send等)的地址后,调试器就可以加载任何地址了。
Scout Debugger下载地址:https://github.com/CheckPointSW/Scout
ITU T.30 – Fax协议
如果多功能打印机支持传真功能也就意味着支持Group 3 (G3)传真协议,并遵守ITU T.30标准。该标准定义了发送者和接收者的基本能力,也列出了协议的不同阶段,如图9。
图9: ITU T.30标准中的协议图
图中的Phase B负责发送者和接收者之间的握手,Phase C是根据协商说明传输的数据帧。
帧是通过电话线使用HDLC帧发送的,如图10所示。
图10: ITU T.30标准
寻找攻击向量
发送TIFFs
传真简单地发送TIFF文件是一种误解。事实上,T.30协议会发送页面,而phase B阶段协商的参数就包括页面长度和宽度,phase C用于传输页面的数据行。也就是说最终的输出是一个含有IFD标签的tiff文件,IFD标签会被用于构建握手用的元数据。.tiff文件之后会含有电话线上接收的页面行。
虽然tiff分析器有许多的漏洞,这些漏洞主要存在于分析IFD标签的代码中。这些标签是大引起自己构建的,唯一的处理过程是打印过程中打开压缩内容时的页面内容。
TIFF压缩
但tiff格式使用的压缩方法有许多的名字,因此需要首先找出来。下面是一个基本的映射关系:
- TIFF Compression Type 2 = G3 without End-Of-Line (EOL) markers
- TIFF Compression Type 3 = G3 = ITU T.30 Compression T.4 = CCITT 1-D
- TIFF Compression Type 4 = G4 = ITU T.30 Compression T.6 = CCITT 2-D
压缩方法是使用对黑白代码使用固定哈夫曼表的基本Run-Length-Encoding (RLE)方案。
研究人员检查了T.4和T.6的解压缩代码,并没有发现什么可以利用的漏洞。
T.30扩展
在pahse B猫会交换能力,所以可以找出支持的最佳传输方式。研究人员下了一个脚本对这些使用ITU T.30标准的消息进行了语法分析,结果如图11:
图11: 分析目标的DIS能力
看起来研究人员测试的打印机支持ITU T.81 (JPEG)格式,即可以发送彩色传真。研究人员在分析处理彩色传真的代码时发现接收的数据保存为.jpg格式了。与tiff文件相比,.jpg文件中接收者会构建header。
研究人员发现在固件中,接收的内容会在没有过滤的情况下,复制到文件中,这也给了攻击者一个攻击入口。
打印彩色传真
当目标打印机接收到一个彩色的传真,就会在不做任何检查的情况下复制内容到一个.jpg文件(%s/jfxp_temp%d_%d.jpg
)中。而接收传真只是第一步,打印时打印机模块首先需要确认接受文档的长度和宽度,然后需要发送进行基本的语法分析。
JPEG分析器
因为一些原因,固件开发者会重新在主流的开源项目中实现这些模块。也就是说,开发者实现了自己的JPEG分析器。从攻击者的角度看,这更像是一个赌注,因为在复杂的文件格式分析器中找出漏洞也是非常有可能的。
JPEG分析器非常简单,工作原理为:
- 检查文件开始Start Of Image (SOI) marker: 0xFFD8
- 循环分析每个支持的标记
- 完成后,返回相关数据对调用者
CVE-2018-5925 –缓冲区溢出
根据标准,COM maker(标记)(0xFFFE)是可变大小的文本域,表示文本评论。这也是找到的第一个漏洞,根据标准传真接收器会丢弃maker(标记)。
研究人员发现了漏洞,如图12:
图12: COM marker漏洞反编译的代码
分析模块会对2字节长的域进行分析,并复制文件中的数据到全局数组中。数组中每个记录大小为2100字节,而长度域为64KB,这就有大量可控制的缓存溢出。
CVE-2018-5924 – 分析DHT marker基于栈的缓存溢出
因为第一个漏洞不支持标准的编译实现,所以研究人员继续寻找marker相关的其他漏洞。DHT marker (0xFFC4)定义了特殊的Huffman表,用于解码文件的数据帧。
函数比之前COM maker漏洞还简单一点,如图13所示:
图13: DHT marker漏洞反编译的代码
- 这里有一个读取16字节数据的循环,因为每个字节表示一个长度域,所有的字节加起来就是整个的长度变量;
- 一个全0的256字节的本地栈缓存会被用于之后的运行过程;
- 第二个循环会使用之前的长度域,从文件中拷贝数据到本地栈缓存;
代码中的漏洞就是:16 * 255 = 4080 > 256
,所以攻击者就有了没有任何使用的字母限制的可控的基于栈的缓存溢出了。
构建漏洞利用
研究人员最终决定选择DHT漏洞,因为比较容易实现。
自动化Payload – 实现图灵机
研究人员使用了用于调试漏洞利用的基于网络的加载器,当前攻击向量的主要优势在于payload可以保存在发送的JPEG文件中。因为不会对传真的内容进行任何检查,就可以把payload保存在发送的文档中而不用担心JPEG文档是否合法。
而且文件的文件描述file descriptor (fd)也保存在全局变量中,因此研究人员编写了基于文件的加载器。加载器可以从文件中读取payload,并加载到内存中。然后当payload需要用输入执行任务时,就会从文件中读取输入并执行相应的指令。
在网络上传播
控制打印机已经完成了,但是如果可以控制打印机所在的计算机网络,就可以完成更多的动作。所以研究人员使用了Eternal Blue漏洞来接管打印机所在的计算机网络。
应用和实现的payload有以下功能:
- 控制打印机的LCD 屏,证明完全控制了打印机;
- 检查打印机是否联网;
- 使用Eternal Blue和Double Pulsar攻击所在网络中的计算机设备,并完全控制。
这样,就可以在打印机所在的计算机网络上传播攻击者的payload了。
总结
研究人员分析了ITU T.30传真协议存在的安全漏洞,以HP Officejet Pro 6830多功能打印机为测试机证明了传真协议实现过程中的安全风险。以一根电话线,通过发送传真来完全控制打印机,之后在打印机所在的网络中传播payload。
本文也给各打印机厂商以启示,可能会改变现代网络架构处理网络打印机和传真机的方式。未来,传真机(打印机)也会成为入侵企业网络的攻击向量之一。
参考文献
- HP Security Bulletin – https://support.hp.com/us-en/document/c06097712
- ITU T.30 (Fax) – https://www.itu.int/rec/T-REC-T.30-200509-I/en
- ThreadX – https://en.wikipedia.org/wiki/ThreadX
- Green Hills – https://www.ghs.com/
- CVE 2017-9765 (Devil’s Ivy) – http://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-9765
- Scout Debugger on Github – https://github.com/CheckPointSW/Scout
- HP Digital Fax – https://support.hp.com/us-en/document/c03448663
- CCITT (Huffman) Encoding – https://www.fileformat.info/mirror/egff/ch09_05.htm
- Huffman/CCITT Compression in TIFF – https://www.mikekohn.net/file_formats/tiff.php
- ITU T.81 (JPEG) – https://www.w3.org/Graphics/JPEG/itu-t81.pdf
- ITU T.4 – https://www.itu.int/rec/T-REC-T.4-200307-I/en
- JPEG Markers – https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure
- libjpeg – http://libjpeg.sourceforge.net/
- Eternal Blue check point research – https://research.checkpoint.com/eternalblue-everything-know/
-
-
-
-
-
-
-
-
-
-
-
-
-
-