2018年3月末,ESET研究人员发现了一个有意思的恶意PDF样本。仔细观察发现,该样本利用了两个未知的漏洞:Adobe Reader中的远程代码执行漏洞和Microsoft Windows中的特权升级漏洞。
组合的漏洞的使用非常强大,因为它允许攻击者执行任意代码,对有漏洞的主机可以拿到最高权限,并且只有最少量的用户交互。APT组织经常使用这种组合来执行他们的攻击,例如去年的Sednit活动。
当发现了这个PDF样本,ESET就与Microsoft安全响应中心,Windows Defender ATP研究团队和Adobe产品安全事件响应团队联系并一起工作,因为他们修复了这些错误。
来自Adobe和Microsoft的修补程序和建议可在此处获得:
APSB18-09
https://helpx.adobe.com/security/products/acrobat/apsb18-09.html
CVE-2018-8120
https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2018-8120
受影响的产品版本如下:
Acrobat DC(2018.011.20038和更早版本)
Acrobat Reader DC(2018.011.20038及更早版本)
Acrobat 2017(011.30079及更早版本)
Acrobat Reader DC 2017(2017.011.30079及更早版本)
Acrobat DC(Classic 2015)(2015.006.30417及更早版本)
Acrobat Reader DC(Classic 2015)(2015.006.30417及更早版本)
Windows 7(用于32位系统)Service Pack 1
Windows 7(用于基于x64的系统)Service Pack 1
Windows Server 2008(用于32位系统)Service Pack 2
Windows Server 2008(用于基于Itanium的系统)Service Pack 2
Windows Server 2008(用于基于x64的系统)Service Pack 2
Windows Server 2008 R2(用于基于Itanium的系统)Service Pack 1
Windows Server 2008 R2(用于基于x64的系统)Service Pack 1
本文下面介绍这个恶意样本的技术细节及其利用的方式
Adobe Reader软件实现称为沙盒的安全功能,在查看器中也称为保护模式。
沙盒使得开发过程更加困难:即使代码执行完成,攻击者仍然需要绕过沙盒的保护措施,达到损害运行Adobe Reader的计算机。通常,沙箱旁路是通过利用操作系统本身的漏洞来实现的。
当攻击者能够发现漏洞并为Adobe Reader软件和操作系统两者一起编写漏洞攻击时,这种情况非常罕见。
恶意PDF样本嵌入了控制整个开发过程的JavaScript代码。一旦PDF文件被打开,JavaScript代码就会被执行。
在开发阶段,JavaScript代码开始操纵Button1对象。该对象包含特制的JPEG2000图像,该图像在Adobe Reader中触发了双重漏洞。
图1.操作Button1对象的JavaScript代码
JavaScript使用堆喷技术来破坏内部数据结构。在所有这些操作之后,攻击者实现他们的主要目标:从他们的JavaScript代码读取和写入内存访问。
图2.用于读写内存的JavaScript代码
使用这两个基本元素,攻击者找到EScript.api插件的内存地址,该插件是Adobe JavaScript引擎。使用来自该模块的汇编指令(ROP gadgets),恶意JavaScript会设置一个ROP链,这将导致执行本地shellcode。
图3.构建ROP链的恶意JavaScript
作为最后一步,shellcode初始化嵌入在PDF中的PE文件并将执行传递给它。
CVE-2018-8120 - Microsoft Windows中的权限升级
在利用Adobe Reader漏洞之后,攻击者必须打破沙盒。这正是我们正在讨论的第二个利用的目的。
此先前未知的漏洞的根本原因位于win32k Windows内核组件的NtUserSetImeInfoEx函数中。具体而言,SetImeInfoEx的子程序NtUserSetImeInfoEx不验证数据指针,允许空指针引用。
图4.反汇编的SetImeInfoEx例程
如图4所示,SetImeInfoEx函数需要一个指向已初始化的WINDOWSTATION对象的指针作为第一个参数。所述spklList如果攻击者创建一个新的窗口站对象,并将其分配给在用户模式的当前过程可能是等于零。因此,通过映射NULL页面并将指针设置为偏移量0x2C,攻击者可以利用此漏洞在内核空间中写入任意地址。应该注意的是,自Windows 8以来,用户进程不允许映射NULL页面。
由于攻击者有任意的写入原语,他们可以使用不同的技术,但在这种情况下,攻击者选择使用Ivanlef0u和Mateusz“j00ru”Jurczyk和Gynvael Coldwin描述的技术。攻击者通过重写全局描述符表(GDT)来设置一个调用门到Ring 0。为此,攻击者使用SGDT汇编指令获取原始GDT的地址,构建自己的表,然后使用上述漏洞重写原始表。
然后攻击使用CALL FAR指令执行一个特权级别的调用。
图5.反汇编的CALL FAR指令
一旦以内核模式执行代码,漏洞利用系统令牌替换当前进程的标记。
最初,研究人员在发现了该样本。样本不包含最终有效的那个版本,尽管样本没有包含真正的恶意攻击过程,这可能表明它是刚开发出来就被捕获,但作者展示了在漏洞发现和利用写作方面的高水平技能。
ESET检测名称
JS / Exploit.Pdfka.QNV木马
Win32 / Exploit.CVE-2018-8120.A木马
SHA-1哈希
C82CFEAD292EECA601D3CF82C8C5340CB579D1C6
0D3F335CCCA4575593054446F5F219EBA6CD93FE
英文原版
https://www.welivesecurity.com/2018/05/15/tale-two-zero-days/
本文由华盟网编辑翻译,转载请注明出处