导语:本文对传真软件的漏洞研究有助于我们更好的理解“传真安全”,并顺便了解其中一些系统的复杂工作原理。

前言

估计你听到“传真机”这几个字,都觉得它是个很古老的设备,现在即时通讯设备十分普遍,传真机的使用环境已经非常的少了。但是在许多关于商务和法律的公司内,传真机的使用率还是比较高的。不过由于传真机的市场份额正在逐年减少,所以开发商对这方面的技术研发投入也越来越少。这意味着传真机的许多关键技术还停留在十几甚至几十年前,而这期间网络技术的发展和黑客技术的应用,都上了一个新的台阶,所以针对传真机的攻击面研究,就显得非常必要,而且目前的攻击目标主要是针对企业和各种组织的。传真机的传统连接技术,就是通过电话访问,以及通过以太网连接到本地网络。

老实说,我并不知道传真机的详细运行原理和过程。虽然读了很多关于这方面的文档,但我还是对其一知半解。不过,由于我的研究目标并不是实现对硬件的反汇编,因此,我可以通过目前市面上流行的许多软件项目,实现对传真机的各种属性和过程分析,并且可以完全访问源代码。

有了清晰的代码审核,再加上使用一些模糊测试工具(模糊测试是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法),就可以开始研究了。

传真软件的超低安全性

虽然传真机仍然可以在世界上任何一个办公场所找到,但很明显,如果没有特殊情况,是没有人喜欢用传真来进行交流的。你可以在网上快速搜索一下,目前在用的许多传真软件项目都是很久以前的了,比如,HylaFAX。HylaFAX功能强大,应用灵活,运行稳定,管理方便,即使与商业传真软件相比,也毫不逊色。HylaFAX即是一款支持G3标准的传真软件。前身是SGI的Sam Leffler在八十年代末期为公司编制的传真软件。后来SGI同意Sam将该软件贡献出来,放到网上供更多的人免费使用。早期的软件称为FlexFAX,后来发现和已有的商标相冲突,才改用现名。再比如eFAX传真软件,是基于PSTN(电话交换网)和互联网络的传真存储转发,也称电子传真。它整合了电话网、智能网和互联网技术。原理是通过互联网将文件传送到传真服务器上,由服务器转换成传真机接收的通用图形格式后,再通过PSTN发送到全球各地的普通传真机上。还有Sendfax,它是个很早以前的传真软件。它允许你通过标准的faxmodem发送传真。你可以直接发送,也可以通过shell脚本发送,使用“fax polling”或者创建新的fax队列。同时,这个软件还允许你通过电话线接收和拨号发送。另外还可以使用mgetty+sendfax建立一套功能完整又好用的传真服务软件,这一系列网络化的传真软件项目将有助于传真的广泛使用。

ICTFAX是一款面向服务提供商和企业的免费开源GNU GPLv3多用户和基于Web的软件解决方案。 ICTFAX是一个电子邮件到传真,传真到电子邮件和Web到传真网关,支持G.711传真,PSTN传真和FoIP T.38发起和终止,ICTFAX基于开源Freeswitch,ICTCore和Drupal 7。

IAXmodem作为软件调制解调器连接IAX-supporting用户交换机(如Asterisk)和你的传真对象。

粗略地说,我可以找出传真软件的三个通信层:

数据层:在这个通信层,调制解调器会开始发出传真机打的噪声并在传真的双方之间建立数据通道,允许它们交换数据符号;

会话层:协商传真通信参数的通信层,如页面格式,页面传输速度,图像压缩等;

图像或页面层:接受或发出一方的传真机会对接受或发出的页面信息进行编码或解码,压缩或解压缩,应用、检查并纠错,最后生成要传真或打出的文档。

根据调制解调器(物理或仿真)处理的这些层的数量,我可以识别出不同类型的传真设备:

第1类设备含有调制解调器处理数据层,会让传真软件进行所有的会话和页面处理;

