远程访问木马Cybergate RAT的样本分析

前言 CyberGate 是一种远程访问木马 (RAT),允许攻击者未经授权访问受害者的系统。攻击者可以从世界任何地方远程连接到受感染的系统。恶意软件作者通常使用此程序窃取密码、文件等私人信息。它...

前言

CyberGate 是一种远程访问木马 (RAT),允许攻击者未经授权访问受害者的系统。攻击者可以从世界任何地方远程连接到受感染的系统。恶意软件作者通常使用此程序窃取密码、文件等私人信息。它还可能用于在受感染的系统上安装恶意软件。

IOC

HashValue
SHA183ebbf632e25dbe69b060d190a42a5125ffe3902
MD50ee2f7d6a851faf44bf235186be91a19
SHA256b64c40843b011d715c431b761680e8565383ac702f5ed80492fb30bd6aa33929

unpame链接(dump文件下载地址):https://www.unpac.me/results/7ec3268f-b1ed-49af-a8ff-218513c127db/

DIE静态分析

分析第一步,借助PE查询工具,这里用的是DIE:

image-20240809140658291

32位程序,可以看到加了UPX壳(这一类壳最简单,直接脱就可以)。语言用的Delphi。

image-20240807103512894

查看节表也可以发现,没有被魔改过,那就直接UPX -d

image-20240809140749979

脱完壳的文件会直接覆盖掉原文件,DIE继续深入分析

查看信息熵,信息熵可以判断该恶意程序是否有被加壳混淆,或者是在内存中载入了一些有效负荷。

image-20240807103822341

加了壳的,准确来说是.rsrc节被加壳混淆了;图表上具有高而平坦的熵值区域,说明很有可能该恶意软件具有注入的行为,即注入了代码到内存中。

可以查看导入表,再次肯定这一推测:

image-20240807104102308

发现函数 VirtualAlloc ,该函数是合法的用于分配内存的函数,但是恶意软件经常用它来进行一些注入行为。在地址空间中分配一块内存,将恶意代码注入其中并执行。

字符串方面查看了,但是没有什么可疑信息。

沙箱大致行为

用沙箱查看一下大致的流程,仅作为参考。(高级分析要收费,普通用户的随便看看)

image-20240807104631360

主进程释放了俩个文件,推测其一就是进程注入的恶意代码。

image-20240807104739664

可以看到特别多的网络连接,充分说明了CyberGate作为一个远程访问木马的作用。

image-20240807104851590

其它没有什么了,还是得手动分析。

IDA初步分析

IDA配置

语言用的是Delphi,IDA可以做些修改

禁用分析:

image-20240809140822420

Option -> Compiler options

image-20240807105927181

Options -> general -> Analysis

image-20240807110006849

点击OK,可以开始分析了

创建互斥锁

start函数开始先用CreateMutexA创建了俩个互斥锁:

image-20240807110531259

image-20240807110621781

分别是 "_x_X_UPDATE_X_x_""_x_X_PASSWORDLIST_X_x_" , 用GetLastError获取错误码,与0xB7比较。

第一处互斥锁如果存在,它会关闭互斥句柄并会休眠12秒,不存在的话就直接关闭互斥句柄。

一般情况下,互斥锁都不会存在,也就是这里不会进入if判断,往下走:

image-20240808161803440

else中又是互斥锁,不用理会,继续向下

image-20240808162136771

创建文件

sub_40B93C中的sub_405D70 发现了CreateFileA函数:

image-20240808162252815

在这里创建了一个文件并写入数据,字符串str_XXXXXX_txt,实际上就是XX--XX--XX.txt。这个正是我们在沙箱中观察到的释放文件。

注入技术

继续往下,在函数sub_40B7FC中发现了关键操作

image-20240808162456008

先是通过FindWindowA函数尝试查找Shell_TrayWnd窗口,后检索其进程ID,如果没有找到的话就会创建一个名为 explorer.exe的新进程,然后使用 ProcessInformationhProcess 作为参数调用sub_4040F4

进入函数sub_4040F4

image-20240808162905286

无疑,发现了VirtualAlloc函数,恶意软件惯用的伎俩,通过该函数分配内存,之后WriteProcessMemory写入恶意代码并执行,依次排查下面的函数,最终在sub_4038AC中找到了执行代码的函数。

image-20240808163057401

通过函数CreateRemoteThread创建一个在另一个进程中的新线程来执行恶意代码。

提取二阶段

image-20240808163630971

要想提取出有效负荷,就需要先过掉前面的互斥锁。我先是尝试了在GetLastError上设置了断点,但是,实际上发现,互斥锁根本就不会触发。那么直接bp VirtualAlloc

之后程序会陷入异常。仔细检查后发现问题出现在中间的一个call函数上,

image.png

IDA反编译后会报错:

image.png

从汇编上看是这样的:

image.png

