CVE-2017-11882及利用样本分析

访客 329 0
本文来源:Gcow安全团队

CVE-2017-11882及利用样本分析

1.本文由复眼小组ERFZE师傅原创
2.本文略微偏向基础,首先介绍了该漏洞的成因,并且分析了该漏洞在蔓灵花,摩诃草,响尾蛇APT组织用于实际攻击活动中的详细调试过程
3.本文全文字数共2234字,图片95张 预计阅读时间14分钟

0x01 漏洞描述

  • 成因:Windows的公式编辑器EQNEDT32.EXE读入包含MathType的OLE数据,在拷贝公式字体名称时没有对名称长度进行校验,使得攻击者可以通过刻意构造的数据内容覆盖栈上的函数返回地址,从而劫持程序流程。

  • 影响版本:Microsoft Office 2007 Service Pack 3, Microsoft Office 2010 Service Pack 2, Microsoft Office 2013 Service Pack 1, Microsoft Office 2016

  • POChttps://github.com/Ridter/CVE-2017-11882

0x02 漏洞分析

笔者复现及分析环境:Windows 7 Service Pack 1、Microsoft Office 2010、x32dbg、IDA 7.0

EQUATION.exe存在:

CVE-2017-11882及利用样本分析-第1张图片-网盾网络安全培训

设置注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE

CVE-2017-11882及利用样本分析-第2张图片-网盾网络安全培训

Debugger键值为x32dbg路径。

生成POC:

CVE-2017-11882及利用样本分析-第3张图片-网盾网络安全培训

打开该文档,于WinExec()函数处设断:

CVE-2017-11882及利用样本分析-第4张图片-网盾网络安全培训

成功断下后,查看栈中返回地址:

CVE-2017-11882及利用样本分析-第5张图片-网盾网络安全培训

继续向上查看栈,发现调用WinExec()的函数:

CVE-2017-11882及利用样本分析-第6张图片-网盾网络安全培训

通过IDA分析sub_4115A7功能:

CVE-2017-11882及利用样本分析-第7张图片-网盾网络安全培训

跟进sub_41160F查看:

CVE-2017-11882及利用样本分析-第8张图片-网盾网络安全培训

未校验长度,直接使用strcpy()函数,此处应该就是漏洞触发位置。进一步确定具体位置:

CVE-2017-11882及利用样本分析-第9张图片-网盾网络安全培训

0x411658处设断,重新运行。第二次成功断下后,查看ESI寄存器指向内存内容:

CVE-2017-11882及利用样本分析-第10张图片-网盾网络安全培训

此时ECX寄存器值为0xC,即复制48个字节到EDI寄存器指向内存,而var_28实际大小只有36个字节:

CVE-2017-11882及利用样本分析-第11张图片-网盾网络安全培训

到达函数结束处:

CVE-2017-11882及利用样本分析-第12张图片-网盾网络安全培训

leave指令执行完毕后,栈顶0x18F1D0处值为0x430C12,即调用WinExec()。而传递参数正是0x18F350指向内存中的cmd指令:

CVE-2017-11882及利用样本分析-第13张图片-网盾网络安全培训

成功弹出计算器:

CVE-2017-11882及利用样本分析-第14张图片-网盾网络安全培训


下面对使用到的POC进行简要分析。各变量含义由命名可知,RTF文档格式并非本文重点,如读者此前对RTF文档格式没有了解,建议先阅读文末参考链接中有关RTF文档格式的文章后再看POC源码。

CVE-2017-11882及利用样本分析-第15张图片-网盾网络安全培训

首先判断命令长度是否小于43,而43这个数字是因为:

CVE-2017-11882及利用样本分析-第16张图片-网盾网络安全培训

上图选中部分是插入命令处,具体偏移由POC中COMMAND_OFFSET(0x949*2)变量给出。

将命令插入到构造数据中之后,函数返回拼接好的OLE。下面将OLE嵌入到RTF文档中:

CVE-2017-11882及利用样本分析-第17张图片-网盾网络安全培训

0x03 摩诃草(APT-C-09)组织某样本分析

MD5:0D38ADC0B048BAB3BD91861D42CD39DF

0x411658处设断,在第二次断下时,各寄存器值如下:

CVE-2017-11882及利用样本分析-第18张图片-网盾网络安全培训

继续执行到函数结束处leave指令:

CVE-2017-11882及利用样本分析-第19张图片-网盾网络安全培训

0x18F230地址处值0x430**7即覆盖后的函数返回地址:

CVE-2017-11882及利用样本分析-第20张图片-网盾网络安全培训

而该地址处指令是ret,有些出乎意料。继续向下执行,来到0x18F3B0处,正是0x18F234地址处值:

CVE-2017-11882及利用样本分析-第21张图片-网盾网络安全培训

这方才是构造者意欲执行的指令。经过蓝色方框中的一系列运算后,EBX指向是真正的Shellcode:

CVE-2017-11882及利用样本分析-第22张图片-网盾网络安全培训

上述内容均可在OLE中查看(路径\xl\embeddings):

CVE-2017-11882及利用样本分析-第23张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第24张图片-网盾网络安全培训

将OLE0x10000x1520中数据复制到一bin文件后,通过IDA查看。sub_247功能如下:

CVE-2017-11882及利用样本分析-第25张图片-网盾网络安全培训

该函数接受的第二个参数即上文提到的EBX指向地址,于OLE中位置是0x1040,而0x1040+0x558处内容如下:

CVE-2017-11882及利用样本分析-第26张图片-网盾网络安全培训

故该函数第一个功能是修正PE文件头。第二个功能流程如下:

CVE-2017-11882及利用样本分析-第27张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第28张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第29张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第30张图片-网盾网络安全培训

0x1040+0x558后的PE文件数据写入到%APPDATA%\MSBuild.exe中。第三个功能流程如下:

CVE-2017-11882及利用样本分析-第31张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第32张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第33张图片-网盾网络安全培训

%APPDATA%\MSBuild.exe写入注册表run项键值lollipop中。

0x04 响尾蛇(SideWinder)组织某样本分析

将文档拖进WinHex查看:

CVE-2017-11882及利用样本分析-第34张图片-网盾网络安全培训

可以看出该文档实质是一RTF格式文档。

rtfobj.py分析如下:

CVE-2017-11882及利用样本分析-第35张图片-网盾网络安全培训

Package后文会提到,先来看其CVE-2017-11882利用部分。

同样是第二次断下时:

CVE-2017-11882及利用样本分析-第36张图片-网盾网络安全培训

其后的执行流程与上一样本相似:

CVE-2017-11882及利用样本分析-第37张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第38张图片-网盾网络安全培训

经过绿色方框中的一系列运算后,调用GlobalLock()函数,传递参数如下:

CVE-2017-11882及利用样本分析-第39张图片-网盾网络安全培训

接下来跳转到GlobalLock()函数返回内存区域中:

CVE-2017-11882及利用样本分析-第40张图片-网盾网络安全培训

经过两次call调用:

CVE-2017-11882及利用样本分析-第41张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第42张图片-网盾网络安全培训

修正内存中的字符串:

CVE-2017-11882及利用样本分析-第43张图片-网盾网络安全培训

接下来寻址kernel32.dll

CVE-2017-11882及利用样本分析-第44张图片-网盾网络安全培训

其所调用的函数功能如下:

CVE-2017-11882及利用样本分析-第45张图片-网盾网络安全培训

两次call调用之后:

CVE-2017-11882及利用样本分析-第46张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第47张图片-网盾网络安全培训

其功能为返回某函数调用地址,此次是LoadLibrayW()

CVE-2017-11882及利用样本分析-第48张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第49张图片-网盾网络安全培训

接下来,返回GetProcAddress()调用地址:

CVE-2017-11882及利用样本分析-第50张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第51张图片-网盾网络安全培训

继续call调用:

CVE-2017-11882及利用样本分析-第52张图片-网盾网络安全培训

其后流程如图所示:

CVE-2017-11882及利用样本分析-第53张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第54张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第55张图片-网盾网络安全培训

下面将字符串解密,并覆盖原CommandLine内容:

CVE-2017-11882及利用样本分析-第56张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第57张图片-网盾网络安全培训

执行完结果如下:

CVE-2017-11882及利用样本分析-第58张图片-网盾网络安全培训

最后实际执行部分:

javascript:eval("sa=ActiveXObject;ab=new sa(\"Scripting.FileSystemObject\");
eval(ab.OpenTextFile(ab.GetSpecialFolder(2)+\"\\\\1.a\",1).ReadAll());windowclose()")

其后调用RunHTMLApplication()

CVE-2017-11882及利用样本分析-第59张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第60张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第61张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第62张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第63张图片-网盾网络安全培训

1.a就是之前提到RTF文档中的Package,其实质是一JS文件:

CVE-2017-11882及利用样本分析-第64张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第65张图片-网盾网络安全培训

最后,其执行结果大体如下图所示:

CVE-2017-11882及利用样本分析-第66张图片-网盾网络安全培训

0x05 蔓灵花(Bitter)组织某样本分析

通过远程模板注入的方式下载一RTF格式文档:

CVE-2017-11882及利用样本分析-第67张图片-网盾网络安全培训

拖进WinHex查看,可以确认其格式为RTF文档格式:

CVE-2017-11882及利用样本分析-第68张图片-网盾网络安全培训

添加文件扩展名后,打开该文档。同样是于于0x411658处第二次断下时:

CVE-2017-11882及利用样本分析-第69张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第70张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第71张图片-网盾网络安全培训

跳转之后经过绿色方框中一系列计算,接着跳转:

CVE-2017-11882及利用样本分析-第72张图片-网盾网络安全培训

fldpi将π的值加载到FPU堆栈:

CVE-2017-11882及利用样本分析-第73张图片-网盾网络安全培训

执行完后fpu_instruction_pointer指向fldpi指令,其后的fnstenv指令将FpuSaveState结构体保存到esp-0xC处:

CVE-2017-11882及利用样本分析-第74张图片-网盾网络安全培训

如此一来,pop ebp后EBP寄存器的值是fpu_instruction_pointer——fldpi指令位置:

CVE-2017-11882及利用样本分析-第75张图片-网盾网络安全培训

由EBP计算出需要解密的数据起始位置,EDX中存储的是数据长度(0x315):

CVE-2017-11882及利用样本分析-第76张图片-网盾网络安全培训

接着执行解密后的指令:

CVE-2017-11882及利用样本分析-第77张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第78张图片-网盾网络安全培训

跳转后,执行相应指令,接下来call调用:

CVE-2017-11882及利用样本分析-第79张图片-网盾网络安全培训

sub_562B2F功能是获取指定的系统函数调用地址,此次是kernel32.VirtualAlloc()

CVE-2017-11882及利用样本分析-第80张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第81张图片-网盾网络安全培训

之后调用VirtualAlloc()申请内存空间:

CVE-2017-11882及利用样本分析-第82张图片-网盾网络安全培训

向申请的内存空间中写入数据:

CVE-2017-11882及利用样本分析-第83张图片-网盾网络安全培训

调用sub_562B2F获取kernel32.Wow64DisableWow64FsRedirection()调用地址:

CVE-2017-11882及利用样本分析-第84张图片-网盾网络安全培训

LoadLibrary(shell32)

CVE-2017-11882及利用样本分析-第85张图片-网盾网络安全培训

传递参数给sub_562B2F,获取shell32.ShellExcute()调用地址:

CVE-2017-11882及利用样本分析-第86张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第87张图片-网盾网络安全培训

LoadLibrary(urlmon)

CVE-2017-11882及利用样本分析-第88张图片-网盾网络安全培训

获取urlmon.URLDownloadToFile()调用地址:

CVE-2017-11882及利用样本分析-第89张图片-网盾网络安全培训CVE-2017-11882及利用样本分析-第90张图片-网盾网络安全培训

调用URLDownloadToFile(),其传递参数如图:

CVE-2017-11882及利用样本分析-第91张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第92张图片-网盾网络安全培训

读取文件:

CVE-2017-11882及利用样本分析-第93张图片-网盾网络安全培训

CVE-2017-11882及利用样本分析-第94张图片-网盾网络安全培训

由于没有获取到文件,计算出的EBX值错误:

CVE-2017-11882及利用样本分析-第95张图片-网盾网络安全培训

故至此结束。

0x06 参考链接


标签: 样本分析 CVE-2017-11882

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~