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分析
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