CVE-2013-3918是由于Internet Explorer 7, 8, 9, 10的ActiveX控件中存在内存访问错误,攻击者可利用此漏洞在当前登录用户上下文中执行任意代码。

漏洞来源细节:

样本来源:http://www.secniu.com/blog/cve-2013-3918-exploit-analysis/

漏洞细节:http://technet.microsoft.com/en-us/security/bulletin/ms13-090

利用样本:http://jsunpack.jeek.org/?report=0fe86b1a6fc27dbd4134d96e68b9153682cc6831

漏洞相关环境:

操作系统:

Windows XP Service Pack 3
Windows XP Professional x64 Edition Service Pack 2
Windows Server 2003 Service Pack 2
Windows Server 2003 x64 Edition Service Pack 2
Windows Server 2003 with SP2 for Itanium-based Systems
Windows Vista Service Pack 2
Windows Vista x64 Edition Service Pack 2
Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 for Itanium-based Systems Service Pack 2
Windows 7 for 32-bit Systems Service Pack 1
Windows 7 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for Itanium-based Systems Service Pack 1

浏览器:

IE 7, 8, 9, and 10.

分析工具准备:

动态调试工具:OllyICE
静态分析工具:IdaPro
互联网浏览器:Internet Explorer8

寻找错误线索:

当打开该样本的时候,会出现崩溃情况,现在的任务是寻找为什么会出现崩溃;根据源代码中的<clsid:19916E01-B44E-4E31-94A4-4696DF46157B>,寻找相应操作clsid的API,如下:

StringFromGUID2
ProgIDFromCLSID
StringFromGUID2
CLSIDFromString

当错误发生的时候,可以在OllyICE中定位到如下地点,该位置位于ieframe.dll模块里边,用IDA打开该模块:

00D307E7    6A 27           push    27
00D307E9    8D45 AC         lea     eax, dword ptr [ebp-54]
00D307EC    50              push    eax
00D307ED    56              push    esi                                                                 ; <clsid:19916E01-B44E-4E31-94A4-4696DF46157B>
00D307EE    FF15 141CC400   call    dword ptr [<&ole32.StringFromGUID2>]                                ; ole32.StringFromGUID2
00D307F4    85C0            test    eax, eax
00D307F6    7C 1D           jl      short 00D30815

根据此函数特征可以在IDA中定位到如下位置:

.text:004F07B8 ; int __stdcall CExtensionRecorder__GetAdditionalInfo(GUID *rguid)
.text:004F07B8 ?GetAdditionalInfo@CExtensionRecorder@@IAEJPAU_EXTENSION_RECORD@@@Z proc near
此处省略一些代码。。。。。。
.text:004F07E7                 push    27h             ; cchMax
.text:004F07E9                 lea     eax, [ebp+sz]
.text:004F07EC                 push    eax             ; lpsz
.text:004F07ED                 push    esi             ; rguid
.text:004F07EE                 call    ds:__imp__StringFromGUID2@12 ; StringFromGUID2(x,x,x)

该API原型如下:

int __stdcall StringFromGUID2(const GUID *const rguid, LPOLESTR lpsz, int cchMax);

参数一的数据是一个GUID结构体来表示clsid,该数据如下:01 6E 91 19 4E B4 31 4E 94 A4 46 96 DF 46 15 7B,这个数据恰好对应到源代码中的clsid

定位错误位置:

现在有了以上的线索,我们下一步需要找出错误发生的原因,根据断点定位、推断理论以及堆栈信息,可以得出当崩溃发生时中断到了iertutil.dll模块的如下位置,当没有加载脚本时,该函数一直处于等待状态,当加载脚本之后,该函数立即发生中断.

5DDFF493    6A FF           push    -1
5DDFF495    6A 00           push    0
5DDFF497    FFB5 00F0FFFF   push    dword ptr [ebp-1000]
5DDFF49D    57              push    edi
5DDFF49E    FF15 BC11CA5D   call    dword ptr [<&KERNEL32.WaitForMultipleObjects>]                      ; kernel32.WaitForMultipleObjects
5DDFF4A4    85C0            test    eax, eax
5DDFF4A6    0F86 28390100   jbe     5DE12DD4
5DDFF4AC    3BC7            cmp     eax, edi
5DDFF4AE    0F83 71390100   jnb     5DE12E25

分析到这里之后就卡住了,胡乱调试一番无果后开始寻找漏洞的细节,就找到了上面最开始处【漏洞来源细节:[漏洞细节]】的URL,根据洞细节的URL上的线索,可以知道这是一个远程代码执行漏洞,注意下面的注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{19916e01-b44e-4e31-94a4-4696df46157b}]

"Compatibility Flags"=dword:04000400

当该项不存在的时候,就说明计算机能够被利用;分析到这里之后,既然是远程代码执行漏洞,就应该想办法看看如何利用;接下来,我们就编写一个Exploit出来测试一下该漏洞.

编写利用样本:

根据已有的分析和自己的研究,并编写出Exploit,由于我的机器上该样本不能正确执行,所有只有自己研究如何利用.注意:该样本与mcafee为同一个样本.现在我们要做的就是查找该样本不能正确执行的原因.注意样本源代码中的这个数据地址:var kkkkk="\u0433\u77c2(在下面的图能看到这个地址),该地址位于msvcrt.dll模块的_remove,在我的机器上该地址是0x77BF0433,这就是不能正确执行样本的原因,注意:这个RO链地址不是固定的.

