黑基网 首页 资讯 安全圈 查看内容

HP打印机远程代码执行漏洞(RCE)是这样被发现的!

2017-12-5 00:19| 投稿: lofor |来自: 互联网

摘要: 打印机作为组织机构内部不可缺少的资产设备,近年来,随着各种打印固件漏洞百出,其安全性也备受关注,打印机安全与电脑安全同等重要,不容忽视。我们注意到,惠普(HP)推崇自身的安全打印服务中有这样一段宣传视频 ...

打印机作为组织机构内部不可缺少的资产设备,近年来,随着各种打印固件漏洞百出,其安全性也备受关注,打印机安全与电脑安全同等重要,不容忽视。我们注意到,惠普(HP)推崇自身的安全打印服务中有这样一段宣传视频《The Wolf-狼来了》,其中美剧黑客军团主演克利斯汀·史莱特化身为“狼”,使用各种恶意手段入侵企业内部打印系统,绕过公司网络防火墙,轻松获得了大量机密文档。

演示视频

事实上,存在这样的攻击手段,打印机肯定会成为攻击者间接渗透组织机构内网系统的攻击向量,而且,HP的宣传视频也拍的非常精彩。但Foxglovesecurity公司安全研究员对这段视频看不下去了,他们决定拿HP打印机下手,而最终,却发现了多个HP打印机安全问题,以及影响HP打印机 5个系列共50多个型号的远程代码执行漏洞(CVE-2017-2750)。这一次,HP打印机确实被安全研究者给杠上了!我们一起来看这场好戏!

质疑惠普打印机的安全性

在惠普HP安全打印的宣传视频开篇中说到:“世界上有数以亿计的商业打印机,但不到2%是安全的“,难道惠普打印机就是绝对安全的吗?带着这样的疑问,我们想进行一些验证。打印机入侵方面有Printer Hacking Wiki和PRET toolkit这样的绝佳利器,但貌似没人用它们对HP打印机进行过深入分析研究,于是乎,我们就甩手购买了HP旗下的MFP-586和M553两台不同型号打印机,像“狼”说的那样,“觅食时间到了”。

