您的位置:首页 > 其它

CVE-2017-11826浅析-word类型混淆漏洞

2017-10-31 20:00 786 查看
本文转载自CVE-2017-11826 Exploited in the Wild with Politically Themed RTF Document

漏洞环境

Win7

Office2010(wwlib.dll:14.0.7182.5000)

SHA256:aed93c002574f25dabd1859f080203a2c8f332e92c80db9aa983316695d938d3

分析过程

漏洞原理

攻击媒介是一个恶意的富文本文档(RTF),在这种情况下通常使用OLE技术以将载荷包含在文档内。RTFdump.py能够列出RTF文档中的所有控制字,我们感兴趣的特定控制字是\object,它被用来定义嵌入的OLE对象。





1698这一OLE对象的目的是用来自动加载COM动态库msvbvm60.dll,方法是通过在\oleclsid关键字内指定CLSID{D5DE8D20-5BB8-11D1-A1E3-00A0C90F2731}到Word的进程地址空间内。这个COM动态库并未开启ASLR,可以使用其中的rop链绕过ASLR。1703和1708对象似乎是Word文档,正如上面\objclass所指的那样。然而,这些OLE对象以16进制字符串展现,所以我们需要使用oletools中的rtfobj.py将16进制字符串转化为二进制格式以便阅读它们。



两个被提取的文档都是内嵌DOCX的OLE文件,可以使用oledump.py来dump Package的内容。



基于来自oledump.py的结果可以断定object_1703_Package.docx是一个堆喷射组件,这是一种用攻击者所控制的来自ActiveX对象的数据申请大块连续内存地址的技术。



除此之外,object_1708_Package.docx包含多个XML文件,你可以在解压这个DOCX文档后轻易看到它们,这个文档是用来被Word解析的。基于我们过去的经验,该文件内应该有能触发CVE-2017-11826漏洞的被恶意构造的XML文件。由于在一个DOCX文档中往往包含多个XML文件,逐个查看这些XML文件是很费时间的。所以我们决定祭出调试器来找出元凶。在windbg中崩溃时的情况如下。