.text:77BF0430                 or      eax, 0FFFFFFFFh
.text:77BF0433                 pop     ebp
.text:77BF0434                 retn

Exploit在这里就不编写了,大概利用过程和整个流程已经了解、熟悉了就行了.注意大家在分析样本的时候如果定位不到ShellCode,就搜索我Dump出来的数据:

0575A004  33 04 C2 77 D5 5E C1 77 FA 40 C2 77 92 9F C3 77  3聎誢羨鶣聎挓脀
0575A014  92 9F C3 77 92 9F C3 77 92 9F C3 77 92 9F C3 77  挓脀挓脀挓脀挓脀
0575A024  92 9F C3 77 92 9F C3 77 92 9F C3 77 92 9F C3 77  挓脀挓脀挓脀挓脀

另外发一段样本的ShellCode出来给欣赏一下:

056F1A24   /EB 10           jmp     short 056F1A36                   ; ShellCode开始
056F1A26   |5B              pop     ebx
056F1A27   |4B              dec     ebx
056F1A28   |33C9            xor     ecx, ecx
056F1A2A   |66:B9 8C01      mov     cx, 18C
056F1A2E   |80340B 9F       xor     byte ptr [ebx+ecx], 9F           ; 循环解密
056F1A32  ^|E2 FA           loopd   short 056F1A2E
056F1A34   |EB 05           jmp     short 056F1A3B
056F1A36   \E8 EBFFFFFF     call    056F1A26
056F1A3B    56              push    esi
056F1A3C    57              push    edi
056F1A3D    52              push    edx
056F1A3E    33C9            xor     ecx, ecx
056F1A40    64:8B71 30      mov     esi, dword ptr fs:[ecx+30]
056F1A44    8B76 0C         mov     esi, dword ptr [esi+C]
056F1A47    8B76 1C         mov     esi, dword ptr [esi+1C]
056F1A4A    8B5E 08         mov     ebx, dword ptr [esi+8]
056F1A4D    8B7E 20         mov     edi, dword ptr [esi+20]
056F1A50    8B36            mov     esi, dword ptr [esi]
056F1A52    817F 0C 3300320>cmp     dword ptr [edi+C], 320033
056F1A59  ^ 75 EF           jnz     short 056F1A4A                   ; 搜索kernel32.dll


翻译cve-2013-3918分析

URL:http://kc.mcafee.com/resources/sites/MCAFEE/content/live/PRODUCT_DOCUMENTATION/24000/PD24836/en_US/McAfee_Labs_Threat_Advisory_Exploit-CVE2013-3918.pdf

1,攻击流程:

    

攻击者传播特制的web页面—->用户访问有害web页面—->攻击者特制的web页面—->触发InformationCardSigninHelper Class ActiveX control漏洞—->执行ShellCode代码—->攻击者获得受害用户计算机的控制权

2,攻击过程:

    攻击者使用特制的html代码文件来触发InformationCardSigninHelper Class ActiveX control(CVE-2013-3918)漏洞,特制的html包含了一段ShellCode代码(如下图),当这段代码被触发之后会行rundll32.exe并向它注入恶意线程.

    

该漏洞存在于ActiveX control控件,漏洞原因是当web页面调用ActiveX control控件后,当web页面尝试用一个无效索引去访问一个数组对象的时候,Internet Explorer会发生崩溃,如下图:

该漏洞允许攻击者转移控制权到ShellCode,它采用ROP链来定位到msvcrt.dll,如下图:

ROP链使用“VirtualProtect ()”来改变被拷贝的ShellCode内存区域标志,由原标志可读可写(RW (READ/WRITE))改成可读可写可执行(RWX (READ/WRITE/EXECUTE)),下图是设置新内存区域保护标志为0×40:

    

ShellCode使用多个Xor Key进行解密出多段真实代码,完成后并初始化解密KEY到0x9F,它循环解密出ShellCode将要使用的API名称,这些名称是:LoadLibraryA, WinExec,CreateThread, OpenProcess, CreateProcessA, VirtualAllocEx, WriteProcessMemory and CreateRemoteThread. 如下图:

之后运行rundll32.exe,并使用以上API进行注入,如下图:

最后,当控制权完全被rundll32.exe获得的时候,它再使用KEY(0×01、0x6A)进行解密,当解密完成之后,控制权被转移,并进行最后有效的解密.

漏洞修复方案:

请建立一个Patch.reg文件,并且把以下数据复制到文件内,双击运行它,添加到注册表.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{19916e01-b44e-4e31-94a4-4696df46157b}]
"Compatibility Flags"=dword:04000400

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility\{19916e01-b44e-4e31-94a4-4696df46157b}]
"Compatibility Flags"=dword:04000400

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{c2c4f00a-720e-4389-aeb9-e9c4b0d93c6f}]
"Compatibility Flags"=dword:04000400

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility\{c2c4f00a-720e-4389-aeb9-e9c4b0d93c6f}]
"Compatibility Flags"=dword:04000400

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{53001f3a-f5e1-4b90-9c9f-00e09b53c5f1}]
"Compatibility Flags"=dword:04000400

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility\{53001f3a-f5e1-4b90-9c9f-00e09b53c5f1}]
"Compatibility Flags"=dword:04000400

源链接

Hacking more

...