最近,我们的分析师杰罗姆·塞古拉在野外捕获了一个有趣的负载。结果是一个新的机器人,在分析时还没有被描述。根据代码中找到的字符串,作者给它命名三角架(或“TrickLoader”)。

许多链接表明,这个机器人是之前幕后威胁行为者的另一个产品Dyreza,一个偷证件的人.虽然TrickBot似乎是从头开始编写的,但它包含许多与我们分析Dyreza时遇到的特性和解决方案相似的特性和解决方案。

分析样品

TrickBot模块:

额外的负载:

分布

有效载荷通过malvertising战役传播,从而降低了Rig EK:

错链

行为分析

部署后,TrickBot将自身复制到%APPDATA%并删除原始样本。但是,它不会更改可执行文件的初始名称。(在给定示例中,分析的样本名为“trick.exe”。)

安装

首先,我们可以看到它删除了两个额外的文件:客户识别码组标签.它们是在本地生成的,用于恰当地识别单个机器人及其所属的活动。两个文件的内容都没有加密;它包含Unicode文本。

一个例子客户识别码由被攻击机器的名称、操作系统版本和一个随机生成的字符串组成:

客户识别码

例子组标签:

gtag

然后,在同样的位置,我们可以看到config.conf正在显示。此文件是从C&C并以加密的形式存储。

配置_片段

一段时间后,我们可以看到另一个文件夹正在创建%APPDATA%命名模块.恶意软件还会从C&C下载额外的模块,这些模块也是加密存储的。在一个特定的会话中,TrickBot下载的模块叫做注射用DLl32系统信息32:

模块文件夹

此特定模块还可能有一个相应的文件夹,用于存储其配置。命名约定的模式是模块名称_configs

模块配置

当我们通过监控工具(例如ProcessExplorer)观察恶意软件的执行时,我们会发现它部署了两个svchost:

svchost_部署

bot通过在Windows task Scheduler中将自己添加为任务来实现持久性。它没有努力将任务隐藏在一个合法的名称下,而只是称它为“Bot”。

bot_task

如果进程被终止,则会由任务调度引擎:

重新启动

网络通信

TrickBot连接到几个服务器:

交通量1

首先,它连接到合法服务器myexternalip.com以获取从外部可见的IP。

有趣的是,它并没有试图伪装成一个合法的浏览器。相反,它使用自己的用户代理:“BotLoader”或“TrickLoader”

大多数(但不是全部)与主C&C的通信是SSL加密的。下面,你可以看到一个发送到C&C的命令示例:

net_cmd60

查看POST请求的URL,我们注意到group_id和client_id与文件中相同。之后是命令id。这是Dyreza的典型模式。

bot还下载一个额外的有效负载(在特定会话中:47 d9e7c464927052ca0d22af7ad61f5d)在不加密流量的情况下:

download_exe

C&C设置在被黑客攻击的无线路由器上,如MikroTik。这种建立基础设施的方式以前也被Dyreza使用。

路由器1

在这个使用HTTPs证书的示例中,我们可以看到使用的数据是完全随机的,甚至没有试图模仿合法的名称:

证书

在恶意软件

TrickBot由几层组成。通常,第一层用于保护:它携带加密的有效载荷,并试图对AV软件隐藏。

模式

加载程序

第二层是一个主bot加载器,用于选择是部署32位还是64位有效负载。新PE文件以加密形式存储在资源中。但是,作者没有试图隐藏特定元素的功能,通过查看资源的名称,我们可以很容易地猜出它们的用途:

res_names

所选模块在执行期间解密。

一开始,应用程序获取有关受害者操作系统的信息,以便选择适当的方式遵循:

loader_path

根据环境,从资源中选择合适的有效负载,通过简单算法解密,并验证:

解密

解密过程与在迪雷扎发现的那个,但是,组织内容(资源中的三个加密模块)的总体思路是类似的。

def decode(数据):decoded=bytearray()key=0x3039 i=0表示范围内的i(0,len(数据)):dec_val=data[i]^(key%0x100)key*=0x0AE529 key+=0x24D69 decoded。append(dec_val)返回decoded

请参阅完整的解码脚本:https://github.com/hasherezade/malware_analysis/blob/master/trickbot/trick_decoder.py

回到我们的恶意软件分析,接下来,解包的机器人通过一个专用功能映射到内存并部署。

32位bot将新模块映射到自己的内存中(自注入):

map_in_itself

然后在那里重定向执行:

call_loaded

新模块的入口点(TrickBot核心):

小把戏

在选择64位有效负载的情况下,首先解包并运行额外的可执行文件——64位PE加载程序,然后加载核心恶意bot。

与主要模块为DLL的Dyreza不同,TrickBot使用EXE。

的TrickBot内部

bot是用c++编写的。它提供了两个具有描述性名称的资源:CONFIG,用于存储加密配置,KEY,用于存储椭圆曲线密钥:

bot_resources

一般来说,该恶意软件是冗长的:在每个阶段都可以找到有意义的名称。

名称“TrickBot”也出现在由应用程序创建的全局互斥体(“global\\TrickBot”)的名称中,以确保它只运行一次:

检查\u互斥\u trickbot

在第一次执行时,TrickBot将自己复制到一个新位置(在%APPDATA%中)并部署新副本,并将其作为需要删除的原始副本的参数路径:

部署被丢弃的

将运行bot的任务添加到任务计划程序中:

将_添加到_taskschd

设置触发事件:

设置U触发器

我们可以找到2016年初的日期,这可能证实bot是新的,是今年编写的。

三脚架指令

TrickBot与其C&C通信,并以类似于Dyreza使用的格式发送多个命令。下面是TrickBot命令使用的格式字符串列表:

命令

将其与Dyreza的命令格式进行比较:

dyre_commands

TrickBot的命令ID是以字符串格式硬编码的。但是,它们都是从获取命令ID作为参数的同一函数内部部署的:

command_14

在填充适当的格式字符串并将其发送给C&C之后,机器人检查HTTP响应代码。如果返回的代码不等于200 (好吧), 403 (被禁止的)或404 (未找到),然后它再试一次。

check_resp

以下是已实现的命令ID的完整列表:

0 1 5 10 14 23 25 63

每个命令都有相同的前缀–即活动的组id和bot的单个id(存储在已删除文件中的相同数据)。格式:

/[组id]/[客户端id]/[命令id]/。。。

示例url:

https://193.9.28.24/tmt2/TESTMACHINE_W617601.653EB63213B91453D28A68C80FCA3AC4/5/sinj/

关于协议的更多说明在这里

加密

TrickBot交替使用两种加密算法:AES和ECC。

decrypt_chain

下载的模块和配置采用CBC方式的AES加密。AES密钥和初始化向量是通过自定义的预定义算法从数据派生出来的。首先,使用SHA256对32字节的输入数据进行哈希。然后,将哈希函数的输出附加到数据缓冲区并再次哈希。重复这一步骤,直到缓冲区中数据的全部大小变为4096。哈希操作重复128次。下面你可以看到负责的代码片段:

hashing_rounds

第一个32字节长的数据块用作派生AES密钥的初始值:

散列第一块

从16到48的字节用作初始值,以导出AES初始化向量:

iv_chunk1

与CONFIG的内容进行比较(请注意,第一个DWORD是一个大小,不包含在数据中):

iv_chunk_dump

您可以在此处找到完整的解码脚本:https://github.com/hasherezade/malware_analysis/blob/master/trickbot/trick_config_decoder.py

使用AES解密硬编码配置:

decrypr_stored_config

如果特定输入无法通过AES解密,则尝试通过ECC解密:

ecc_解密

技巧机器人的配置

与Dyreza类似,TrickBot使用加密存储的配置文件。

Trick Bot的可执行文件带有一个硬编码配置,在执行过程中,该配置被其新版本所取代,从C&C下载并保存在文件中config.conf.下面你可以看到硬编码的解密内容:

<mcconf>
<版本> 1000002 < /版本>
<gtag> tmt2 < /gtag>
<服务公司>
<深水救生艇>91.219.28.77:443深水救生艇>
<深水救生艇> 193.9.28.24:443 < /深水救生艇>
<深水救生艇>37.1.209.51:443深水救生艇>
<深水救生艇> 138.201.44.28:443 < /深水救生艇>
<深水救生艇>188.116.23.98:443深水救生艇>
<深水救生艇>104.250.138.194:443深水救生艇>
<深水救生艇> 46.22.211.34:443 < /深水救生艇>
<深水救生艇> 68.179.234.69:443 < /深水救生艇>
<深水救生艇> 5.12.28.0:443 < /深水救生艇>
<深水救生艇> 36.37.176.6:443 < /深水救生艇>
<深水救生艇> 37.109.52.75:443 < /深水救生艇>
<深水救生艇>27.208.131.97:443深水救生艇>
服务公司>
<自动运行>
<模块名="系统信息"细胞毒性t淋巴细胞="GetSystemInfo"/>
<模块名="injectDll"/>
自动运行>
mcconf>

原始视图
mcconf.xml
主持❤ 通过github

将其与下载的版本进行比较–版本号增加,一些C&C已更改:

<mcconf>
<版本> 1000003 < /版本>
<gtag>tt0002gtag>
<服务公司>
<深水救生艇>91.219.28.77:443深水救生艇>
<深水救生艇> 193.9.28.24:443 < /深水救生艇>
<深水救生艇>37.1.209.51:443深水救生艇>
<深水救生艇> 138.201.44.28:443 < /深水救生艇>
<深水救生艇>188.116.23.98:443深水救生艇>
<深水救生艇>104.250.138.194:443深水救生艇>
<深水救生艇> 46.22.211.34:443 < /深水救生艇>
<深水救生艇> 68.179.234.69:443 < /深水救生艇>
<深水救生艇> 5.12.28.0:443 < /深水救生艇>
<深水救生艇> 36.37.176.6:443 < /深水救生艇>
<深水救生艇> 37.109.52.75:443 < /深水救生艇>
<深水救生艇> 84.232.251.0:443 < /深水救生艇>
服务公司>
<自动运行>
<模块名称="系统信息"细胞毒性t淋巴细胞="GetSystemInfo"/>
<模块名称="injectDll"/>
自动运行>
mcconf>

原始视图
mcconf2.xml
主持❤ 通过github

注意,列出的模块的名称(系统信息,injectDll)对应于我们在文件夹中找到的那些模块在行为分析期间。这是由于这样一个事实,即此配置向bot发出指令,并命令它下载特定元素。

有些请求会导致下载额外的配置。被机器人解密后的响应示例:

<servconf>
<expir>1480550400expir>
<插件>
<psrv>80.79.114.179:443psrv>
插件>
servconf>

原始视图
servconf.xml
主持❤ 通过github

模块

tricbot是一个持久的僵尸网络代理,但它的主要功能在于模块,即从C&C动态获取的dll。在分析会话期间,机器人下载了两个模块。

  • getsysinfo–用于一般系统信息收集
  • injectDll–银行家模块,在目标浏览器中注入DLL以窃取凭据

被攻击的浏览器列表被硬编码在injectDll32.dll中:

已尝试的浏览器

对于Dyreza,此攻击直接从主机器人执行,而不是从添加的DLL执行。

被攻击目标的详细信息在一个附加的配置文件中,存储在文件夹中:模块\ injectDll32_config.下面我们可以看到它的解密形式揭示了被攻击的网上银行系统:

<>
<dinj>
<lm> * * < / / onlineserv /厘米lm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
群>
<>
<dinj>
<lm>*ibanking.stgeorge.com.au/ibank/loginPage.action*lm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
群>
<>
<dinj>
<lm> * * < / ib.nab.com.au / nabib / index . jsplm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
群>
<>
<dinj>
<lm> * banking.westpac.com.au /白细胞* < / /银行/处理程序lm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
群>
<>
<dinj>
<lm> * anz.com/IBAU/BANKAWAYTRAN * < /lm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
<dinj>
<lm> * anz.com/INETBANK/login.asp * < /lm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
群>
<>
<dinj>
<lm>*cibconline.cibc.com/olbtxn/authentication/*.cibc*lm>
<霍奇金淋巴瘤>91.219.28.103/response.php霍奇金淋巴瘤>
<脉波重复间隔>100脉波重复间隔>
<平方英尺>1平方英尺>
dinj>
群>

原始视图
dinj.xml
主持❤ 通过github

在行为分析期间观察到的svchost.exe实例用于部署特定模块。

下面是模块injectDll(标记辛吉为了纪念svchost:

enc_svchost_inject_sinj

和模块系统信息(标记GetSystemInfo为了纪念……的另一个事例svchost:

inected_in_svchost1

结论

Trick Bot与Dyreza有许多相似之处,在代码设计和通信协议级别都可以看到。但是,对比两者的代码可以看出,它是从头重写的。

到目前为止,Trick Bot没有Dyreza Bot那么多的功能。有可能,作者有意地决定让主可执行程序轻量级化,并专注于使用下载的模块动态地消耗它。另一种选择是,它仍然不是最终版本。

有一件事是肯定的——这是一部有趣的作品,由专业人士撰写。很有可能,它会变得像它的前任一样受欢迎。

附录

http://www.threatgeek.com/2016/10/trickbot-the-dyre-connection.html-在威胁极客博客的TrickBot分析


这是一篇由Hasherezade撰写的客座文章,Hasherezade是一位对InfoSec非常感兴趣的独立研究员和程序员。她喜欢详细介绍恶意软件,并与社区分享威胁信息。看看她的推特@哈舍雷扎德以及她的个人博客:https://hshrzd.wordpress.com