今天小编分享的互联网经验:深入分析BundleBot新型恶意軟體,欢迎阅读。
Check Point Research ( CPR ) 对被称为 BundleBot 的新型恶意軟體进行了深入分析发现,BundleBot 滥用 dotnet bundle(单檔案),这是一种自包含的格式,可以很好绕过静态检测。它会伪装成常规实用程式,人工智能工具和游戏。通常通过 Facebook 广告和受攻击帐户传播。
详细分析
在过去的几个月里,BYOS 公司一直在监控一个新的未知的窃取程式,研究人员称之为 BundleBot,他们发现其传播并滥用 dotnet bundle ( 单檔案 ) ,自包含格式。从 .net core 3.0+ 到 dotnet8+,这种形式的 dotnet 编译已经支持了大约四年,并且已经有一些已知的恶意軟體家族滥用它,例如 Ducktail。
使用这种特定 dotnet 格式的 BundleBot 主要是滥用 Facebook 广告和受攻击帐户,利用 dotnet bundle ( 单檔案 ) 、自包含格式、多阶段攻击和自定义混淆。
dotnet bundle(单檔案)、自包含的格式通常会导致整个 dotnet 运行时出现非常大的二进制檔案。此外,分析和调试这样的檔案可能会导致一些问题,特别是如果这样的檔案受到一些混淆的影响。
本文主要深入分析 BundleBot 的攻击方式,重点对 dotnet bundle(单檔案)、自包含格式进行分析。
发现过程
自 .NET Core 3.0(2019)发布以来,可以将 .NET 程式集部署为单个二进制檔案。这些檔案是不包含传统 .NET 元数据标头的可执行檔案,并通过特定于平台的应用程式主机引导程式在底层作業系統上本地运行。
dotnet bundle(单檔案),自包含格式是一种编译形式,可以生成一个不需要在作業系統上预装特定 Dotnet 运行时版本的可执行二进制檔案。可执行檔案实际上是一个本地托管二进制檔案,在其覆盖中包含整个 dotnet 运行时、程式集和其他依赖项,因此它很大,约几十 MB。本机托管二进制檔案负责从覆盖中提取(在执行时)所有内容,加载 dotnet 运行时和程式集,准备所有内容,并将执行转移到 .NET 模块的入口点。
当涉及到从覆盖中提取程式集时(在执行时),我们可以根据用于编译特定应用程式的目标 dotnet 版本来处理不同的例程。dotnet 版本之间的区别在于,在 dotnet5+(.NET Core 3.0+)之前,默认情况下,所有程式集都被提取到磁盘(临时目录)并加载到进程内存中。
另一方面,在 dotnet5+ 版本中,覆盖层中的所有程式集都被提取并直接加载到进程内存中(没有檔案被释放在磁盘上,则只有本地库)。在 dotnet5+ 中,可以在编译期间指定提取,但默认設定是直接被提取到内存中的。
尽管研究人员仍在处理与 dotnet 相关的应用程式,但上述对这种特定檔案格式的描述清楚地表明,需要使用不同的工具集和技术来正确分析它。
研究人员检测到 BundleBot 滥用 dotnet bundle ( 单檔案 ) ,将其作为攻击的最后阶段,它与已经被公布的几个恶意活动有关,很可能是由同一个组织发起的。
攻击载体
在发现的示例中,最初的攻击载体都是通过 Facebook 广告或被攻击的账户传播的,攻击程式伪装成常规程式、人工智能工具和游戏。例如,Google AI、PDF Reader、Canva、Chaturbate、Smart Miner、超级马里奥 3D 世界。由于 BundleBot 的功能之一是窃取 Facebook 账户信息,这些被盗的信息进一步用于通过新受攻击的账户传播恶意軟體。
尽管如此,我们不能完全排除其他可能的传播方式,因为我们无法通过相关的跟踪信息获得所有检测到的样本源链接。
一旦受害者被诱骗从钓鱼网站下载假程式实用程式,第一阶段下载程式以 "RAR" 形式发送。这些下载阶段通常是在 Dropbox 或 Google Drive 等托管服务上。
下载的 "RAR" 檔案包含一个独立的 dotnet bundle ( 单檔案 ) 格式的第一阶段下载程式。在执行第一阶段后,第二阶段以密码保护的 "ZIP" 檔案的形式下载,通常来自 Google Drive 等托管服务。第二阶段的密码在下载程式中进行硬编码,通常是以编码的形式。
被提取和执行的受密码保护的 "ZIP" 檔案的主要部分是 BundleBot,它是 dotnet bundle ( 单檔案 ) 、自包含格式和自定义混淆的组合。
下面是一个与虚假的实用程式 "Google AI" 有关的详细攻击链示例,它伪装成使用 Google AI Bard 的营销工具:
1. 来自受攻击账户的 Facebook 广告或 Facebook 帖子的钓鱼网站 https://marketingaigg [ . ] com/。
受攻击账户的 Facebook 上的钓鱼网站
2. 钓鱼网站 https://marketingaigg [ . ] com/ 伪装成营销工具,使用 Google Bard AI 引导下载页面 https://googlebardai [ . ] wiki/Googleai。
导致下载阶段的钓鱼网站
3.URL https://googlebardai [ . ] wiki/Googleai 正在从 Dropbox 托管服务。
下载 "RAR" 檔案 Google_AI.rar ( SHA-256:
"dfa9f39ab29405475e3d110d9ac0cc21885760d07716595104db5e9e055c92a6" ) ;4.Google_AI.rar 包含 GoogleAI.exe ( SHA-256: " 5ac212ca8a5516e376e0af83788e2197690ba73c6b6bda3b646a22f0af94bf59 " ) , dotnet bundle ( 单个檔案 ) 和自包含的应用程式;
5.GoogleAI.exe 包含用作下载程式的 GoogleAI.dll dotnet 模块 ( 从 https://drive.google [ . ] com/uc?id=1-mC5c7o_B1VuS6dbQeDAAqLuPbfAV58O&export=download&confirm=t, password=alex14206985alexjyjyjj 下载受密码保护的 "ZIP" 檔案 adsnew - 1.0.0.0 . ZIP ) ;
6. 解压后的 ADSNEW-1.0.0.3.zip ( SHA-256: " 303c6d0cea77ae6343dda76ceabaefdd03cc80bd6e041d2b931e7f6d59ca3ef6 " ) 包含 RiotClientServices.exe, dotnet bundle ( 单檔案 ) 以及自包含应用程式。
7.RiotClientServices.exe 作为最后阶段服务和执行,包含两个恶意 dotnet 模块 RiotClientServices.dll,BundleBot, 和 libarysharing .dll ,他们是 C2 数据序列化程式。
自包含 Dotnet Bundle 的分析
当我们需要分析一个自包含的 dotnet bundle ( 单檔案 ) 二进制檔案时,我们会遇到几个问题。
第一个问题是,我们需要以某种方式提取所有二进制檔案,这些二进制檔案是上述包 bundle 覆盖的一部分。这种提取将帮助我们静态地调查每个檔案,就像我们在处理普通的 dotnet 程式集时所做的那样。尽管目前该做法还不太成熟,但是已经有一些解决方案能够充分分析 dotnet bundle 格式了,从而帮助我们进行提取。我们基于 GUI 的工具和库,以编程的方式实现这一点。值得注意的是,目前 dnSpy/dnSpyEx 不支持提取 dotnet bundle 檔案。
可以帮助提取的最可靠的基于 GUI 的工具包括:
ILSpy:开源 .NET 程式集浏览器和反编译器;
dotPeek:免费的 .NET 反编译器和程式集浏览器;
ILSpy 中 dotnet bundle 的提取:
ILSpy 中的 dotnet bundle 提取
dotPeek 中 dotnet bundle 的提取:
dotPeek 中 dotnet bundle 的提取
如上所述,dotnet bundle 檔案的提取也可以通过编程的方式完成。当我们处理较大的檔案集时,这种方法非常方便。
为此,最合适的解决方案是使用 AsmResolver。AsmResolver 是一个便携式可执行 ( PE ) 检查库,能够读取,修改和写入可执行檔案,这包括 .NET 模块以及本机映像。该库仍然允许用户访问低级结构。更重要的是,AsmResolver 理解 bundle 檔案格式,因此我们可以使用它来自动提取。
下面是使用 AsmResolver 和 PowerShell 提取 bundle 檔案内容的代码示例。
现在,当我们成功地提取了 dotnet bundle 檔案的全部内容时,就可以使用通常用来检查普通 dotnet 程式集的任何工具,比如 dnSpyEx。这将允许我们静态地调查每个 .net 程式集。
dnSpyEx 中 dotnet 程式集的静态分析
由于 dotnet 程式集,特别是恶意程式集,通常非常复杂,并且经常受到一些混淆或保护的影响,大多数研究人员倾向于将静态和动态分析方法结合起来。关于动态方法,我们使用一个自包含的 dotnet bundle ( 单檔案 ) 二进制调试来接近第二个问题。
在托管调试器 ( 如 dnSpyEx ) 中调试 dotnet 程式集是常用的一种方法。dnSpyEx 中的调试不完全支持自包含的 dotnet bundle 二进制檔案,如果试图调试此类檔案,可能会导致如下所示的类似异常。
调试自包含 dotnet bundle 时抛出的 DnSpyEx 异常
幸运的是,最近发布的 dnSpyEx 版本 ( v6.4.0 ) 改进了对这类檔案的调试,因此我们应该不会再遇到这种异常,调试可以顺利进行。
尽管我们可以在最新版本的 dnSpyEx ( v6.4.0 ) 中调试自包含的 dotnet bundle 檔案,但它无法解决作为 dotnet bundle 混淆的 dotnet 程式集的处理问题。
当 dotnet 二进制檔案被编译为一个自包含的包时,这仅仅意味着整个依赖项 ( 尤其是 dotnet 运行时 ) 是生成的应用程式的一部分,并且这样的应用程式通过其配置檔案被配置为使用它们。这些配置檔案是在提取包和去混淆每个受保护程式集之后影响调试的主要问题。
为了解决这个问题,我们实际上可以将自包含的 dotnet bundle 檔案转换为非自包含的、非单檔案的 .NET 程式。通过这种方式转换的程式将被诱骗使用 dotnet 运行时,这是作業系統的一部分,所以我们必须确保安装了它。
转换步骤如下:
1. 如上所示,提取 dotnet bundle 檔案的内容;
2. 查找要在作業系統中安装的 dotnet 运行时版本并进行安装。为了快速查找我们的 .NET 应用程式所依赖和需要安装的具体 dotnet 运行时的版本信息,我们可以定位并检查配置檔案 * [ appname ] .runtimeconfig.json* 和 * [ appname ] .deps.json*,它们应该在之前提取的内容中。
在下面的示例中,我们可以清楚地看到,需要安装 .NET Runtime 5.0.17, x86。
配置檔案
需要安装的 dotnet 运行时版本 ( Microsoft )
3. 修改配置檔案 * [ appname ] .runtimeconfig.json* 和 * [ appname ] .deps.json* 的内容。通过修改这些檔案,我们将应用程式转换为非自包含的、非单檔案的 .NET 程式,并强制它使用已安装的 dotnet 运行时版本。
修改 * [ appname ] . runtimeeconfig .json*,将 " includedFrameworks " 字元串改为 " frameworks "。
修改 " [ appname ] .runtimeconfig.json"
通过删除来自 "libraries" 的 "runtimepack" 条目来修改 * [ appname ] .deps.json*。
修改 " [ appname ] . depth .json"
4. 运行和调试。自包含的 dotnet bundle 应用程式可以依赖于本机库,这些库可能是 bundle 的一部分,所以我们已经从内容中提取了它们,或者它们可以与 bundle 可执行檔案一起单独提供。通过检查配置檔案或运行配置檔案,我们可以快速发现应用程式是否有这样的依赖关系(在 * [ appname ] .deps.json* 中定义),如下所示。
运行提取的 bundle 应用程式时出现依赖关系相关错误要解决这个问题,只需将 bundle 应用程式旁边的所有依赖项复制到先前提取内容的位置。现在,调试应该像使用安装在作業系統中的 dotnet 运行时的普通 .NET 应用程式一样运行了。
在 dnSpyEx 中调试转换的非自包含、非单檔案的 .NET 应用程式
如果我们不处理作为 dotnet bundle 一部分的混淆的 dotnet 程式集,则不需要像上面那样,因为使用最新版本的 dnSpyEx ( v6.4.0 ) 可以直接调试它们。尽管如此,当我们处理混淆的程式集并倾向于以去混淆的形式调试它们时,仍然需要上面的操作方法。
如上所述,我们介绍了一种将自包含的 dotnet bundle 檔案转换为普通的 dotnet 程式集的通用方法,这取决于目标作業系統上预安装的适当版本的 dotnet 运行时。这种方法应该适用于不同的作業系統平台(Windows、Linux、macOS)。
了解了如何提取自包含的 dotnet bundle 檔案的内容以及如何对其进行调试后,我们就可以继续进行分析了。
技术分析
自带的 dotnet bundle 格式,可加强分析和静态检测;
受简单但有效的自定义模糊处理的影响;
滥用密码保护的檔案来进行最后阶段的传播;
最后阶段是一个新的窃取程式 BundleBot;
用于 C2 通信的自定义 homebrew 分组数据序列化。
下载程式技术分析
下载阶段的分析,请使用 GoogleAI.exe 示例 SHA-256:"5ac212ca8a5516e376e0af83788e2197690ba73c6b6bda3b646a22f0af94bf59"。
此示例是一个 32 位自包含的 dotnet bundle 应用程式(.NET Core 3.0.3),其最初是 RAR 檔案的一部分。提取该捆绑包后,主模块 GoogleAI.dll 是一个下载程式,受简单的自定义混淆影响,只有字元串和名称 ( 无意义的泰语文本 ) 。
受简单自定义混淆影响的下载程式
下载程式的 PDB 路径:D:BOTRATRAT 4.0 版 HashCodeBOT ADS Server 4ClientDowload FBClientDowloadobjDebugnetcoreapp3.0win-x86GoogleAI.PDB。
去混淆之后,主要功能驻留在名为 ProcessMain 的函数中。
下载程式的主要功能
其主要功能可以概括如下:
1. 单例检查;
2. 下载使用随机名称和 ".rar" 扩展名保存的受密码保护的 ZIP 檔案;
3. 从 https://drive.google [ . ] com/uc?id=1-mC5c7o_B1VuS6dbQeDAAqLuPbfAV58O&export=download&confirm=t 下载檔案;
4. 将下载的檔案属性設定为 " 隐藏 ";
5. 将下载檔案的内容提取到新创建的檔案夹 C:UsersUserDocuments{random},密码:alex14206985alexjyjyjj;
6. 将新创建的檔案夹和其中所有 ".exe" 檔案的属性設定为 " 隐藏 ";
7. 删除下载的檔案;
BundleBot 以自包含的 dotnet bundle 檔案的形式出现,是下载的受密码保护檔案的主要部分,并由下载程式执行。值得注意的是,所有分析的下载程式都包含相同的硬编码密码 alex14206985alexjyjyjj ( 明文或 base64 编码 ) 来开始下一阶段地提取。
BundleBot 技术分析
对 BundleBot 阶段的分析,使用了示例 RiotClientServices.exe,SHA-256:"6552a05a4ea87494e80d0654f872f980cf19e46b4a99d5084f9ec3938a20db91"。
这个示例是一个 32 位的自包含 dotnet bundle 应用程式 ( .NET 5.0.17 ) ,最初是受密码保护的 ZIP 檔案的一部分。在提取这个包之后,它的主要恶意组件是主模块 RiotClientServices.dll 和库 librarysharing.dll。
程式集 RiotClientServices.dll 是一个新的自定义的窃取程式,它使用库 libarysharing .dll 来处理和序列化作为恶意通信的一部分发送到 C2 的数据包数据。
这些二进制檔案受到类似的自定义混淆的影响,这些混淆主要集中在名称混淆和用大量垃圾代码填充这些 dotnet 模块。这样的混淆将导致大量的方法和类,这将使分析变得更加困难,并且需要创建自定义的去混淆器来简化分析过程。
在去混淆之前,RiotClientServices.dll 的大小约为 11MB,包含 26742 个方法和 902 个类。在 libarysharing .dll 示例中,混淆导致二进制大小约为 10MB,包含 32462 个方法和 9473 个类。
"librarysharing .dll" 的模糊代码:类 "Serialize"
正因为如此,我们快速设计了一个简单的去混淆器,它适用于所有受类似自定义混淆影响的二进制檔案。这个去混淆器使用 AsmResolver 和 PowerShell 来清理垃圾代码,并且仍然进行调试。
去混淆后,我们可以将方法和类的大小、数量减少到 :
1.RiotClientServices.dll 大小≈ 124KB, 158 个方法,35 个类;
2.LirarySharing.dll 大小≈ 30KB, 220 个方法,28 个类
"librarysharing .dll" 的去混淆代码,类 "Serialize"
可以使用 de4dot 工具进一步清除名称 ( 方法、类等 ) 的混淆。尽管如此,我们也不要忘记提供所有二进制檔案,为了保留调试,主模块正在引用和使用库。
"libarysharing .dll" 混淆前后比对
去混淆后,BundleBot 的主逻辑可以在模块 RiotClientServices.dll 中看到:
"RiotClientServices.dll" 模块中 BundleBot 的主逻辑
1.Sleep 补丁检测(反沙盒);
2. 通过系統資料庫路径 HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun, value ApplicationName 安装 / 解除安裝持久性軟體;
3. 信息窃取;
4.C2 BOT 通信 ( TCP 套接字与 C2 IP 51.79.180.158,端口 5505 通信 )
被盗和泄露的数据:
1.Telegram 数据;
2.Discord token;
3. 计算机信息。 HWID ( 根据作業系統驱动器的 CPU 计数、用户名、机器名、作業系統版本和 TotalSize 计算的 MD5 的前 10 个字节 ) ,Windows 版本,用户名,Windows 系统所在的国家,IP 信息 ( IP 地址,国家,地区,城市,时区,ISP ) - 通过服务 http://icanhazip [ . ] com 和 http://ip-api [ . ] com/json/ 检索;
4.Web 浏览器数据(Chrome、Edge、Opera、Brave、Coccoc、Firefox):配置檔案名称、解密密钥、凭据 cookie、密码、书签、扩展名、信用卡;
5.Facebook 帐户: uid,名称,cookie, access_token,页面,广告帐户信息,业务信息,浏览器名称,浏览器配置檔案名称;
6. 捕获螢幕截图;
在 libarysharing .dll 库的帮助下,所有被盗数据和 C2 通信都被处理、序列化和压缩。这个库定义了 bot 通信的主要功能如下 :
1.Bot 标识:启动 TCP 套接字,将被盗数据发送到 C2(序列化,GZip 压缩);
2.Bot 更新 ( 使用新版本完成 Bot 的重新安装 ) ;
3.Bot 关闭 ( 仅退出进程 ) ;
4.Bot Kill ( 删除持久性并退出进程 ) ;
5.Bot 重新更新标识 ( 窃取数据并发送给 C2 )
6.Bot 获取浏览器数据 ( 收集 web 浏览器数据并发送给 C2 ) ;
与 Bot 识别相关的网络流量剖析示例:
与 Bot 识别相关的网络流量剖析
值得注意的是,我们遇到了一个稍微不同的最终版本的 BundleBot,它共享所有代码,但除此之外,它还具有通过 HTTPS 将被盗数据泄露到 C2 的功能。我们分析的所有这些样本都被配置为避免通过 TCP 使用 bot 通信,而只是被配置为将被盗数据泄露到 URL 为 https://cp.bemilcoin [ . ] io/api/cookiePc?cookie 的 C2 web 伺服器。添加的代码如下所示。
与向 C2 web 伺服器泄露数据相关的代码
被盗的数据以 ZIP 檔案的形式泄露到 C2 web 伺服器。
被窃取的数据以 ZIP 檔案的形式泄露到 C2 web 伺服器
由于我们能够获得这些特定版本的原始 pdb 檔案,并且能够确认这个新功能产生的依赖项,因此该功能不是由手动更改引起的,而更可能是作为最近添加的功能。
总结
通过对 BundleBot 几个月的监测,我们更深入地了解了它的攻击载体,以及它是如何滥用 dotnet bundle ( 单檔案 ) 的,这种自包含格式可以完美绕过静态检测。这种特定的檔案格式和多阶段攻击相结合,在几个月的时间里大肆传播。
通过 Facebook 广告和被攻击的账户传播已经被攻击者滥用了一段时间,但将其与公开的恶意軟體的功能 ( 窃取受害者的 Facebook 账户信息 ) 结合起来,可能会成为一种 self-feeding 程式。
我们在本文中介绍了如何滥用 dotnet bundle ( 单檔案 ) 、自包含格式,并通过应用自定义的混淆来进一步强化分析。我们详细介绍了几种工具和技术,尽可能完整地分析类似的攻击。