第2类设备含有调制解调器处理数据和会话层,会将图像处理留给软件端;

还有其他类调制解调器可以带来其他的传真功能,比如让传真速度发生变化,不过本文,我只关注第1类设备。

因此,含有传真软件(如HylaFAX)和传真调制解调器的设备,任何人都可以通过命令行发送和接收传真信息。

发送传真时,你只需要手动输入文档信息(图像或pdf文件)和对方电话号码,而传真软件将自动负责拨号、编码和传输数据。在对方接收传真时,进程通常会侦听通过调制解调器串口发出的传入呼叫,然后接收所有信息并将其放在本地文件系统或将其发送给用户。

攻击测试设置

有了以上的介绍,现在我可以针对传真软件的每一层,发起有针对性的攻击。为了实现攻击,我会将几个传真组件组合在一起,它们有:

1.2台90年代的老式传真机;

2.2个USB传真调制解调器,

3.Cisco SPA112;

4.Asterisk;

5.IAXmodem;

6.HylaFAX,eFAX和mgetty;

7.GDB;

8.VIM;

9.AFL;

我的设置组合允许我部署一系列不同的攻击配置,Asterisk将是主要的PBX,将负责路由呼叫,提供一个私人电话网络,可以让我们的不同组件互相拨号,而不用去公共电话网络(PSTN)。我可以使用Cisco SPA将传真机和usb调制解调器,通过物理方法,连接到Asterisk网络,而IAXmodem调制解调器仿真将是一个完美的传真服务器设置软件。最后,我利用gdb和vim来阅读源代码并逐步完成代码汇编。

与此同时,在本次研究的大部分时间里,我多次使用AFL进行模糊测试,其目的就是试图滥用我正在研究组件的不同代码块。我所选用的模糊测试工具特别适用于测试代码中那些复杂且可疑的代码,同时又保证我可以继续阅读代码。尽管如此,它们在查找我所需要的崩溃和弱代码路径方面仍是快速而高效的。

攻击测试结果

经过测试,我发现了很多漏洞,并向软件维护人员进行了报告,其中一些目前已经发布了修复漏洞。

MGETTY存在多个漏洞,以下是已发现和报告的漏洞详情:

CVE-2018-16741:通过Mgetty中的进程描述进行shell注入;

CVE-2018-16742:在Mgetty中通过cli参数进行基于堆栈的缓冲区溢出;

CVE-2018-16743:和CVE-2018-16742一样,都是在Mgetty中通过cli参数进行基于堆栈的缓冲区溢出;

CVE-2018-16744:通过配置参数在Mgetty中基于堆栈的缓冲区溢出;

CVE-2018-16745:通过配置参数在Mgetty中实现缓冲区溢出;

更多信息,请阅读https://www.x41-dsec.de/lab/advisories/x41-2018-007-mgetty/

HYLAFAX中的远程代码执行攻击

在寻找Hylafax中的漏洞时,我仍然使用的是以上所讲的方法,不过效率就慢很多了,但最后,我还是找到了一个可以远程利用的漏洞CVE-2018-17141。

CVE-2018-17141:远程攻击者可以在可以在Hylafax的传真接收会话期间写入未初始化的指针

更多信息,请参见https://www.x41-dsec.de/lab/advisories/x41-2018-008-hylafax/

在本次研究中,我发现HylaFAX及其解决方案对于传真通讯来说是一个非常有特色和完整的解决方案。它们给我的感觉是强大而流畅,并且几乎能在我所测试的任何样本中顺利的进行通信。它们的大部分源代码都易于阅读,这让我能够更好的理解这些传真机的工作原理。不过偶尔也有例外,比如当出现ECM页面提示的时候。

在大多数传真机上,你可以在设置菜单的高级部分中激活ECM。一旦激活,ECM会自动将每个传真页面分解为部分页面,并扫描该页面以确认数据准确性。如果发现错误,则会停止传输并提示你重新发送传真。该功能的性质使ECM不容错误,即使是微不足道的错误。此灵敏度可能会减慢或妨碍传真传输。如果你使用VoIP电话服务,则可能需要停用ECM以使你的传输与VoIP提供的连接类型兼容。

