木马。涓涓细刻已经存在于威胁景观中。我们写了关于它的第一个版本2016年10月.从一开始,它就是一个组织良好的模块化恶意软件,由具有成熟技能的开发人员编写。它通常被称为银行家,但它的模块化结构允许在不修改核心机器人的情况下自由添加新功能。事实上,一个银行家的功能仅仅体现在其中之一它的许多模块

随着时间的推移,开发人员延长了涓涓细刻功能通过实现新的模块-例如,一个窃取展望凭证.但是核心机器人的演变,用于部署这些模块,相当慢。从第一个版本编写的脚本到最近几个月的解码模块,显示用于保护它们的加密模式保持不变。

2018年10月是TrickBot出现的第二年。也许作者们决定用改造核心的一些重要元素

这篇文章将分析更新后的迷惑使用的tricbot的主要模块。

行为分析

最新的trickbot启动其操作禁用Windows Defender的实时监控。它是通过部署powershell命令完成的:

之后,我们可以观察到tricbot的典型行为。

与前面一样,主机器人部署svchost的多个实例,并在其中注入模块。

通过添加计划任务来实现持久性:

它在%appdata%中安装在一个文件夹中,其中名称取决于机器人版本。

加密的模块存储在Data文件夹(旧名:modules),以及它们的配置:

事实证明,最近模块的加密发生了变化(我们必须更新解码的脚本).

主安装文件夹中的新元素是在各种名称下的设置文件,似乎从某些硬编码池中随机选择。它是最常见的名称是Settings.ini(硬编码),但还有其他变体如:profiles.ini,securitypreloadstate.txt,pkcs11.txt。文件的格式对于TrickBot来说看起来很新:

我们可以看到许多字符串,首先看起来乱窜/加密。但事实证明,它们是添加困扰的垃圾条目。实际配置在它们之间存储在它们之间,其中在看起来像Base64编码的字符串中。它的含义将在这篇文章的另一部分中解释。

内部

为了更好地了解变化,我们需要在代码中深入潜水。一如既往地,最初的样品来的时候是打包的——这一次有两层保护要去掉,然后我们才能主要的机器人

主机器人提供2个资源:RES和拨号,这与以前使用的资源进行了类似的。

res - 是XML格式的加密配置文件。它以与以前相同的方式加密(使用AES,通过散列轮派生的键),我们可以使用旧脚本进行解码:trickbot_config_decoder.py.(介意资源中第一个DWORD的事实是大小,而不是加密数据的一部分 - 所以需要在使用脚本之前删除)。

DIAL -是椭圆曲线公钥(ECC曲线p-384),用于对上述加密配置进行解密后验证签名。

困惑

在第一版中,Trickbot根本没有被滥用 - 我们甚至可以清楚地找到所有的字符串。在两年的进化中,它已经缓慢变化。几个月前,作者决定使用自定义算法(基于Base64)混淆所有字符串。所有混淆字符串都是从单个硬编码列表中的聚合:

当需要任何一个时,它由其索引选择并传递给解码功能:

方法获取的字符串指数162

消除混淆的过程,还有使用工具,被描述了在这里.由于解码函数的API从那时起就没有改变过,所以直到今天仍然可以使用相同的方法。可以找到从当前分析的样本中提取的去混淆字符串列表在这里

此外,我们可以找到其他更流行的字符串混淆方法。例如,一些被分成块的字符串,每个字符串,每一个DWORD:

GandCrab使用了同样的方法,可以用它来消除混淆以下脚本T。

同样,Unicode字符串划分为:

TrickBot使用的大多数导入都是动态加载的。使静态分析更加困难,因为我们无法直接看到完整的图片:在使用之前检索指针。

我们可以以各种方式解决这个问题,即通过添加标签一个自动化的示踪剂.为分析的示例之一创建的CSV/tags文件是可用的在这里的帮助下,可以将它加载到IDA数据库IFL插件).

下面给出的图片显示了在加载标签后的TrickBot代码的片段。正如我们所看到的,导入函数的地址从内部结构而不是从标准导入表中检索,然后通过寄存器调用它们。

除了前面提到的模糊化方法,在它的发展过程中,tricbot还在朝着字符串随机化的方向发展。许多在最初版本中硬编码的字符串现在都是随机的或根据受害机器生成的。例如互斥对象的名称:

使用加密

在过去,模块是CBC模式下的AES加密.用于加密的密钥是由哈希缓冲区的初始字节.一旦了解算法,我们就可以轻松地将存储的模块与其配置解密。

在最近的更新中,作者决定把它复杂化一点。然而,他们并没有改变主算法,只是引入了一个额外的算法XOR层.在将数据传递给AES之前,它首先是一个64个字符长的xord,动态生成的字符串,我们将其称为bot密钥:

上面提到的bot密钥是针对每台受害机器生成的。首先,使用GetAdapterInfo函数:

检索到的结构(194字节)被SHA256哈希,然后哈希转换为字符串:

可以找到生成Bot密钥的重构算法(以及生成密钥的实用程序)在这里

然后将该键存储在删除的设置文件中。

编码设置

如前所述,新版的tricbot删除了一个新的设置文件,其中包含一些编码信息。设置中存储的信息示例:

0441772f66559a1c71f4559dc4405438fc9b8383ce1229139257a7fe6d7b8de9 1085117245 5 6 13

要素:

1.BotKey(每台机器生成)

2.测试字符串的校验和:(0-256字节用相同的字符集编码)——用于字符集验证

3.三个随机数

整行代码使用自定义字符集进行base64编码,该字符集是基于硬编码的字符集生成的:“HJIA/CB+FGKLNOP3RSlUVWXYZfbcdeaghi5kmn0pqrstuvwx89o12467MEDyzQjT”。

然而,即使在这一点上,我们也可以看到作者努力避免使用可重复的模式。字符集的最后8个字符将被随机交换。生成算法的伪代码:

n个字符的随机化:

转型示例:

INP:“HJIA / CB + FGKLNOP3RSLUVWXYZFBCDEAGHI5KMN0PQRSTUVWX89O12467mE.达兹问:jT

:“HJIA / CB + FGKLNOP3RSlUVWXYZfbcdeaghi5kmn0pqrstuvwx89o12467jDE.zty.问:m

解码器可以在此处找到:trick_settings_decoder.py

缓慢改善模糊

《TrickBot》的作者从不关心混淆问题。随着时间的推移,他们慢慢开始引入它的元素,但是,除了一些曲折,它仍然没有什么真正复杂的。我们可以期待这一趋势不会迅速改变,在为新添加的内容更新脚本之后,对分析人员来说,解码Trick Bot元素将和以前一样容易。

似乎作者似乎基于分配的数量相信成功,而不是在系统中隐藏的尝试。他们还专注于持续添加新模块,以使功能多样化(即,最近,他们为攻击添加了一个新模块销售点系统).

脚本

更新的脚本解码的TrickBot模块为恶意软件分析师:
https://github.com/hasherezade/malware_analysis/tree/master/trickbot

妥协的指标

样本散列:

9B6FF6F6F45A18BF3D05BBA18945A83DA2ADFBE6E340A68D3F629C4B88B243A8