0x00 前言
样本还是在星球看到的
0x01 基本信息
首先把样本下载到本地,winhex查看一下基本信息
基本可以确定是docx文档,尝试解压
这里可以确定是docx,直接添加docx后缀打开
又是典型的模板注入,注入地址http[:]//comodo[.]world/38
之前分析过几个donot的样本,都是这种方式的
载入的信息在VT上可以找到,昨天上传的,该地址目前vt还是全白
用于攻击的rtf文档就是这里的body
hash为5814950a7e44f89e338eca69dbee8a73
0x02 载入rtf文档
载入的rtf文档如下
根据上面的这些信息可以知道该文档应该是漏洞利用。
而之前在VT上又看到该文档与11882相关,于是再调试一下。
还是先打开word,然后插入公式编辑器,x32dbg附加之后在0041160f设置断点,此时可以看到堆栈一切正常
漏洞触发点应该在下面的00411658处
运行到00411658处之后,ESI如下:
EDI如下:
00411658指令执行之后,ESI赋值到EDI,成功淹没EBP
shellcode获取temp目录并放入到新开辟的内存中:
在%temp%目录下释放wbluikiiy.tty和image.ico文件,用于解密出后面远控的payload
然后读取tty文件的内容到新开辟的内存:
通过异或循环解密:
动态解密后面的代码:
创建开始菜单的连接
在C:\Windows\Tasks目录下释放js脚本,该脚本的功能是为了在后面调用执行dll文件
脚本内容为:var obl = new ActiveXObject(“WScript.shell”);
obl.run(‘rundll32 “C:\Windows\Tasks\Menu.dll”, tabs’);
var obl = new ActiveXObject(“WScript.shell”);.obl.run(‘rundll32”C:\Windows\Tasks\Menu.dll”,tabs’);
执行的Menu.dll如下
删除之前用于数据读取的文件:
删除之后结束掉当前的进程
0x03 Menu.dll
基本信息如下,是一个vc++编译的dll
通过之前的js脚本可以知道
程序最后会通过rundll32.exe 运行Menu.dll 参数为tabs
“C:\Windows\Tasks\Menu.dll” , tabs
这里参数为tabs的意思就是,在调用dll的时候,直接调用dll的tabs方法:
在这种时候,去查看dll的start函数和入口函数应该是如下的:
DLLmain:
__DllMainCRTStartup:
既然该dll的入口点是tabs函数,而tabs调用了sub_1000A2f0
那么直接查看sub_1000A2f0函数就可以了。
这里由于直接调试dll不方便,我就写了几行代码调用Menu.dll的tabs方法:
#include<windows.h>
#include<stdio.h>
int main()
{
HMODULE hModule = NULL;
hModule = LoadLibrary("Menu.dll");
typedef void(__stdcall *Func)(char* key);
Func funav=(Func)GetProcAddress(hModule,"tabs");
char *a = ",tabs";
funav(a);
return 0;
}
这里可以通过GetProcAddress函数直接获取到tabs的地址
这里可以看到是1000EC40,我们在该地址设置个断点,然后F9跑过来就可以了
释放的样本是一个远控样本,带有大量的混淆代码,最后会收集到本机一些基本信息上传到C2并与C2建立通信。
C2地址为:testypoha.top
分别释放两个文件
C:\Documents and Settings\Administrator\AppData\Roaming\EvMGR\ogg.bin
C:\Documents and Settings\Administrator\AppData\Roaming\EvMGR\BinWork.exe
一个do while循环,直到程序成功请求testypoha.top并且获取到返回值
最后这个木马就是体力活,没有什么特殊的,就跟着调试走下来就行了,问题就在于这个函数太长太长,跟的话需要一些耐心。
跟大佬沟通了一下,这个算是Donot的一个特征,就是payload的某个函数非常非常长。但实际上没什么特殊的功能,就是上传基本信息到C2,然后作为一个loader加载后续的payload。