(提示:文中提及的漏洞已通报给HP公司,HP已经针对漏洞发布了补丁更新,请参考

TL;DR

打印机攻击向量

测试通用打印机漏洞

不安全的默认设置

深度挖掘 – 提取打印机系统和固件信息

逆向固件和HP软件解决方案框架

构建恶意的HP解决方案

构造恶意代码执行

后记

打印机攻击向量

视频中“狼”执行了一系列恶意攻击,其真实性暂且不谈,但以下两种打印机安全问题却的确存在:

打印任务安全 – 打印任务主要有两种泄露方式,一是经过打印机的人直接拿走打印完存留在打印托盘上任务文件,二是攻击者通过网络间接截获打印任务。

未签名代码执行 – 打印机通常不受一些网络安全设备的直接监视,攻击者一旦成功在打印机上植入恶意程序,除了不受限制地获取打印任务之外,打印机还能成为内部网络的一个安全避难所,非常难于发现。

围绕以上两种安全问题,我们对两款HP打印机进行了一系列安全测试。

测试通用打印机漏洞

回顾打印机安全领域的一些现有资料, 不得不提打印机漏洞利用工具包Printer Exploitation Toolkit – PRET,其中内置了针对不同厂商打印机的攻击方法,它包含的通用攻击模块,并不是针对特定型号打印机的一些特定漏洞,因此测试过程中还需深入分析,以确定HP打印机存在的实际漏洞。以下是我们利用PRET工具包测试的一些发现:

路径遍历 -远程存储的打印任务泄露

PRET主要进行PJL、PS、PCL三种打印语言模式测试,每种模式都对应不同的打印语言,并存在相关的通用漏洞。即Printer Job Language (PJL):打印任务语言、PostScript(PS):打印描述语言、Printing Control Language(PCL):打印指令语言。

打印任务语言(PJL)用于指导打印机行为,利用PJL语言可以对打印任务执行管理性的更改设置,对打印文件形成有限管理控制,例如,在打印机文件系统下用户不经常留意的以下特定位置中,它可对打印文件执行存储删除操作。

观察上图可知,我们在“/”根目录进行列目录操作后,只看到了 “PostScript” 目录,此时,在此进行目录切换操作时,就存在一个路径遍历的通用漏洞,我们在两台HP打印机上都找到了一条路径遍历序列,如下所示:

但可惜的是,这样也不能够对目录中的文件执行读写操作,其它反复的强制尝试手段又会引起打印机的崩溃和重启。经过进一步分析,我们发现,只有在某个特定路径下通过修改遍历序列才能读取文件内容:

“Jobs”目录中存储的就是打印任务,可以通过PRET工具包读取存储在其中的任何打印任务:

PRET的上述测试可以读取具有“PIN”密码保护和无保护的所有打印任务文件,这种PIN防护略显多余。

PostScript打印任务控制

我们还发现,某些类型的打印任务在打印之前可被自动操控,例如,内部网络中的任何人可对即将要打印的任务中植入任意图片和字体,如我们在一个将要打印的原始文档中加篡改入了水印”FOO”:

不安全的出厂重置功能

PRET工具包中内置了两个比较隐蔽的功能,这两个功能可以把HP打印机进行出厂重置,从而可将“Administrator”密码重置为默认的空密码。重置操作可通过PJL或SNMP接口实现,即使是人为在打印设备上设置的管理员密码一样可被重置:

除此之外,即使PJL和SNMP接口管理员防护措施,但依然可以通过启动时,DHCP或BOOTP服务器重新配置打印机的这个鲜为人知的功能,来把SNMP团队字符串重置为“public”。

当打印机启动时,它会从DHCP服务中获取一个IP地址,也会从DHCP响应中接收一些特殊的配置选项信息,其中一个特别选项就指定了打印机可以从一个TFTP服务(简单文件传输协议)中,获取到一个包含了各种配置设置信息的配置文件。在HP打印机的使用说明书中,HP声明任何手动设置都优先于DHCP自动设置,但是,在实际配置中,却存在一些DHCP设置可以清除手动设置的选项,如:

安全重置(security-reset) – 将打印服务的安全配置重置为出厂默认模式

冷启动(cold-reset) – 该项操作后将会把TCP/IP配置信息重置为出厂模式

可以在我们的Github项目中,找到启用这些选项的DHCP服务配置文件。

不安全的默认设置

基于上述测试启发,我们尝试在打印机中寻找是否存在一些组合的安全设置,能对上述攻击进行防护阻止,具体来说,也就是管理员如何设置才能避免内部网络的任何人有权重置管理员密码。

确实有这样的组合安全设置,但不像真实环境中那样,管理员能有效对管理接口进行锁定操作,至少以下设置需要对其默认值进行修改,请注意,这些设置不会提示与安全性相关。其管理界面菜单栏显示的完整路径就间接表示了这些设置隐藏的深度:

设备的管理界面必须设置有密码,这是IT资产的通常做法,也是唯一能在现实中应用的设置;

在“Networking > Security > Mgmt. Protocols > SNMP”路径下, “Set Community Name” 需要对默认名称“public”进行修改;

在“Security > PJL Security > Password”下,需要设置一个新密码;

需要禁用以下功能:Networking > Other Settings > Misc Settings > Enabled Features > TFTP Configuration File”。

关键是,如果以上任何设置一旦被忽略,就可导致打印机会被攻击者完全控制,而事实上,这些设置又总会被用户经常忽视。

深度挖掘 – 提取打印机系统和固件信息

购买研究HP打印机前后花了几千刀美元,但我们最终发现了一个远程代码执行漏洞(RCE),也算值得。首先来说,要对打印机系统代码进行逆向,但HP貌似已采取了防护措施,防止对其打印机系统和固件进行信息提取,我们得想办法绕过HP的安全防护。

首先,HP在它们的设备硬盘中加入了联邦信息处理标准(FIPS)兼容加密保护,当任何一块这种硬盘被加载后,所有数据都会被加密,而一旦硬盘被移除后,任何人在没有密钥情况下都将读取不到其中的数据。此外,即使我们能设置或恢复其加密密钥,在驱动器读取数据之前的加密细节也不太清楚。

而且,我们直接把FIPS加密硬盘移除后,再插入一个通用的不支持加密的东芝移动笔记本硬盘:

重启打印机之后,我们能够通过打印机电路板中的USB硬件接口,重新尝试把打印机系统安装到插入的全新东芝硬盘上去:

然后,我们关闭打印机,再次移除这个东芝硬盘,把它接入电脑中进行数据读取。我们想发现一些有意思的文件,如前述提及的,可用PRET通过路径遍历漏洞发现,并位于“/Windows/”和“/Core/bin”目录下的HP dll文件:

但可惜的是,当这个东芝硬盘接入电脑之后,我们却找不到这两个目录,经过分析,我们可采用两种方法来间接读取这两个目录下的文件信息:

获取/Windows/目录内容

我们利用Linux工具grep来查找/Windows/目录下的相关文件:

文件 “NK.bin”似乎每次都会返回出现,经分析发现,打印机的内置操作系统为Windows CE(嵌入式操作系统),其内核文件就存储在 /CEKERNEL/NK.bin中,这样,我们就能使用开源工具Nkbintools来提取其内核中的详细信息了,通过其就可发现具体的Windows目录了:

获取/Core/bin目录内容

想获取/Core/bin目录内容似乎有点难度,当硬盘接入电脑后, /Core/bin目录是可见的,但它却是空的:

经过一番失败尝试后,我们明确知道它并不是空的,于是采取了另外一种方式进行获取。首先,我们检查了硬盘上与/Core/目录相关的分区信息:

然后,我们使用linux下的数据读取命令dd来对该分区生成一个镜像,dd命令下文件系统不会产生限制,就这样我们把dd生成的raw格式镜像间接存储到了一个本地文件中来:

最后,我们用到了数字取证中的“文件雕刻”技术, 该技术通常用于数据恢复过程中的硬盘部分发生故障或文件系统已损坏的情形,它直接二进制数据集即原始磁盘映象中提取恢复文件,这里我们用到了工具scalpel,通过指定一个配置文件,它就会从raw镜像image.bin中找出任何可疑的DLL文件,但这些DLL文件大多都是无效的,且文件名都是数字格式:

由于我们最感兴趣的是在.NET DLL类文件中的信息,因此可使用monodis工具来尝试反汇编每个DLL文件,并只显示出有效的DLL文件及其名称列表。有点麻烦,且最终脚本输出虽然有些混乱,但从其中提取的信息显示这些文件正是我们正在寻找的DLL文件:

逆向固件和HP软件解决方案框架

通过访问设备上运行的代码,我们可以开始深入了解打印机中可能导致远程代码执行的一些功能特性,特别是与安装HP软件解决方案框架和固件相关的功能更新。

HP软件解决方案框架利用惠普的OXP平台和SDK来扩展打印机的功能,第三方公司可以开发这些解决方案,但是这样做的访问权限由HP严格控制的,并且使用SDK开发的任何软件的最终版本必须由HP签署才能安装到任何打印机上。如果能够找到绕过HP控制措施的方法,就有可能创建恶意的解决方案,并把其部署运行在所有的HP打印机上。

恶意固件更新是以前在各种厂商打印机上获得代码执行的一种方法,但现在HP已经应用了新的更新平台和文件格式来执行固件更新,这貌似有没有安全研究人员详细审查过。

逆向BDL文件

HP软件解决方案框架和固件更新中都包含了一个后缀为.BDL压缩包格式的文件,这是一个专门的二进制格式文件,我们决定对其进行逆向,其中可能包含了一些我们能深入窥见HP软件解决方案框架和固件更新的信息。

由于HP固件文件庞大且复杂,为简单起见,我们先获取了名为ThinPrint的第三方打印解决方案包,最后发现,与81MB的固件更新文件相比,ThinPrint中的BDL格式包文件为2.1MB。

首先,我们在BDL包文件上利用binwalk的工具,binwalk可检查二进制文件并能提取出其中包含的任何已知文件格式信息,它是专门应用于这类型包文件的逆向工具。最终,利用binwalk发现BDL包中包含了一个以下内容的ZIP文件:

之后,我们在十六进制编辑器中手动检查了zip文件和BDL包文件,以确定ZIP文件在BDL包文件中的位置,以下是用binwalk提取的zip文件的CRC-32校验显示:

以下是用binwalk提取的BDL包文件中显示包含zip文件部分的校验显示:

注意上面两个十六进制编辑器中的截图,第一图是zip文件在整个文件中的CRC-32校验显示,第二图中,则为BDL包文件中我们怀疑包含zip文件部分的,基于前几个字节匹配的CRC-32校验显示,最终,可以看出,两图中的CRC-32校验和都为相同的“6D AC 9A 2F”,说明我们的怀疑没错。

上图中红色圈起来的部分“2F 9A AC 6D”,请注意,它是在zip文件之前的CRC-32校验和,其字节顺序是与校验和“6D AC 9A 2F”相反的。

到此,我们对zip文件进行了小小的修改(只修改了其中一个文件的内容),然后计算了修改过的zip文件CRC-32校验和,并用新修改的这个zip文件替换了BDL中的原有zip文件,最后把整个BDL文件中CRC-32校验和更新,最后把这个BDL文件上传到打印机上,可惜的是,这不起作用,显示以下错误:

这种情况下,通过对打印机的调试日志进行分析,我们发现了以下信息:

以上信息说明,当zip文件被替换时,其它的CRC校验和被破坏,经过进一步分析,我们编写了自定义python脚本去识别文件中的CRC-32校验和,重点推断出了以下ThinPrint中BDL包文件的几个重要位置字段校验和:

0×14-0×17 =  0×929与0×938的CRC32校验和 (IPKG包头)

0×931-0×934 = IPKG包结构长度

0x94d-0×950 = 0xd76与0xe89的CRC32校验和 (ZIP包头)

0×929-0x92a = 从BDL文件开始的IPKG结构长度

0xe76-0xe77 = 从IPKG包头开始的ZIP结构长度

0xe7e-0xe81 =ZIP文件长度

0xe86-0xe89 = 0xe8b-EOF的CRC32校验和 (ZIP文件二进制)

有了这些也是不行的 – 当BDL文件上传到打印机时,即使其中更新了上面列出的所有校验和和长度信息,但仍然会导致某种校验和失败!

在此,我们决定采取其它替代方法,理论上说,可以构建一个与原始长度相同并具有相同CRC-32校验和的zip文件。如果这样可行,就不需更新BDL文件中的任何位置字段!

我们用Python编写了一个自定义工具(GitHub)来完成这项任务,该工具可用长度和校验和相同但内容不同的zip文件,来替换原始BDL中的zip文件,形成对BDL文件的修改,该工具只适用于ThinPrint下的BDL包文件。

最终,这种方式修改的BDL文件被上传到打印机后,能完全被打印机兼容运行,但对代码的一些恶意更改却不可行。而且,当我们试图替换zip中的任意DLL文件时,又向我们返回了DLL签名验证错误。

逆向固件签名验证机制

现在,我们对BDL文件的大概状况有所了解,可以开始检查固件更新过程和其相关的安全控制措施。经分析,与HP打印机固件更新相关的文件仍然是.bdl后缀格式的文件,首先,我们在十六进制编辑器中检查了HP打印机的某个固件更新文件,值得注意的是,在该.bdl文件末尾存在一个签名块:

此签名块在并不存在于上述提及的ThinPrint解决方案的BDL包文件中,这表明软件解决方案包和固件更新可能是不同的处理方式,

通过签名块中的信息判断,其似乎使用了行业签名验证标准,如RSA with SHA256,但是,仅因为出现了一个安全密码算法并不能判断该文件就能被安全验证,许多常见的实现错误都会导致签名验证不安全。

为了找出执行签名验证的代码模块,仿照上述ThinPrint解决方案的BDL包绕过方式,我们把一个精心制作的固件文件上传到打印机中,希望其校验和或长度都能有效通过验证。但在执行上传之后,打印机的调试日志中产生了以下错误信息:

通过查看从打印机中提取的反编译代码,确定该错误消息是在类文件HP.Mfp.Services.Installation.Fim.Fim中生成的:

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

发表评论

最新评论

引用 游客 2017-12-12 17:19
<a href="https://www.carbatteryprice.loan/car-battery-electricity-converter/fiat-barchetta-183-1995-2005-bosch-s4-battery-60ah-electric-system-replace-part.php">Fiat Barchetta 183 1995-2005 Bosch S4 Battery 60Ah Electric System Replace Part</a>
VAUXHALL Astra MK5 1.7 CDTi 80 Yuasa Battery Y17DT Z17DTL Estate 11/04-11/05 100
<a href="https://www.carbatteryprice.racing/car-battery-jump-starter/fiat-freemont-jc-jf-2011-2016-bosch-s3-battery-70ah-electrical-replace-part.php"> ...
引用 游客 2017-12-12 13:28
<a href="https://www.carbatterybuy.science/car-battery-duracell/096r-titanium-car-battery-12v-640a-4-year-warranty.php">096R Titanium Car Battery 12V 640A - 4 Year Warranty</a>
Proton Satria C9 M 1996-2006 Banner Starting Bull 60Ah Battery Replace
<a href="https://www.carbatterysale.review/car-battery-amazon/lamborghini-diablo-1990-2002-vetech-battery-70ah-electrical-system-replace-part.php">Lamborghini Diablo 1990-2002 Vetech Battery 70Ah Electrical System Replace Part ...
引用 游客 2017-12-12 11:15
<a href="https://www.costcarbattery.date/car-battery-adapter/">car battery adapter</a>
Dodge Neon Mk2 1999-2005 Vetech Battery 60Ah Electrical System Replacement Part
<a href="https://www.cheapcarbattery.webcam/car-battery-brands/toyota-dyna-100-yh-1985-1995-bosch-s4-battery-70ah-electric-system-replace-part.php">Toyota Dyna 100 Yh 1985-1995 Bosch S4 Battery 70Ah Electric System Replace Part</a>
Triumph Vitesse 1962-1975 Banner Starting Bull 48Ah Electrical Battery  ...
引用 游客 2017-12-12 07:46
<a href="https://www.buycarbattery.cricket/car-battery-alligator-clips/opel-zafira-b-2005-2011-banner-power-bull-72ah-battery-replacement.php">Opel Zafira B 2005-2011 Banner Power Bull 72Ah Battery Replacement</a>
Titanium 005L Car Battery 12V 60Ah 510CCA - fits many Subaru Suzuki Toyota
<a href="https://www.newcarbattery.download/car-battery-brands/12v-100ah-exide-premium-car-battery-type-017-900cca-4-years-wty-oem-replacement.php">12V 100Ah Exide Premium Car Battery Typ ...
引用 游客 2017-12-12 06:49
<a href="https://www.pricecarbattery.win/car-battery-extension-cable/rover-streetwise-2003-2005-banner-starting-bull-60ah-electrical-battery-replace.php">Rover Streetwise 2003-2005 Banner Starting Bull 60Ah Electrical Battery Replace</a>
Dacia Lodgy 2012-2016 Banner Power Bull 62Ah Battery Electrical Replacement Part
<a href="https://www.carbatterysale.faith/car-battery-backup/numax-cts-luxury-sport-petrol-heavy-duty-car-battery.php">Numax CTS Luxury Sport Petrol Heavy Du ...

查看全部评论(5)


新出炉

返回顶部