操作TA505,第四部分。 双胞胎



我们继续谈论黑客组织TA505的活动。 众所周知的短语“新的是被遗忘的旧”最适合作为TA505小组故事下一章的标题。 没错,这一次“旧”并没有被“遗忘”,而是对其进行了重新设计和改进。

在9月初,我们发现了几个带有特殊分组PE-packer的恶意下载程序,我们先前对此进行了介绍 。 乍一看,它们看起来像是著名的FlawedAmmyy后门舞台表演者。 但是更深入的分析表明事实并非如此。 就执行质量而言,并不是最先进的代码编写技术带给我们根本上相反的负载。

在本文中,我们将仔细研究找到的工具,并与已知的工具进行比较。

引导加载程序


首先,以下内容令人感到好奇:在我们设法收集的所有引导加载程序样本中,只有一个具有数字签名:



1.引导加载程序的数字签名

以PEAR SOLUTIONS LTD名义发行的证书。 顺便说一句,这并不是团体首次签署其工具,并将其作为虚拟组织的合法软件进行伪造。 以下是将TA505用于其他恶意软件家族的其他一些名称:

  • ET HOMES LTD,
  • 丰和有限公司
  • MISHA LONDON LTD,
  • 柴田聪司MB,
  • 非常电视有限公司。

由于检测到的引导加载程序之间没有区别,因此我们选择上述已签名的引导加载程序并对其进行详细介绍。

在整个恶意软件的工作过程中,几乎每个动作都伴随着写入日志文件并调试所有发生的事情的输出:



2.调试输出和记录

这种跟踪不仅简化了文件的静态分析,而且还有助于找出动态分析系统中存在的问题:



3.在ANY.RUN在线分析器中调试输出

Troyan检查键盘的语言布局-不适用于俄罗斯和邻国:



4.检查键盘的语言布局
然后,它创建Global\system32_mutant_service互斥量,并使用对google.com的HTTP GET请求检查Internet可用性。 之后,它将通过服务myexternalip.com,ipecho.net和ifconfig.me确定外部IP地址,并将获得的值与系统的网络参数中指定的值进行比较,从而确定访问网络(专用地址或NAT )的方式:



5.内部和外部IP地址的比较

接下来,恶意软件确定库%SystemRoot%\system32\crypt32.dll的版本,如果内部版本号和修订号分别小于760118741 KB3033929根据操作系统版本下载并安装更新KB3033929



6.下载并安装系统更新

TA505攻击者照顾受害者并根据需要修补系统吗? 一点也不。 安装此更新与终止对使用SHA-1签名的代码安全证书的支持有关,并且放弃使用SHA-2算法。 最有可能的是,黑客已经很难在未更新的系统上运行签名的有效负载。 有趣的是,安装更新后,该木马会将生成的操作日志发送到管理服务器,停止其工作并清除自身,清除留下的痕迹。



7.安装系统更新后关闭

如果不需要更新安装,则引导加载程序会收集以下信息并将其发送到管理服务器:

  • 系统信息
  • 有关已安装软件的信息,
  • %ProgramFiles%和%ProgramFiles(x86)%目录(如果有)中有关已签名软件的信息,
  • %SystemRoot%\ drivers目录中有关已签名驱动程序的信息。

请注意,使用合法代码来获取有关签名的信息。



8.获取证书信息

之后,引导程序将创建C:\Windows\Logs\diag目录,并启动一个流,在其中跟踪目录中的更改,并将通知发送到管理服务器:



9.监视目录更改

然后,它准备有关系统的现有和缺少的信息(用户名,系统版本,域,IP地址,有关视频卡的信息,网络连接-NAT或非NAT),并生成以下类型的JSON文件:

 { "adm": "0", "bid": "M3xwwhqLH/AUOhmU2+W55A==", "bit": "1", "bnet": "ldr", "cam": "0", "cis": "0", "dmn": "WORKGROUP", "hash_r": "0", "lip": "192.168.100.153", "lvl": "0", "nat": "1", "osb": "0", "osv": "Windows 7 Professional", "pc": "USER-PC", "proc_c": "0", "proc_n": "cpu", "rep": 0, "tmt": "0", "ver": "163", "video": "Standard VGA Graphics Adapter," } 

稍后,这些数据将使用RC4加密( gJypA9RWUlYpnBbzujVqE6fDcEAk0zoz加密密钥在Trojan主体中进行了加密),并使用Base64编码,并通过HTTP POST请求发送到管理服务器:



10.对管理服务器的HTTP POST请求



11.引导程序中的控制服务器列表

来自服务器的响应由RC4解密(加密密钥与用于发送数据的密钥相同)并进行检查:前两个字节必须与MZ行相对应,这是PE文件的标志。 我们在分析另一台提供FlawedAmmyy RAT的装载机时,已经较早地遇到了这个序列:



12.类似的代码,用于解密和检查所涉及的引导程序(左)和FlawedAmmyy RAT引导程序(右)的下载文件

有效负载加载不仅发生在主线程中,而且还发生在单独创建的线程中。 换句话说,有两个有效载荷。 在一种情况下,将预先检查Global \ system32_host_service互斥量,如果不存在,则将加载组件,该组件在调试信息中称为有效负载或自动程序。 有趣的是,在收到服务器的响应之后,PE文件不会以任何方式启动。 而是将其身体写入注册表项0x228028HKEY_LOCAL_MACHINE\SYSTEM部分中。 然后,引导加载程序使用Wow64DisableWow64FsRedirection为32位应用程序禁用WoW64文件系统的重定向,并使用Wow64DisableWow64FsRedirection启动%SystemRoot%\System32\services.exe进程。 使用此参数没有任何意义,但这可以完成生成的有效负载的安装链。



13.设置有效载荷

稍后我们将讨论第二个有效负载。

Twein插件


检查上面讨论的木马程序,我们注意到一个从%SystemRoot%目录中删除两个文件的函数twein_32.dlltwein_64.dll



14.删除twein_32.dll和twein_64.dll文件

这些文件在其他任何地方都找不到,它们也不会出现在引导加载程序的逻辑中。 但是,这些库的名称使我们想起了另一组恶意软件,现在我们将对其进行考虑。
两个月前,我们发现了TA505组的木马,大小约为9 MB。 该文件由UPX打包。 该木马作为WMDICToss服务安装到系统中。 资源包含三个文件: systemdiron.battwein__32.dlltwein__64.dll ,这些文件已使用线性XOR加密。



15.解密dropper的资源之一

请注意,这两个文件的名称几乎与前面已经提到的名称一致:区别仅在于下划线的数量。

解密后的名称为systemdiron.bat资源systemdiron.bat应该是一个命令脚本,该脚本可根据系统的容量启动其他组件:

 @echo off if defined PROCESSOR_ARCHITEW6432 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==IA64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==AMD64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==x86 (goto LABEL_X86) goto LABEL_NON :LABEL_X64 echo OS type: x64 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__64.dll,Install copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_X86 echo OS type: x86 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_NON echo OS type: undefined goto LABEL_END :LABEL_END pause 

两个twein库的行为类似。 装有TA505组的特征性封隔器。 原始库名称: av_block.dll 。 使用混淆器会使分析变得非常复杂,混淆代码的比例约为80%。 结果,程序执行充满了众多的过渡,下一个代码步骤的解码,非线性函数调用。

库中包含大量令人印象深刻的类似Base64的字符串,这些字符串按以下方式解密:

1.输入字符串分为4个字节的块;
2.使用替换和移位算法对每个块进行解码:

 import binascii def block_decode(input_str, len_of_block): alphabet = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x00\x00\x3F\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x00\x00\x00\x00\x00\x00\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' int_result = 0 for i in range(len_of_block): alph = ord(alphabet[ord(input_str[i])]) alph <<= 0x6 * i int_result += alph str_result = hex(int_result)[2:] if len(str_result) % 2 != 0: str_result = '0' + str_result return binascii.unhexlify(str_result).decode('latin1')[::-1] 


3)块被收集在一行中;
4)结果由eexec算法使用双字节密钥解密,并作为参数传递:



16. eexec算法的实现

大多数行是防病毒产品文件的名称和路径,但是其中一些根本不属于安全工具:MS Exchange Server,MySQL Server,SAP,Apache,PostgreSQL,Elasticsearch等。甚至还有这样的独特路径:

  • C:\ Users \ tislam \ Desktop \ salik app \ Aye_salik_data \ Aye_salik_data \ bin \ Debug \ Aye_salik_data.exe
  • C:\ oem13c \ agent13c \ agent_13.2.0.0.0 \ perl \ bin \ perl.exe
  • C:\ Users \ adadmin \ Ubiquiti UniFi \ bin \ mongod.exe
  • C:\ Users \ sakella \ AppData \ Local \ Microsoft \ OneDrive \ OneDrive.exe
  • D:\附加组件\ IMI_CREDIT_POLICY测试v 02.01 \ IMI_CREDIT_POLICY.exe