First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=088888ec ebx=00000000 ecx=00000000 edx=00000004 esi=054cb29c edi=1014c8cc
eip=68bb962d esp=001c3358 ebp=001c33c4 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\Microsoft Office\Office14\wwlib.dll -
wwlib!DllGetClassObject+0xf2e3d:
68bb962d ff5104          call    dword ptr [ecx+4]    ds:0023:00000004=????????
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\Common Files\Microsoft Shared\office14\mso.dll -
0:000> kb
ChildEBP RetAddr  Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
001c33c4 68ad1a32 00000000 001c3438 00000000 wwlib!DllGetClassObject+0xf2e3d
001c3418 66524316 0000ffff 0000001a 0b648a94 wwlib!DllGetClassObject+0xb242
001c3458 6634929f 11940fe4 0bf3ffac 00000027 mso!Ordinal6611+0x120
001c34a8 71689441 0fb7ef6c 0b20dfb0 80000005 mso!Ordinal4512+0xa9d
001c3514 7168941f 00000004 0b648a9c 0b648a90 msxml6!Reader::ParseElementN+0x379 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 3032]
001c3560 7168941f 00000003 0b648a9c 0b648a90 msxml6!Reader::ParseElementN+0x268 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 2964]
001c35ac 7168941f 00000002 0b648a9c 0b648a90 msxml6!Reader::ParseElementN+0x268 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 2964]
001c35f8 7168941f 00000001 0b648a9c 0b648a90 msxml6!Reader::ParseElementN+0x268 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 2964]
001c3644 7168941f 0b648a9c 0b648a90 00000000 msxml6!Reader::ParseElementN+0x268 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 2964]
001c3690 716871df 0b648a90 00000000 00000000 msxml6!Reader::ParseElementN+0x268 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 2964]
001c36a0 7168711b 83515133 0b648a90 0b5c0fe8 msxml6!Reader::ParseDocument+0x97 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 2747]
001c36dc 71689e2b 835150f3 001c3738 001c3788 msxml6!Reader::Parse+0xb1 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 1482]
001c371c 71687dcb 0b648a90 119a000d 001c48a8 msxml6!Reader::parse+0x162 [d:\w7rtm\sql\xml\msxml6\mx\reader\reader.cxx @ 938]
001c376c 6634877d 0b648a90 119a000d 001c48a8 msxml6!SAXReader::parse+0x145 [d:\w7rtm\sql\xml\msxml6\mx\om\saxreader.cxx @ 828]
001c379c 6652455b 00000000 119a000d 001c48a8 mso!Ordinal318+0x8a3
001c37d4 68acede0 11940fe0 11b99ff0 0ffbcfec mso!Ordinal2664+0x234
001c48a8 68acd3c5 0fbf0948 00000000 0fa1eff0 wwlib!DllGetClassObject+0x85f0
001c5d80 68acc2db 001c603c 10198fe8 054cb250 wwlib!DllGetClassObject+0x6bd5
001c6024 68acbeca 001c603c 40280000 00000030 wwlib!DllGetClassObject+0x5aeb
001c609c 68acabee 0000000c 04012000 001c77a8 wwlib!DllGetClassObject+0x56da
001c7794 68ac984d 0000000c 00000000 04012000 wwlib!DllGetClassObject+0x43fe
001c7c3c 68b90b55 001c8584 00000001 00000000 wwlib!DllGetClassObject+0x305d
001c9010 68b8f6ff 001c9334 001c932c 04012000 wwlib!DllGetClassObject+0xca365
001c905c 68e53819 001c9334 001c932c 04012000 wwlib!DllGetClassObject+0xc8f0f
001ca5b0 690b404a 001ca60c 00000824 00000000 wwlib!DllGetClassObject+0x38d029
001cb65c 6890e9c5 001cbb50 ffffffff 00000001 wwlib!DllGetClassObject+0x5ed85a
001cbb24 688ff4f7 00000003 001cbb50 00000001 wwlib!DllMain+0x11dd4
001cdb94 6924b641 001cdc72 0000000a 001cdbfc wwlib!DllMain+0x2906
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for winword.exe -
001cfd08 2fdd1c68 2fdd0000 00000000 023aefc9 wwlib!FMain+0x491
001cfd2c 2fdd1ec2 2fdd0000 00000000 023aefc9 winword!wdGetApplicationObject+0x63a
001cfdbc 76a4ef8c 7ffdc000 001cfe08 7755367a winword!wdGetApplicationObject+0x894
001cfdc8 7755367a 7ffdc000 76598307 00000000 kernel32!BaseThreadInitThunk+0xe
001cfe08 7755364d 2fdd2045 7ffdc000 ffffffff ntdll!__RtlUserThreadStart+0x70
001cfe20 00000000 2fdd2045 7ffdc000 00000000 ntdll!_RtlUserThreadStart+0x1b
0:000> ub . l10
wwlib!DllGetClassObject+0xf2e13:
68bb9603 752d            jne     wwlib!DllGetClassObject+0xf2e42 (68bb9632)
68bb9605 8bb6f0170000    mov     esi,dword ptr [esi+17F0h]
68bb960b 8b06            mov     eax,dword ptr [esi]
68bb960d 8b10            mov     edx,dword ptr [eax]
68bb960f 4a              dec     edx
68bb9610 4a              dec     edx
68bb9611 8bce            mov     ecx,esi
68bb9613 e8ee70d4ff      call    wwlib!DllMain+0x3b15 (68900706)
68bb9618 8b4044          mov     eax,dword ptr [eax+44h]
68bb961b 8b4044          mov     eax,dword ptr [eax+44h]
68bb961e 8b4f44          mov     ecx,dword ptr [edi+44h]
68bb9621 894144          mov     dword ptr [ecx+44h],eax    // EAX=088888ec
68bb9624 8b4744          mov     eax,dword ptr [edi+44h]
68bb9627 8b4044          mov     eax,dword ptr [eax+44h]
68bb962a 8b08            mov     ecx,dword ptr [eax]
68bb962c 50              push    eax
68bb962d ff5104          call    dword ptr [ecx+4]    ds:0023:00000004=????????


执行wwlib!DllMain+3b15处的函数后返回一个位于0x88888ec的虚表。这个虚表在随后的代码中(位于0x68BB962D地址处)被解引用。当代码通过call指令解引用一个函数指针时,由于虚表处的内容为空,导致发生一处访问异常。在调试若干次后观察到相同的0x88888ec地址被上面所说的函数所返回。该函数应该会返回一个指向某未知对象的指针。虽然微软没有提供wwlib的符号,幸运的是基于栈回溯,我们能够辨认出一些有趣的XML解析函数,例如
msxml6!Reader::ParseDocument
msxml6!Reader::ParseElementN
,这些函数与XML文件的解析相关。最终,我们能够缩小我们分析的区间。在一番逆向后,位于Reader::ParseElementN内的Scanner::GetTokenValueQName函数映入了我们的眼帘。它的目的是获取标签名称(例如w:body),这是Office Open XML中使用的技术。为了缩短我们的分析时间,我们决定设置一些在函数被调用时可打印标签名的调试断点。



