12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 159|回复: 0

【Office漏洞 第一弹】CVE-2017-11882及利用样本分析

[复制链接]

282

主题

282

帖子

574

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
574
发表于 2020-7-7 21:37:46 | 显示全部楼层 |阅读模式
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
  • POC:https://github.com/Ridter/CVE-2017-11882
0x02 漏洞分析

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

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

Debugger键值为x32dbg路径。
生成POC:

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

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

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

通过IDA分析sub_4115A7功能:

跟进sub_41160F查看:

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

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

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

到达函数结束处:

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

成功弹出计算器:

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

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

上图选中部分是插入命令处,具体偏移由POC中COMMAND_OFFSET(0x949*2)变量给出。
将命令插入到构造数据中之后,函数返回拼接好的OLE。下面将OLE嵌入到RTF文档中:

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

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

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

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

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

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

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


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

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

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




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



将%APPDATA%\MSBuild.exe写入注册表run项键值lollipop中。
0x04 响尾蛇(SideWinder)组织某样本分析

将文档拖进WinHex查看:

可以看出该文档实质是一RTF格式文档。
用rtfobj.py分析如下:

Package后文会提到,先来看其CVE-2017-11882利用部分。
同样是第二次断下时:

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


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

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

经过两次call调用:


修正内存中的字符串:

接下来寻址kernel32.dll:

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

两次call调用之后:


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


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


继续call调用:

其后流程如图所示:



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


执行完结果如下:

最后实际执行部分:
javascript:eval("sa=ActiveXObject;ab=new sa(\"Scripting.FileSystemObject\");eval(ab.OpenTextFile(ab.GetSpecialFolder(2)+\"\\\\1.a\",1).ReadAll());windowclose()")其后调用RunHTMLApplication():





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


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

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

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

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

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



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

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

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

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

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

接着执行解密后的指令:


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

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


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

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

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

LoadLibrary(shell32):

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


LoadLibrary(urlmon):

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


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


读取文件:


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

故至此结束。
0x06 参考链接


  • Office恶意文件解析与混淆研究
  • https://github.com/Ridter/CVE-2017-11882
  • Office文件格式基础知识

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-18 23:53 , Processed in 0.111328 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表