今天,我们将向您介绍一种将恶意软件发送到Buhtrap组的新方法。

引导加载程序模块
12月19日,我们发现包含可执行文件(
md5:faf833a1456e1bb85117d95c23892368 )的恶意邮件。 该文件具有各种名称:“对帐December.exe”,“ Docs wednesday.exe”,“ Documents 19.12.exe”,“关闭文件wednesday.exe”。
有趣的是-该文件是用.Net编写的,对于该犯罪集团而言并不常见。 要反编译.Net,可以使用任何软件:
Reflector ,
dotPeek ,
dnSpy ,
ILSpy 。 在本文中,我们将讨论该文件实现的功能以及我们如何对其进行分析。
引导程序初始检查
为了进行分析,我们使用了
dnSpy ,所有其他屏幕截图都将来自
于此 。
出于习惯,请在
IDA Pro中打开可执行文件,然后查看导入部分。 范例:

一些功能的存在表明存在打包的有效负载(
LoadCursorW ,
LoadIconW-从资源中获取对象,
VirtualProtect-更改页面属性,然后您可以执行代码)和简单的反调试(
IsDebuggerPresent )。 但是事实证明一切都变得更加简单。 执行甚至没有达到IsDebuggerPresent,并且LoadCursorW和
LoadIconW无法工作,因为他们试图访问不存在的资源(来自“
fiza ”的LoadCursorW和来自“
saxikulatebutohutejijobodugore ”的
LoadIconW ):


但是回到
dnSpy反编译器。 在可执行文件中,我们看到大量非托管代码:

要了解正在调查的文件中包含哪些非托管代码,我们将使用IDA Pro。 最简单的方法是以十六进制形式查看非托管代码的主体。 为此,请转到偏移文件偏移。 以
_main()函数为例:


接下来,在
IDA Pro中,我们将按十六进制序列进行搜索:

在输出中,我们获得了非托管函数_main(),您可以在idov反编译器的帮助下方便地使用它:


获取有效载荷
返回dnSpy。 注意变量
payloadData 。


我们在IDA Pro中找到此序列,获取到它的链接,并发现调用仅在
_main()函数中发生:

使用此缓冲区的反编译代码如下所示:

以下函数负责转换此缓冲区:

在这里,
holdrand变量被
初始化为
0xEA48CB16,并且为有效
负载中的每个字节(
sbyte c参数 )在循环中调用
foo()函数。 应该注意的是,t()函数来自一个不安全的代码:如果查看它的代码,可以确保它始终返回
0x343FD 。
我们使用IDA Pro武装自己,并查看结果未打包的缓冲区,我们注意到它在开始时包含一些代码:

在距缓冲区开头的偏移量
0x15A0处,有一个可执行文件位于:

保存以供以后分析。
好吧,在可执行代码本身中,实现了一个相当琐碎的事情。 首先,形成以下结构(
此处mz_base是具有未打包PE的缓冲区中的偏移地址,其余字段是所需函数和库句柄的地址 ):

然后,使用获得的功能,创建相同可执行文件的进程(
md5:faf833a1456e1bb85117d95c23892368 ),然后将解压缩的可执行文件映射到新进程的虚拟地址。 更改可执行指令的地址(一堆
GetThreadContext和
SetThreadContext )后,新进程的线程启动,并且父进程本身也被杀死。
好了,现在我们来分析生成的可执行文件(有效负载)。
有效载荷开箱
有效负载(
md5转储:d8f40c7060c44fab57df87ab709f058f )也写在.Net Framework上。
为了防止进行静态和动态分析,
恶意软件开发人员使用了最新流行的
ConfuserEx保护器:
ConfuserEx是一个完善的开源保护程序。
初次拆箱
受此保护器保护的文件的入口点如下:

解密后,字节数组以称为
koi的模块的形式加载到内存中。 然后确定并调用此模块的主要方法。 在.Net平台上,可以通过调用
Module.ResolveMethod()函数从元数据令牌中获取模块中的方法或构造函数。 要将控制转移到所获得的方法,请使用
MethodBase.Invoke()函数。
koi模块中的可执行代码如下:

要除去胎面,我们使用了以下实用程序:
ConfuserEx-Unpacker解密了方法中的行和代码,
de4dot使方法的名称可读。
结果是适合静态分析的代码:

当然,我们很幸运能获得可读的代码。 病毒编写者可以修改
ConfuserEx脚本的源代码,以进一步使分析复杂化。
为了方便地分析文件,仍然需要解决两个问题。
第一个问题
卸下胎面后,反编译器无法解析某些方法。 例如:

如果切换到IL代码,则会在空指针处注意到调用:

要修复反编译错误,请用nop指令替换不正确的指令。 (
dnSpy实用程序允许
您修改反编译的代码和IL代码。)
替换后,反编译的代码看起来正确:

在所有有问题的方法中更改IL代码,我们得到了一个完全反编译的文件。
第二个问题
生成的文件不太可能启动,这排除了进行动态分析的可能性。 要解决此问题,必须在可执行文件的结构中指定输入法的标记。
您可以通过以下两种方式之一找到它:
解压缩文件之前,使用
Module.ResolveMethod() :

- 在解压缩的文件中,找到带有标签[STAThread]的方法 :

在这种情况下,输入法的元数据令牌为
0x6000106 。 我们使用
CFF Explorer实用程序对其进行更改:

保存更改后,解压缩的文件将启动并正确调试。
引导加载程序分析
开始工作后,引导加载程序会立即检查它是否在虚拟环境中运行。
通过在以下注册表值中搜索子字符串“ vmware”和“ qemu”来确定在
VMWare或
QEMU下运行:
- [HKLM \系统\ CurrentControlSet \服务\磁盘\枚举\ 0]。
如果检测到虚拟机,则引导程序将显示相应的窗口消息:

有趣的是,此消息的输出不会影响该流程的操作。
之后,恶意软件尝试将以下列表中的库加载到内存中:
SbieDll.dll,dbghelp.dll,api_log.dll,dir_watch.dll,pstorec.dll,vmcheck.dll,wpespy.dll,snxhk.dll,guard32.dll 。
此外,使用对
Debugger.IsLogging()和
Debugger.get_IsAttached()函数的调用,加载程序会检查它是否在调试器下运行。
如果至少一个库成功加载,或者加载程序检测到它正在调试器下运行,它将使用命令“
cmd / C ping 8.8.8.8 -n 1 -w 3000> Nul&Del ”自
删除 。 有趣的是,即使在实际系统上,引导加载程序也可以通过加载
dbghelp.dl l库来自动删除。
接下来,恶意软件检查是否从包含子字符串“ Mozilla”的目录中启动了该恶意软件。
如果该过程不是从包含子字符串“ Mozilla”的目录开始的
- 该恶意软件会创建一个位于桌面上的目录列表,其中包含以下子字符串(引导加载程序中的所有行均使用AES-256-ECB算法加密,加密密钥使用硬编码密码生成):

- 从浏览器历史记录中生成URL列表,其中包含以下子字符串:

- 生成位于目录“%UserProfile%\\ Desktop”,“%AppData%”,“ C:\\ Program Files(x86)”,“ C:\\ Program Files(x86)(x86)”和“具有以下名称:

- 计算与银行业务相关的指标中的非空列表的数量(在当前版本的引导加载程序中,此功能不影响任何操作)。
- 创建一个任务,使用户每次使用命令“ schtasks / create / f / sc ONLOGON / RL HIGHEST / tn LimeRAT-Admin / tr”登录时都运行此文件。
- 如果无法创建任务,请创建快捷方式“%AppData%\\ Microsoft \\ Windows \\ Start Menu \\程序\\ Startup \\ MozillaUpdate.lnk”,指示“%Appdata%\\ Mozilla \\ xaudiodg.exe” ,以确保每次重新启动系统时都启动xaudiodg.exe文件。
- 它将沿着路径“%AppData%\\ Mozilla \\ xaudiodg.exe”复制自身。
- 删除文件<self_path>:Zone.Identifier,运行xaudiodg.exe并自我删除。
如果该过程是从包含子字符串“ Mozilla”的目录中启动的
- 恶意软件还会在受感染的系统中寻找上述银行业务指标。
- 收集其他系统信息以发送到管理服务器。
- 在单独的线程中,将信息发送到C&C,并等待服务器的响应。
- 在另一个线程中,它以无穷循环将加密的字符串“ PING?”发送到服务器。
管理服务器交互
经过测试的恶意软件样本中的服务器IP地址为213.252.244 [。] 200。 通过从列表中随机选择的端口初始化连接:
•8989,
•5656,
•2323。
初始化连接后,引导程序会立即将有关受感染系统的信息发送给C&C:
•用户ID,
•用户名
•操作系统版本,
•自己的版本(加载程序v0.2.1),
•在受感染的系统上找到银行业务指标的列表。
加载程序发送到管理服务器的一行示例:
«INFO<NYANxCAT>9D3A4B22D21C<NYANxCAT>IEUser<NYANxCAT> Windows 7 Enterprise SP 1 <NYANxCAT>loader v0.2.1<NYANxCAT><NYANxCAT><NYANxCAT>1c, »
如果受感染用户的桌面上有一个“ 1c”文件夹,并且没有其他指示,则将发送此行。
处理来自服务器的响应的功能如下:

来自服务器的解密响应如下:
从屏幕截图可以看出,COMMAND可以采用以下值之一:
- CLOSE-终止连接并关闭当前进程;
- DW-从base64的DATA2解码base64的内容,将其写入扩展名为DATA1的文件<temp_file_name>,并启动该文件以执行;
- UPDATE-解码DATA1中的base64内容,将其写入名称为<temp_file_name>和扩展名.exe的文件中,启动新的可执行文件并自行删除;
- RD--作为响应发送字符串“ RD-”;
- RD + -将屏幕截图发送到管理服务器;
- DEL-自删除。
在引导加载程序调查期间,我们设法从攻击者服务器获取DW命令。 结果,Punto Switcher软件安装了恶意的winmm.dll DLL(md5:9d25553bb09e2785262b2f7ba7923605),后者是Buhtrap间谍软件模块。
TCP流如下:


为了加密在客户端和管理服务器之间传输的数据,使用了
AES-128-ECB算法。 加密密钥使用硬编码的密码初始化。
解密后,流量如下:


从base64,使用以下内容对NSIS安装程序进行解码:

有趣的是,尽管银行指标列表为空,服务器还是做出了响应。
恶意DLL
winmm.dll库
是使用dll劫持技术执行的。 恶意模块将有关受感染系统的信息以及活动的智能卡读取器列表发送给C&C。 此外,它还具有键盘记录程序组件,并且能够从管理服务器接收其他恶意模块,并从磁盘或当前进程的内存中执行它们。 研究样本的C&C服务器位于以下地址:
- hxxp:// my1cprovider [。] xyz:6060 / klog [。] php
- hxxp:// tinderminderorli1999 [。] xyz:7764 / klog [。] php
结论
感染过程可以表示为以下方案:

尽管可以很好地进行分析,但很显然,引导加载程序目前无法正常工作,并且很可能在开发过程中:
- 即使在真实的系统上也可以自动删除;
- 在将自身复制到“%AppData%\\ Mozilla \\ xaudiodg.exe”之前以及与C&C进行交互之前,请检查受感染系统与银行业务的连接,但不会以任何方式使用此信息。
最后,回想起奇怪的窗口消息。 有趣的是,这是开发人员的缺陷吗?还是专门为了鼓励用户离开虚拟环境并在真实计算机上启动而进行的? 惠康发表评论。
国际奥委会
MD5:faf833a1456e1bb85117d95c23892368
9d25553bb09e2785262b2f7ba7923605网址:hxxp:// my1cprovider [。] xyz:6060 / klog [。] php
hxxp:// tinderminderorli1999 [。] xyz:7764 / klog [。] php
IP:
213.252.244 [。] 200