出现问题的名称似乎是o:idmap。我们可以马上在DOCX文档中的所有XML文件中查找有问题的名称,以锁定相关的XML文件。



进行一些试验后,我们能够确定这就是有问题的XML文件。将font name修改如下,然后发现一个不同的地址被(前面提到的函数)所返回。



在调试器里面得到了如下输出。



这一次我们在call指令前引发了访问异常,因为它解引用了0x410041,这正是我们在修改后的document.xml中所提供的。因此,我们可以得出结论,漏洞触发的根本原因是o:OLEObject标签名中嵌入的font标签名导致了wwlib!DllMain+3b15函数返回不正确的font对象,从而造成类型混淆。

shellcode

正如前面所示,通过操纵一个嵌入的font名称的内容,攻击者可以在call指令中指定任意地址。攻击者选择了静态的0x88888ec地址,这是我们在初始的document.xml文档中看到的的font名称被编码成unicode导致的结果。这时候就轮到堆喷射出场了。如果堆喷射成功执行,activeX1.bin内的栈置换语句和硬编码的shellcode就会被写到0x88888ec地址空间。stage1的shellcode将会执行下面的步骤。

调用kernel32!VirtualAlloc去创建一个带有可执行属性的内存页

调用一系列kernel32!GetFileSize,句柄值从0开始,每次调用函数的时候按4递增,直到返回的文件大小位于0xA000和0x200000之间,该大小与到RTF文档内利用的部分的大小相等

在前面步骤中的句柄被找到后调用kernel32!MapViewOfFile以将文件内容映射到内存

解析文件内容,寻找FE FE FE FE FE FE FE FE FE FE FE FE FF FF FF FF这一标记,然后将紧随标记的0x150个DWORD数据值用0xBCAD3333这个密钥进行异或解密

被解密部分的字节随后会被存储到shellcode在前述阶段申请的具有可执行属性的内存页,执行流转移到stage2的shellcode

第二阶段shellcode的释放最终的载荷到%APPDATA%\Microsoft\Word\STARTUP..wll,这是一个dll,它会释放和执行存储在被释放文件的资源内的downloader。在成功执行最终的载荷后,诱饵文档会被覆写到原来的RTF文件中。



downloader会连接到http://45.76.36.243/articles去下载带.html扩展名的文件,这些文件包含的是加密数据。



它首先会下载和解密937933.html文件,该文件包含一个指向其它html文件的url列表。其余5个html文件其实是被分解为5部分的被加密的后门服务端文件。这个后门,现在被我们叫做IRAFAU,它来自在分析过程中一段被解密的字符串,看着它像是用被修改过的UPX壳加壳过的文件。



脱壳后字符串仍然被加密,并且用到的API是动态导入的。该恶意软件做的第一件事是去初始化一个用来存储被解密的字符串的结构体,这个结构体会在接下来的函数调用中被使用。其中包括CC的字符串,函数指针,和将会在整个执行过程中被用到的动态导入的API。这个结构体作为一个参数传给调用的子函数。



在连接位于saudiedi.toh.info的C2服务器前,这个恶意软件会在被感染的系统里面搜集计算机名、MAC地址、本地IP地址、操作系统版本、操作系统语言识别符和地理位置识别符等信息,然后将这些信息通过HTTP POST的方式发送给C2服务器。然后它会通过计算被感染系统{computer name}:{mac address}的MD5来生成受害者ID。被搜集的信息随后被加密并使用下列参数通过HTTP POST发送到C2服务器。

saudiedi.toh.info/search?q=%{hex}%{hex}%{hex}%{hex}&cvid={numbers}


服务器将会发送一个包含命令类型和参数的被加密的数据结构。基于命令类型,后门恶意软件将会执行任意下面的功能:结束一个进程、创建和删除目录、枚举所有可用的驱动器、查找特定文件、删除文件、移动/重命名文件、下载和上传一个文件、执行一个特定文件和执行远程shell。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: