0x00 前言
在群里看到有人讨论这个样本
看到vt上面上传时间是一小时前(201911-12-14:10)
0x01 分析
样本是office宏代码的
还冒充了360
是一个带混淆的宏
入口点在AutoOpen函数
通过bkkfybx1l函数拼接路径,然后指明到%temp%~$doc-ad9b812a-88b2-454c-989f-7bb5fe98717e.ole
循环填充
然后读取OLE文件内容到变量
继续往下调试的时候老是报错,我确定了一下文件路径没问题,那说明就是文件无法打开
看下面的代码发现有点问题
查看释放的OLE文件
好像…是个dll
该PE文件md5:8e2b5b95980cf52e99acfa95f5e1570b
于是我重新调试之前的vbs,把ole后缀改为了dll
现在会执行:
regsvr32.exe “C:\Users\Shyt\AppData\Local\Temp~$doc-ad9b812a-88b2-454c-989f-7bb5fe98717e.dll”
由于是使用regsvr32.exe调用的这个dll
所以直接尝试使用regsvr32.exe启动dll并且捕获行为
程序首先在C:\Documents and Settings\Administrator\Local Settings\Temp路径释放了一个docx文件:
File-aff94b08-6d9f-48c5-9900-5bee8ef5ab33.docx
首先会尝试访问:
jcdn.jsoid.com
接着循环访问:
news.shangrilaexports.com
clip.shangweidesign.com
通过regsvr32加载dll进来之后会停在DllInstall的入口点
程序第一次的时候会通过GetEnvironmentVariableW判断是否能取到环境变量N92KG7KSpA21lGd2OPZA
如果不能则通过SetEnvironmentVariableW设置
然后通过CreateProcess再次调用自身
这样重新启动的时候进来就是第二次执行,此时环境变量已经设置好,可以正常执行
调试的时候我是使用od附件的regsvr32.exe然后给它传递了dll文件的路径作为参数,当程序通过SetEnvironmentVariableW设置了环境变量之后,我并没有重新运行,直接在DllInstall入口点重新设置EIP继续运行就可以了。
调用sub_10001270
程序会首先通过VirtualAlloc分配一个内存空间,然后使用memmove填充
然后通过sub_10001120释放一个看起来正常的docx文档并打开
该文档打开后可以起到一个迷惑用户的作用,是海莲花的一贯做法
然后在10001469处call到新内存:
解密:
然后在009C02A9处有一个大循环,退出条件是当EDI等于244时。
新一轮的判断:EDI=BA
009C041E这里EDI=4A
诸如此类jb+jmp的判断还有大概几十轮,这里直接F4到jb上面的je的目标地址就好了。
一直到解密出WinHttpConnect的API,参数是jcdn.jsoid.com
GET上传本机的ComputerName、Username、OS到jcdn.jsoid.com/script/word.png
接着又分配了两次新的内存空间:
内存填充
00F20110开始的地址,多次分配和填充
分配和填充5次之后得到完整的PE文件
该文件就是海莲花常用的木马Denis:
网络请求函数
程序会一直循环尝试与三个C2地址建立连接
如果三个请求都失败,会Sleep一段时间再次循环请求
IOC
文件MD5
3c3b2cc9ff5d7030fb01496510ac75f2
8e2b5b95980cf52e99acfa95f5e1570b
CC地址
jcdn.jsoid.com
news.shangrilaexports.com
clip.shangweidesign.com