如果从列表中找到系统中的软件,则文件和目录将被删除。

为了确保自己在系统中的安全,这些库将自己设置为Windows套接字服务提供程序(SPI)接口,称为Intel和IntelFiltr。 此外,它们将协议链中处理程序的顺序更改为第一个处理客户端请求的SPI。

2015年,我们的FireEye同事介绍了LatentBot机器人分析程序 。 奇怪的是,LatentBot中的字符串加密算法和所审查的twein库完全相同。 另外,LatentBot使用安全模块作为插件之一,尽管它仅限于检查可用性,但它使用指定的路径和产品名称在系统中搜索安全工具。

Rootkit粗花呢


回到引导加载程序,即第二个有效负载。 从尝试打开rootkit ...的调试行中,并安装了Driver%S,很容易猜测下一个有效负载的格式。 成功加载后,驱动程序将使用与其他合法文件的名称以伪随机方式形成的名称一起写入%SystemRoot%\System32\drivers目录。 然后将创建并启动该服务:



17.安装和启动服务

在其工作的最后阶段,引导加载程序将配置驱动程序以在注册表项中列入黑名单:数字文件签名中的防病毒进程,分析工具和保护供应商的名称将输入到HKEY_LOCAL_MACHINE\SYSTEM分支的键的指定数字值中:



18.黑名单驱动程序配置

在研究引导加载程序的过程中,我们无法从管理服务器获取驱动程序样本。 但是,我们发现提到了另一个类似的引导加载程序抽出的rootkit

该驱动程序以Lizas Limited的名义进行数字签名,并通过Lizas Limited



19.数​​字签名的驱动程序

在研究过程中,我们发现与Necurs僵尸网络的著名rootkit有很多共同之处 ,TA505小组正积极使用它来发送垃圾邮件和传播恶意软件。 让我们更详细地考虑他的作品最有趣的特征。

驱动程序注册事件处理程序,以使用PsSetCreateProcessNotifyRoutinePsSetLoadImageNotifyRoutine启动进程并加载PE图像。 换句话说,这使驱动程序可以控制所有新进程和服务的启动。 使用我们前面提到的黑名单,rootkit使用ZwTerminateProcess终止不需要的进程,并防止其他可能对其加载有危险的驱动程序,覆盖指令上的入口点值:

 mov eax, 0C0000001 retn 8 

结果,该服务将因STATUS_UNSUCCESSFULL错误而被卸载。



20.流程完成



21.覆盖驱动程序入口点

通过CmRegisterCallback,驱动程序可以拦截系统注册表访问事件。 特别是,他的进一步工作是通过在拦截的事件中访问的键的数值来参数化的。



22.注册表项访问的Rootkit管理

有趣的是,在某些版本的Necurs Rootkit中,相同的数值用作ioctl请求代码。



23.使用ioctl查询管理Necurs Rootkit

此技巧可被视为迈向更高机密的一步:与对DeviceObject的ioctl请求相比,对注册表的访问引起的怀疑更少。

rootkit的主体包含一个用单字节XOR加密的辅助DLL库。 创建新进程时,驱动程序将库与另一个PE文件一起注入,该文件从注册表中提取出来,并再次用单字节XOR解密。



24.解密并将辅助库注入到创建的进程中

辅助组件是一个定制的反射式加载器 ,它可以将第二个PE文件正确地放置在内存中,作为有效负载,并将控制权转移给该文件。 现在,可以很清楚地看到,从本文的第一部分开始,由引导加载程序写入注册表的有效负载是如何开始工作的。



25.用辅助库填充导入表

结论


在本文中,我们熟悉了许多双木马的工作特点。 为什么是双胞胎? 我们开始研究的恶意引导加载程序在代码编写和实现细节的质量方面与著名的FlawedAmmyy后门引导加载程序非常相似。 他尝试从系统中删除的Twein库很可能是我们接下来要查找的库。 库与LatentBot安全插件非常相似。 引导加载程序的有效载荷之一是驱动程序,它是流行的Necurs Rootkit的派生产品。

一些恶意软件家族已有5年以上的历史,但是,攻击者会考虑到操作系统和安全工具的开发,继续对其进行更新和改进。

作者 :积极技术公司的Alexey Vishnyakov和Daniil Koloskov

国际奥委会
a28a54abc30805cc6ea2ce0732989287-Twein引导程序
f6b6526b8d494dce14568e3703368432-twein插件删除器
983dd279722154a12093410067fe070e-Rootkit Twein

该系列中的先前文章:


Source: https://habr.com/ru/post/zh-CN475328/


All Articles