在阅读与页面数据传输相关的代码时,我偶然发现了以下这些代码:

// from https://github.com/ifax/HylaFAX/blob/09ad7eb6244e6160b42e9646495f0496f80d63fc/faxd/CopyQuality.c%2B%2B#L446
memcpy(recvRow, (const char*) buf, cc);
recvRow += cc;

这是一个典型的缓冲区溢出模式,对吧?很明显这是一个漏洞,我试图将其隔离。以下这几行代码属于FaxModem::recvPageDLEData(),它们的作用就是在启用JPEG传输时处理接收的传真信息,这样在缓存整个接收页面时,就可以避开传真机设置的“边界检查("Boundary Check")”。

// from https://github.com/ifax/HylaFAX/blob/09ad7eb6244e6160b42e9646495f0496f80d63fc/faxd/CopyQuality.c%2B%2B#L987
case JP_GREY+4:
case JP_COLOR+4:
    recvEOLCount = 0;
    recvRow = (u_char*) malloc(1024*1000); // 1M should do it?

找到易受攻击的代码

在进行安全测试时,我希望在向受害者发送传真时,能触发此缓冲区溢出漏洞。不过经过测试,这点很难做到。原因有以下几点:

1.HylaFAX不正式支持JPEG接收,并且明确禁用此功能,而且在FAX sessiom开始时的握手期间就开始禁用;

2.恶意攻击者可以选择不遵守此协议,无论接收方宣布它的禁用功能是哪些,攻击者都可以在会话参数中启用接收JPEG的功能;

3.HylaFAX很乐意把JPEG作为会话传输格式,并遵循它实现的那些代码路径来处理JPEG接收的问题;

4.但HylaFAX也会启用ECM(错误纠正模式),遵循完全不同的执行流程,但这不包括调用FaxModem::recvPageDLEData(),而是调用FaxModem::writeECMData()。

这样我原本计划中能轻而易举地发现的漏洞,看来是很难实现了。但是别气馁,看一下在ECM模式下处理JPEG接收的代码,它们看起来是这样的:

// from https://github.com/ifax/HylaFAX/blob/09ad7eb6244e6160b42e9646495f0496f80d63fc/faxd/CopyQuality.c%2B%2B#L1045
memcpy(recvRow, (const char*) buf, cc);
recvRow += cc;

是不是看起来很眼熟,我准备利用它们来实现漏洞。我准备利用我已经准备好的概念证明,启用JPEG标记,发送足够的数据来实施缓冲区溢出,并希望在运行时覆盖一些易用的heap元数据。在我将概念证明发送给受害者时,对gdb进行了hook,等待奇迹发生。传真传输开始时,受害者进程崩溃的速度比预期的要快得多,不幸的是,在试图写入到内存位置0时出现了段错误。

这是为什么呢?可能有些东西并不像我们预期的那样顺利。最后,负责分配recvRow内存的开关块并没有被执行,使得recvRow未初始化并指向对象构造之前的任何值。

未初始化的指针很有趣,因为它们会在对象构造过程中,以非常明显的方式获取一个安全值,但是会在对象实例化时从内存中存在的任何无用信息中获取它们的值。

总结

本文对传真软件的漏洞研究有助于我们更好的理解“传真安全”,并顺便了解其中一些系统的复杂工作原理。使用免费软件项目是快速了解传真通信每一层的一个很好的方法,同时也更容易发现有趣和可疑的代码片段。传真系统已存在了数十年,它被设计用来稳定且清晰的通过不可靠和含有很大干扰的电话线来传输图像,并且这一目标几十年前就实现了。在这以后该领域的创新几乎就没有了,而且开发商已将研发重点和努力转移到了其他领域。

源链接

Hacking more

...