用户
搜索
  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 208 天

    连续签到: 1 天

    [LV.7]常住居民III

    版主

    Rank: 7Rank: 7Rank: 7

    27

    主题

    109

    帖子

    4157

    魔法币
    收听
    2
    粉丝
    3
    注册时间
    2015-11-20

    i春秋签约作者春秋文阁

    发表于 2017-12-23 11:13:33 06062
    本帖最后由 icq5f7a075d 于 2018-2-28 16:42 编辑

    参考链接:
    1. 漏洞介绍
    CVE-2017-11882是一个栈溢出的远程执行漏洞。该漏洞的成因是EQNEDT32.EXE进程在读入包含MathType的ole数据时,在拷贝公式字体名称Font Name数据时没有对名称长度进行校验,从而造成栈缓冲区溢出,是一个非常经典的栈溢出漏洞。函数给Font Name数据分配的大小是0x24个字节,超过该大小就会造成溢出。
    2. POC生成
    脚本来源:
    3. 漏洞分析
    3.1. 分析ichunqiu POC
    3.1.1. 定位漏洞程序
    运行poc1,弹出calc.exe。首先想到的是既然弹出新进程calc.exe,可能是调用WinExec运行calc.exe,于是在WinExec上下断点。
    在Windbg中附加调试Word.exe,下段WinExec:
    图片1.png
    运行POC,但是程序没有中断,clac.exe还是弹出来了。
    问题出在哪里?查看了其他分析文章发现,漏洞不是发生在Word.exe中的,而是发生在EQNEDT32.exe程序中。
    3.1.2. 附加调试漏洞程序
    但是我们无法定位EQNEDT32.exe在何时启动,需要想办法在EQNEDT32.exe启动时,使用调试器附加EQNEDT32.exe。
    设置注册表,EQNEDT32.exe进程启动时Windbg自动Attach上去:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE
    图片2.png
    这个时候运行POC,POC启动EQNEDT32.exe,Windbg自动启动附加EQNEDT32.exe。
    3.1.3. 基于栈回溯的漏洞分析
    在WinExec上下断点,但是bp WinExec下断点失败,下断点bp Kernel32!WinExec
    图片3.png
    g命令执行,程序断在了WinExec处,需要确定此WinExec是不是漏洞利用处的WinExec,查看函数参数,的确是开始了漏洞利用:
    图片4.png
    进行栈回溯:
    图片5.png
    WinExec的返回地址是0x40C18,调用WinExec的地址是0x430c12
    图片6.png
    POC数据中记录着0x430c12:
    图片7.png
    很明显这期间发生了覆盖函数返回地址,函数返回执行0x430c12了,我们就需要追踪上一个函数返回地址0x4218e4。
    0x4218e4在sub_421774中,程序调用sub_4115A7,没能正确返回,而是弹出了计算器:
    图片8.png
    重新启动POC,附加EQNEDT32.EXE,在0x4218df下段,g命令执行,
    程序断在了0x4218df,查看栈数据:
    图片9.png
    单步跟进,来到0x4115D3的位置:
    图片10.png
    我们继续跟进sub_41160F,来到0x411658,这里将[esi]的数据拷贝到[edi],正好将函数返回地址覆盖为0x430c12
    图片11.png
    函数返回后,程序执行到0x430c12,即call WinExec,参数恰好是0x4115D2处压入的参数-恶意构造的数据:
    图片12.png
    该公式编辑器并没有开启ASLR。这个硬编码的地址0x00430C12对应于对函数WinExec的调用。因而该字体名对应的命令得以执行。
    3.2. 数据结构分析
    在上一节,我们对POC1进行了分析,简单的了解了漏洞利用的过程,但是我们完全不明白漏洞中使用的数据的含义,接下来其数据结构信息分析。
    这次我们使用username脚本生成的POC2文件。
    3.2.1 提取Object数据
    POC2是rtf类型文档,使用rtfobj.py提取object生成doc类型文档,使用命令:rtfobj.py POC2 查看rtf文件中的OLE Package,使用命令:rtfobj.py -s 序号 ,提取为doc文件。
    使用Offvis可以迅速定位”  calc.exe”字符串。
    图片13.png
    根据网上公开的数据结构,整个“Equation Native”的数据构成:
    Equation Native Stream Data = EQNOLEFILEHDR + MTEFData,其中
    MTEFData = MTEF header + MTEF Byte Stream
    3.2.2  EQNOLEFILEHDR结构
    EQNOLEFILEHDR的结构如下:
    图片14.png
    在漏洞利用文档中,该结构如下所示:
    图片15.png
    比较重要的信息是,MTEF的长度:0x00000299。
    3.2.3  MTEF header
    紧随该公式头结构的数据为公式数据,MTEF数据。公式数据使用字节流进行存储。
    图片16.png
    MTEF v.3公式数据中,前5个字节为数据头,解析如下表所示:
    偏移量
    说明
    0
    MTEF版本号
    0×03
    1
    该数据的生成平台
    0×00表示在Macintosh平台生成,0×01表示在Windows平台生成。此处为0×01。
    2
    该数据的生成产品
    0×00表示由MathType生成,0×01表示由公式编辑器生成。此处为0×01。
    3
    产品主版本号
    0×03
    4
    产品副版本号
    0x0A
    3.2.4  MTEF stream
    在数据头之后的字节流即为公式数据。是一系列的records:
    图片17.png

    这里第一个records:0A,表示full size record,具体含义:
    图片18.png
    第二个records:08,表示FONT,具体含义:
    图片19.png
    数据0×08所对应的数据类型为FONT,文档中数据的解析如下表所示。
    数值
    解释
    0×08
    FONT记录标志
    0×5A
    typeface mumber
    0×5A
    [style]
    0xb844EB...
    [name]
    接下来我们再来看一下MTEF数据在文件中是如何存储的,OLE文件中的数据是按照section存储的(类似硬盘中的扇区),一段连续的数据可以存储在不连续的section中。如图,MTEF数据(数据是笔者任意构造的)的大小是0x299,一个section完全不够用,用完0x900-0xA00这个section后,数据并没有接着存放在0xA00的section中,而是存放在0xC00中:
    图片123.png 图片122.png
    3.3. usernamePOC分析
    POC2中的FONT [name]数据的前0x30字节如图:
    图片20.png
    poc将函数返回地址覆盖为0x4021140x402114处ret指令
    图片21.png
    执行0x402114处的ret指令,程序继续返回,这个返回到哪?还记得3.1.3章节中,栈溢出函数返回去执行WinExec,为什么能成功执行WinExec呢?因为此时栈顶存放的是0x12F350,存放的就是FONT [name]数据。
    所以执行0x402114处的ret指令程序返回执行FONT [name]数据,FONT [name]数据是我们就可以控制的,我们就可以任意构造shellcode了,POC2构造的段shellcode如下
    图片2221.png
    这段poc的作用和ichunqiu给出的poc作用基本相同,但是因为有了ExitProcess函数,程序的稳定性更好。
    在上面这段shellcode中,执行完add cx,0x3C,ecx里存放的就是FONT [NAME]的地址,而实际上FONT [NAME]就是shellcode,那么我们jmp ecx就可以执行任意shellcode了。事实上,username也给出了利用方法:
    图片1111.png
    4. 小结
    本文循序渐进,首先对ichunqiu实验环境中的POC进行了分析,对漏洞的基本情况进行了解;紧接着分析漏洞中使用的数据的数据结构,对POC的结构进行了解;最后,分析了usernamePOC,开始执行任意shellcode!




    评分

    参与人数 1魔法币 +50 收起 理由
    XiaoYue97 + 50 支持大表哥

    查看全部评分

    本帖被以下淘专辑推荐:

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册