概述
样本信息
原始样本为rar压缩包,样本以发票为诱饵进行投递,压缩包中包含了一个同名的lnk文件,lnk文件运行后会调用mshta.exe加载远程连接的hta文件
lnk文件所使用的archive[.]org 是一个免费的文件托管服务器,目前攻击者在该地址上托管了五个文件
分别是
Clean.hta | 29-Jun-2021 18:21 | 1.8K |
---|---|---|
clean_20210629_1819_archive.torrent | 29-Jun-2021 18:27 | 1.6K |
clean_20210629_1819_files.xml | 29-Jun-2021 18:27 | 1.4K |
clean_20210629_1819_meta.sqlite | 29-Jun-2021 18:21 | 20.0K |
clean_20210629_1819_meta.xml | 29-Jun-2021 18:27 | 769.0B |
Clean.hta
hta文件主要是内嵌了一份VBScript的脚本,从脚本内容可以看出来应该是作为下载器下载后续payload加载执行:
首先是设置窗口隐藏并创建Wscript.Shell对象
接着拼接长变量,选中部分的内容凭借之后为:Powershell
将后面的字符串替换组合之后,不难发现该hta脚本功能为:通过Powershell IEX加载执行远程链接的文件
discucion_4512377.txt
hta脚本中加载的远程链接为:https://ia601501.us.archive.org/18/items/discucion_4512377/discucion_4512377.txt
该站点依旧是免费的文件托管服务器
和上一阶段的脚本风格一致,此样本也是通过长变量名和动态替换的方式来干扰静态分析
替换之后还是比较容易发现,代码是通过Powershell下载后续payload保存到本地并通过Wscript.Shell加载执行:
下载的文件链接为:
https://ia601503.us.archive.org/15/items/discucion-456789/discucion%20_456789.txt
discucion%20_456789.txt
该文件依旧是一个Powershell脚本,程序在脚本中硬编码了一个exe和一个dll文件,通过
[Reflection.Assembly]::Load($H5).GetType(‘VBNET.PE’).GetMethod(‘Run’).Invoke($null,[object[]] ( ‘C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe’,$H1))
的方式加载dll执行恶意功能。
脚本首先是定义了一个base64的解码函数和一个字符串转Hex的转换函数
然后定义了两段数据,第一段数据将短横线替换为0传入到HBar转换函数中,第二段数据就是PE的十六进制数据:
转换之后,程序通过解码函数解码:
W1JlZmxlY3Rpb24uQXNzZW1ibHldOjpMb2FkKCRINSkuR2V0VHlwZSgnVkJORVQuUEUnKS5HZXRNZXRob2QoJ1J1bicpLkludm9rZSgkbnVsbCxbb2JqZWN0W11dICggJ0M6XFdpbmRvd3NcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjQuMC4zMDMxOVxhc3BuZXRfY29tcGlsZXIuZXhlJywkSDEpKQ
得到:
[Reflection.Assembly]::Load($H5).GetType(‘VBNET.PE’).GetMethod(‘Run’).Invoke($null,[object[]] ( ‘C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe’,$H1))
通过IEX加载起来,加载方式是通过aspnet_compiler.exe调用$h1(第二段数据),反射加载第一段数据的Run方法
Stealer.exe
$Server对应的PE文件程序集名为FUD,是一款剪贴板替换器,主要功能为捕获受害者主机上对钱包地址的复制行为并将其替换为指定地址,试图通过该方法截取受害者的数字货币交易。
程序入口点调用了ClipboardNotification.NotificationForm
在该类的实例化函数中,程序会通过两个NativeMethod调用,设置隐藏窗口执行,并且开启剪贴板监听
同时,在该类底部还有一个static string的赋值,这个赋值语句会在该类实例化之前就调用:
调用的Clipboard是攻击者自己实现的一个类,该用包含get和set方法,分别用于获取和设置剪贴板内容:
攻击者还重写了WndProc方法,拦截ctrl c的键盘消息,当程序捕获到m.Msg = 797 (也就是ctrl v)之后,程序将会获取当前剪贴板的内容,然后用预定义的正则表达式判断剪贴板中的值是否为比特币钱包地址、以太坊钱包地址、门罗币钱包地址中的一类。 若用户赋值的是钱包地址,程序则会调用Clipboard.SetText方法将预定义的钱包地址替换到剪贴板中。
正则表达式和对应的钱包地址如下:
VBNET.dll
释放的第二个文件是名为VBNET.dll的C#dll,根据上面脚本调用时的指令可以得知程序会调用VBNET namespace下 PE类的Run函数。
调用的Run函数会直接返回true,这其实是一个障眼法,程序真正调用的是PE类的默认实例方法PE()
此时可以自己编写一个简单的C#加载器,也可以使用github上开源的CSharpdllLoader加载调试dll。
这里就直接加载到PE实例方法中:
在CreateInstance调用时,可以F11跟进去,单步执行走到dll的空间,也可以dnspy加载dll之后,去对应的函数设置断点,然后直接F10步过,程序就会自动命中断点位置
程序外层的代码很长,有很多大的循环和switch case,主要是用于干扰分析人员,该dll的本质还是一个加载器。
在类的地步,可以看到有不少静态函数的初始化,在这些函数中可以看到的是都调用了thw5A3S0Gy这个函数,也就是上图所示的函数:
因此可以猜测,该函数有可能只是用于干扰用户分析的函数。这里可以直接尝试在第二个函数这里设置断点,成功命中:
调试分析之后,第一个函数似乎是检测代码完整性,程序似乎会计算部分数据的hash与预期对比,以此判断当前程序是否已经被修改(比如调用了去混淆的软件),第二个函数没有实际代码,第三个函数是检测调试器的,关键函数应该是第四个函数。
该函数依旧沿用了前面的代码风格,有较为严重的混淆,代码会遍历查找clrjit.dll模块
找到该dll之后将会尝试根据clrjit.dll获取版本信息
判断当前系统的.NET版本是否符合预期:
定义的一些诸如相关的API
解密函数: