通过威廉青Vasilios Hioureas,JérômeSegura.

在过去的几个月里,我们注意到新盗贼的活动和发展增加。与等待受害者登录其银行网站的许多银行特洛伊木马不同,盗窃人员通常以抓取和去模式运行。这意味着在感染时,恶意软件将收集它需要的所有数据并立即剥离它。因为这种盗贼经常是非居民(意味着他们没有持久机制),除非他们在攻击时被发现,受害者将是他们被妥协的人。

这类恶意软件在罪犯中很流行,比专业的银行家覆盖的范围更广。除了捕捉浏览器历史记录、存储的密码和cookie外,窃取者还会寻找可能包含有价值数据的文件。

在这篇博文中,我们将回顾《Baldr stealer》,它首次出现在2019年1月的地下论坛,后来才出现在野外看到的微软(Microsoft)于今年2月发布了这款手机。

Baldr上市了

《Baldr》可能是由三个威胁角色共同完成的:负责发行的Agressor,负责销售和推广的Overdot,以及负责开发的LordOdin。Baldr首次出现在1月,很快在大多数流行的clearnet俄罗斯黑客论坛上产生了许多积极的评论。

Overdot此前与Arkei“偷钱者”(见下图)有关联,它在多个留言板上发布大部分广告,通过Jabber提供客户服务,并在多个留言板使用的声誉系统中处理买家投诉。

有趣的是,在一个论坛上,Overdot提到了之前与Arkei的合作,在那里他声称Baldr和Arkei的开发者偶尔会联系和合作。

不像大多数发布在clearnet公告板上的产品,Baldr以可靠性著称,而且它还提供了相对良好的与背后团队的沟通。

LordOdin,也被称为BaldrOdin,与Baldr一起的知名度要低得多,但会监控并喜欢围绕它的帖子。

他的主要帖子是为了将Baldr与竞争对手Azorult等产品区分开来,并保证Baldr不仅仅是Arkei的翻版:

侵略者/Agri_MAN是Baldr发行版中的最后一个玩家:

Agri_man拥有俄罗斯黑客论坛上的销售流量的历史,约为2011年。与王子指南和过多的人相比,他有更具格子的声誉,在黑名单上出现了退款,以及呼吁使用Sock Puppet帐户生成好评。

使用备用帐户agresor,他目前维护一个自动车间来生成Baldr构建维修车间。毫升.有趣的是,Overdot提到了一个没有连接到他们的自动化安装机器人,并引起了客户的投诉:

这可能表明侵略者是一个附属机构,并没有直接与Baldr的发展有关。截止发稿时,Overdot和LordOdin似乎是管理Baldr的主要威胁演员。

分配

在我们对Baldr的分析中,我们收集了几个不同的版本,表明该恶意软件的开发周期很短。本文分析的最新版本是3月20日发布的2.2版:

我们通过不同的分销链捕获了Baldr。其中一个主要的载体是木马应用程序伪装成破解工具或黑客工具。例如,我们在YouTube上看到一个视频,提供一个生成免费比特币的程序,但实际上是Baldr小偷伪装的。

我们还通过包含《辐射》开发工具包的飞车战役抓住了Baldr:

技术分析(Baldr 2.2)

Baldr的高级功能相对简单,在这个分析版本中提供了一小组恶意功能。至于它试图在用户电脑上做什么,目前还没有什么突破性的进展,然而,这种威胁的不同之处在于它对逻辑的极其复杂的执行。

通常,当恶意软件被抛出以获得快速降压与迅速制作的长期活动时,这是很明显的。Baldr牢牢地坐在后者类别中 - 这不是脚本的工作。无论我们谈论其包装器的使用,有效载荷代码结构,甚至其后端C2和分发,它都清楚了Baldr的作者花了很多时间发展这种特殊的威胁。

功能概述

Baldr的主要功能可以分为五个步骤,以按时间顺序完成。

步骤1:用户分析

BALDR通过收集用户分析数据列表开始。枚举从用户帐户名称到磁盘空间和操作系统类型的所有内容都会用于exfiltration。

步骤2:敏感数据外泄

接下来,Baldr开始循环遍历受害者电脑关键位置的所有文件和文件夹。具体来说,它会在用户中显示出来AppData临时敏感数据相关信息的文件夹。下面是它搜索的关键位置和应用程序数据列表:

AppData\本地\谷歌\Chrome\用户数据\默认AppData\本地\谷歌\Chrome\用户数据\默认登录数据AppData\本地\谷歌\Chrome\用户数据\默认cookie AppData\本地\谷歌\Chrome\用户数据\默认Web数据AppData\本地\谷歌\Chrome\用户数据\默认历史AppData\漫游\Exodus\ Exoduswallet AppData\Roaming\Ethereum\keystore AppData\Local\ProtonVPN Wallets\Jaxx Liberty\ NordVPN\ Telegram Jabber TotalCommander Ghisler

这些数据文件中的许多范围从简单的SQLite数据库到其他类型的自定义格式。作者对这些目标格式有详细知识,因为只有来自这些文件的关键数据被提取并加载到一系列数组中。在解析和准备所有目标数据后,恶意软件将继续到其下一个功能集。

步骤3:猎枪文件抓取

DOC、DOCX、LOG、TXT文件是此阶段的目标文件。Baldr从Documents和Desktop目录开始,递归地迭代所有子目录。当它遇到具有上述任何扩展名的文件时,它会简单地获取整个文件的内容。

第4步:ScreenCap

在最后的数据收集步骤中,Baldr让控制器选择抓取用户电脑的截图。

第五步:网络外渗

在所有这些数据被加载到有组织和分类的数组/列表中之后,Baldr将数组扁平化,并准备通过网络发送它们。

一个有趣的注意是,没有试图使数据传输更不引人注意。在我们的分析机器中,我们故意提供了大量的文件供Baldr获取,我们想知道恶意软件会不会慢慢地窃取这么多数据,还是会直接把数据传回C2。

结果是一个大而明显的网络转移。恶意软件并没有在受害者的机器上驻留的内置功能。它已经获取了它想要的数据,并不在乎再次感染同一台机器。此外,代码中没有传播机制,因此在企业环境中,需要手动针对每个员工进行独特的尝试。

封隔器代码级分析

我们将从有效载荷混淆和包装器使用开始。这个版本的Baldr开始作为一个内置到exe的AutoIt脚本。使用免费的AIT反编译器,我们进入了封隔器的第一级。

如您所见,这段代码非常模糊。前两个函数是这种混淆的主要工具。这里所做的只是根据作为第二个参数传入的索引对提供的字符串重新排序。然而,这并不会带来太多问题,因为我们可以很容易地提取通过简单地修改此脚本生成的字符串ConsoleWrite在返回之前输出去混淆的字符串:

提取的结果字符串如下:

执行BinaryToString @TempDir @SystemDir @SW_HIDE @StartupDir @ScriptDir @OSVersion @HomeDrive @CR @ComSpec @AutoItPID @AutoItExe @AppDataDir WinExists UBound StringReplace StringLen StringInStr Sleep ShellExecute RegWrite Random processexsts ProcessClose IsAdmin FileWrite FileSetAttrib FileRead FileOpen FileExists fileddelete FileCloseDriveGetDrive DllStructSetData DllStructGet DllStructGetData DllStructCreate DllCallAddress DllCall DirCreate BinaryLen TrayIconHide:Zone。标识符kernel32.dll句柄CreateMutexW struct* FindResourceW kernel32.dll dword SizeofResource kernel32.dll LoadResource kernel32.dll LockResource byte[VirtualAlloc byte shellcode]

除了这些明显的函数调用外,我们还有一些二进制blob,可以消除混淆。我们只包含了这些字符串的有限集,以避免使用长数据集重载此分析。

我们可以看到它正在从主可执行文件中提取并解密一个资源DLL,这个DLL将被加载到内存中。在分析了没有使用AIT作为第一阶段的《Baldr》之前的版本后,这是有意义的。先前版本的Baldr需要一个名为Dulciana。所以,之前的版本没有使用AIT,而是使用了这个包含我们在这里看到的同一个DLL的加密字节的文件:

前进到第二阶段,所有内容在所有版本的Baldr包装器中都基本上保持平等。我们将DLL加载到内存中,它会在暂停状态下创建主BALDR的子进程,并继续进行空心此过程,最终将其替换为主.NET有效载荷。这使得用ollydbg手动打开包装很好,因为在我们突破儿童baldr.exe加载之后,我们可以通过父母的剩余代码进行缩短,这将写入进程内存并最终调用ResumeThread ()

如您所见,一旦加载了子进程,它所设置的调用的函数将包含VirtualAlloc WriteProcessMemory,ResumeThread,这让我们知道该注意什么。如果我们在调用resume线程之前转储这个写入的内存,那么我们就可以很容易地提取主负载。

我们的同事@hasherezade已经制作了这一步一步的视频解压Baldr:

有效载荷代码分析

现在我们已经解包了有效负载,我们可以看到实际的恶意功能。然而,我们的麻烦就是从这里开始的。在大多数情况下,只要分析简单,用任何解释语言编写的恶意软件对反向工程师来说都是一种解脱。另一方面,尽管Baldr是用c#编写的,但对其源代码的调试和分析却是一项艰巨的任务。

此恶意软件的代码库不是直截了当的。所有功能都是大量抽象的,包装在包装函数中,并利用了一吨实用类。通过此代码库约为80个单独的类和模块,不容易查看关键功能的位置。在代码基础上传递多个静态传递是必须开始理解这一切的必要条件。添加了函数名称已被播放,并且在整个代码中插入垃圾指令,下一步将开始使用DNSPy调试EXE。

现在我们进入下一个问题:线程。恶意软件执行的每一分钟动作都是通过一个单独的线程执行的。这样做显然是为了使分析师的生活复杂化。准确地说,整个代码库中有超过100个独特的函数在线程内部被调用。这并不包括递归调用的线程,这可能会变成数千个线程。

幸运的是,我们可以查看正在写入的本地数据,最终我们能够找到代码的关键部分:

如前所述,上面的功能收集用户的个人资料。这包括CPU类型、计算机名、用户帐户和操作系统。

在整个过程完成后,它会将存储这些数据的数组扁平化,结果是这样的字符串:

代码的下一部分展示了用于循环目录的众多枚举器类中的一个,用于查找应用程序数据,例如存储的用户帐户,我们特意保存这些数据以用于测试。

检索到的数据按如下格式保存到列表中:

在数据收集的最后阶段,我们有下面的线程,它们在关键目录中循环查找txt和doc文件。它将保存它找到的每个txt或doc的文件名,并将文件的内容存储在不同的数组中。

最后,在我们进入恶意软件的网络段之前,我们有执行屏幕捕获的代码部分:

类2d10104b函数1b0b685()是分支完成大部分功能的主要模块之一,例如遍历目录。一旦收集了所有数据,线程就会聚在一起,剩下的代码行继续单线程运行。然后开始网络调用,所有数据都发送回C2。

压缩数据通过XOR加密,具有通过第一网络请求从C2接触的4字节键和版本号。第二请求将Cypehed数据发送回C2。

控制板

与其他盗版者一样,Baldr也提供了一个面板,允许消费者(购买产品的罪犯)查看高级数据,并检索被盗信息。下面是一个面板登录页面:

在这里,在论坛上的威胁演员发布的屏幕截图中,我们看到了面板的内部:

最终分析

巴尔德是一个可靠的小偷,正在被散布在野外。它的作者和经销商活跃在各种论坛上,针对批评人士推广和捍卫他们的产品。在短短几个月的时间里,Baldr经历了许多版本,这表明其作者正在修复bug并有兴趣开发新功能。

Baldr将不得不与其他偷手竞争,并使自己与众不同。然而,这类产品的需求很高,所以我们可以期待看到许多经销商使用它作为几个活动的一部分。

必威平台APPMalwarebytes用户被保护不受此威胁,检测为Spyware.Baldr。

多亏了S!RI.额外的贡献。

妥协指标

BALDR样品

5464 be2fd1862f850bdb9fc5536eceafb60c49835dd112e0cd91dabef0ffcec5 - > 1.2版本1 cd5f152cde33906c0be3b02a88b1d5133af3c7791bcde8f33eefed3199083a6 - > 2.0版本7 b88d4ce3610e264648741c76101cb80fe1e5e0377ea0ee62d8eb3d0c2decb92 > 2.2版本8756 ad881ad157b34bce011cc5d281f85d5195da1ed3443fa0a802b57de9962f(2.2打开)

网络跟踪

hwid = {redacted}&os = windows%207%20x64&file = 0&cookie = 0&pswd = 0&credit = 0&autofill = 0&wardets = 0&id = baldr&sworge = v1.2.0hwid = {redacted}&os = windows%207%20x64&file = 0&cookie = 0&pswd = 0&credit = 0&autofill = 0&wardets = 0&id = baldr&version = v2.0