会一直call一个函数,然后cmp比较不符合就exit了。符合也是一直向下。不太想深入去调它,做了一个比较暴力的决定,直接nop掉了该函数,(不清楚后面会不会有影响)

在xdbg中nop掉之后,就可以F9运行了,断点会命中VirtualAlloc

在这里用硬件断点可以提取出内存中的恶意代码,具体如何操作,可以查看我近几篇文章。

断点命中后,Ctrl+F9得到函数的返回值,即分配内存区域的基地址,跳转到内存中,对第一个字节下硬件断点。

~接着F9 Ctrl+F9继续跑,慢慢跑,好像会再断俩次在VirtualAlloc上,最终,可以得到如下内存区:~

上面说错了,这样dump出去的文件只有几kb大小,在IDA分析的时候忽略了。这次的分配内存和之前的不同,之前是只执行一个VirtualAlloc,该恶意软件是循环多次分配内存,直到满了才结束

image-20240808170701485

image.png
这里折腾了一会,还是有点残缺,因为dump出来的文件也是带壳的,upx没有魔改但是还是会报错。应该PE结构也被损坏了。

有个思路是通过写条件断点来自动化执行的,但是能力有待提高,最后还是选择使用沙箱dump出的文件。

第二阶段分析

使用unpacme可以dump出三个文件

image-20240809140127783

第一个样本

image-20240809141207854

是一个Delphi编写的dll文件。

IDA分析

入口点:

image-20240809141349310

没有什么值得留意的。查看导入表

有一个StartHttpProxy值得注意,前言说过这是一个远程访问木马。

StartHttpProxy

逃避防火墙

image-20240809141559644

函数sub_4302E4接收的参数1字符串代表的是 'Windows Firewall Update',说明这里可能进行了和防火墙相关的操作。

image-20240809141925033

进入到该函数中:

image-20240809141958246

该恶意软件使用Registry::TRegistry类来操作注册表,完整的路径下来是:SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List,恶意软件会尝试打开该路径,如果不存在就创建它。

之后LStrCat可知将字符串拼接起来:将v2和':*:Enabled:''Windows Firewall Update'拼接起来给v7

image-20240809142718490

之后将拼接起来的v7写入上面的注册表中,并以System__AnsiString作为值名称。

“Windows Firewall Update”应用程序已添加到授权应用程序列表中。“*:Enabled:”部分通常表示已为该应用程序启用所有端口和协议,可能允许其通过防火墙自由通信。

这意味着恶意软件可能以“Windows Firewall Update”的名称运行,以逃避防火墙。

启动HTTP代理

image-20240809143217873

在设置完防火墙之后,sub_430214 初始化了一个TIdTCPServer对象,表明了这是一个TCP服务器。

创建互斥锁

image-20240809143418928

image-20240809143428559

GetChromePass

这个导出函数看名字就和Chrome有关:

image-20240809143814220

定位到函数 sub_420C04

image-20240809145720432

**'Local AppData'**作为参数,分析sub_41E4F8

image-20240809145842478

恶意软件将字符串**“SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders”**分配给v8,并将字符串 Local AppData 分配给v7。

image-20240809145957094

在这里,从给定项 (Local AppData) 注册表 (SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders) 下的 Windows 注册表中检索特定值。

将文件从**“\Local AppData\Google\Chrome\User Data\Default\Web Data”**复制到.tmp文件夹

打开名为**“\x0FTSQLiteDatabase”**的 SQLite 数据库

循环遍历数据库查询结果,然后检索并处理password_value、username_value、origin_url。

使用CryptUnprotectData解密数据 (pDataIn)并将其存储在 pDataOut 中

Mozilla3_5Password

获取获取 Mozilla 的个人凭证。

image-20240809150418714

对user和passwd解密:

image-20240809150616673

第二个样本

该样本同初始文件一样。

第三个样本

image-20240809150858346

image-20240809151145075

该dll没有导出函数,只有一个入口点:

实现持久性

image-20240809151339006

查看字符串发现很多关于注册表的操作。

Software\Microsoft\Windows\CurrentVersion\Run用于在用户登录时自启动的操作,\Policies\Explorer\Run也是用于配置系统启动时的程序,不过它由系统策略控制,用于在特定情况下强制启动。

进程注入

image-20240809151929652

创建进程和获取进程ID

image-20240809152058057

然后它使用LookupPrivilegeValueA“SeDebugPrivilege”

恶意软件使用 SeDebugPrivilege 获取访问权限,以调试和调整系统上任何用户拥有的进程的内存

检查Windows版本

sub_14043A04函数中:

11

恶意软件通过检查dwMinorVersion 来检查 Windows 版本

如果它等于 1,则表示 Windows 版本是:

Windows NT 3.1Windows XPWindows 7Windows Server 2008 R2

  • 发表于 2024-09-03 09:00:01
  • 阅读 ( 16933 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
Sciurdae
Sciurdae

16 篇文章

站长统计