深度解析:Kroll 对 GARUDA C2 恶意软件的分析
作者:奥塔维奥·帕索斯,埃里克·斯特罗姆 2026年5月
目录
IOCsURLs04040509101212202020引言GitHub分析Windows 工具链macOS 工具链Linux 工具链原生能力DLL 侧载独立可执行文件结论SHA-25603 核心洞察
关键洞察
演员资料与发展环境:Kroll威胁情报(TI)发现了一个通过一个后来被清除的GitHub账号运行的跨操作系统恶意软件活动,保留的痕迹显示使用了Kali Linux系统、印地语注释、位于印度古吉拉特邦的IPv6地址,以及本地大型语言模型使用的证据,这些证据支持高度确信地将该活动归因于一位印度籍开发者。
多平台感染链与持久化:攻击者使用初始下载器,从多个代码托管平台获取第二阶段脚本,以维持一个统一的框架(“GARUDA C2”)。
能力与有效载荷:二级组件执行主机侦察,通过存储库使用嵌入式API令牌进行数据外泄,并根据版本指示拉取更新。
您可以在本文末尾找到观察到的MITRE ATT&CK技术的完整列表。
引言
Kroll TI 发现了一个通过 GitHub 账户运营的多操作系统恶意软件活动,该账户从“mahesh97m”转移到“hellow2003”,后来在提交 16935c4 时被清除。清除之前,该存储库包含跨平台下载器、受害者日志、可执行文件和密码保护的压缩文件;Kroll TI在移除前保留了这些内容。
“测试”日志暴露了开发者的环境(Kali Linux 主机)以及一个全球 IPv6 地址,该地址定位到印度古吉拉特邦的拉杰kot。结合脚本中嵌入的印地语指导性注释以及存在专门的用户和服务的迹象,Kroll TI 高度确信该行为者位于印度,并且很可能利用本地的大语言模型来协助开发。
在操作层面,该行为者针对Windows、macOS和Linux维护统一的工具链,使用初始下载器从多个代码托管平台(GitHub、GitLab、Codeberg、Gitea和Bitbucket)拉取下一阶段脚本。在Windows上,持久化利用注册表运行键和计划任务(“SysCache_User_Update”),macOS则依赖使用自定义plist配置文件的LaunchAgent,而Linux使用systemd进行持久化。该命令与控制(C2)框架正被Kroll TI内部追踪为“GARUDA C2”。
跨平台操作系统中,第二阶段组件对主机进行侦察,并使用嵌入式API令牌将结果传输至行为者控制的存储库,然后轮询一个轻量级的“版本”指示器(例如,1.1/“garuda1”),通过Base64编码的命令执行器获取并执行更新后的命令。
原生有效载荷包括基于 Rust 的二进制文件和一种 VLC DLL 侧加载技术(利用 libvlc.dll/libvlccore.dll DLL 加载顺序),用于部署本地命令执行栈,该栈在 %LOCALAPPDATA%\Syscore1 下释放组件(例如 sys_base2.exe、sys_helper.exe),并建立持久化,同时还会尝试打开一个诱饵 PDF。功能上,这些二进制文件复制了基于脚本的模式:从代码托管仓库获取任务、比对版本、执行和持久化。
这份白皮书概述了Kroll对恶意软件的全面分析,包括各种工具链和IOCs。
GitHub分析
威胁行为者的 GitHub(之前是“mahesh97m”,现在是“hellow2003”)在提交 16935c4 中被清空。在此之前,该仓库充斥着多架构Shell 脚本、受害者日志、可执行文件和密码保护的 ZIP 压缩包。幸运的是,Kroll TI 团队在内容被清空之前已经备份了所有被删除的内容。
在多个受害者日志文件中,包括“测试”日志,这些日志揭示了威胁行为者的开发环境相关的宝贵机器信息。
File: axx1ltpmw6az2.0.txtSHA256: CEBCFDC6511A88A6C9BAD2EA2898F81C83308D4E820D7AB093C7A848FA738359
主机名:kali用户:kali用户ID:uid=1000(kali) gid=1000(kali) 组=1000(kali),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo), 29(audio)30(dip),44(video),46(plugdev),100(users),101(netdev),116(bluetooth),121(wireshark),123(lpadmin),129(scanner),134(kaboxer),984(ollama)操作系统:Linux kali 6.12.33+kali-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.12.33-1kali1 (2025-06-25) x86_64 GNU/Linux
...
--- 操作系统版本发布 ---
...PRETTY_NAME="Kali GNU/Linux 滚动版"
...网络
...3: wlan0: <广播, 组播, 启用, 有上行链路> mtu 1500 qdisc 不排队状态 启用 组 default qlen 1000
inet6 2402:3a80:4431:84f5:4603:2cff:fe8a:1420/64 作用域全局 已弃用 动态 mngtmpaddr 无前缀路由 有效生存时间 4700秒 预期生存时间 0秒
值得注意的是,威胁行为者的IPv6地址为2402:3a80:4431:84f5:4603:2cff:fe8a:1420/64,指向印度古吉拉特邦的拉杰kot。
其次,存在一个专用的ollama用户、用户组和systemd服务。这表明攻击者利用了本地的大型语言模型(LLM)来开发其部分或全部工作
其他表明使用了大型语言模型辅助的迹象还包括脚本中随处可见的各种“有点像大型语言模型”的评论,例如:
• “‘Agar nahi chal rahi → dubara run” 翻译为:“进行得不好 → 再跑一次”• “Check: specific PowerShell script chal rahi hai ya nahi” 翻译为:“检查:特定的 PowerShell 脚本是否正在运行?”• “‘Step 1: Pehli baar script run” 翻译为:“Step 1: 第一次运行脚本。”• “RUN-CMD (अबबिथवासहीहै- PS| CM| support + Timeout)”翻译为:“RUN-CMD (现在完全正确- PS| CM|支持+超时)”• “RUN-CMD (अब100% reliable - Base64 EncodedCommandसे)”翻译为:“RUN-CMD (现在100%可靠-来自Base64编码命令)”
根据印地语评论和IPv6地理位置数据,Kroll高度确信该威胁行为者正在印度活动。
Windows 工具链
下载器base5.ps1会检索3个不同的文件:p27.ps1、win3.ps1和vbs.vbs,这些文件都来自“[代码托管服务]/mahesh2210m/[文件名]”的变体。
下载脚本还会对下载的内容进行运行时检查。下载的内容必须包含字符串“thisistesting”。
此外,base5.ps1 负责在受害者的机器上建立持久化,这是通过注册表“运行”键和计划任务两种方式实现的。
第一种方法,通过注册表“运行”键,可以通过以下代码实现:
其中$script3是下载的“vbs.vbs”脚本。一个完整的条目示例为:HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\SysCacheUpdate,其值为:wscript.exe %APPDATA%\SysCache\vbs.vbs。
第二种持久化方法,通过计划任务,是通过以下代码实现的:
此计划任务伪装成“SysCache_User_Update”,每当受害者登录该机器时即被触发,并以机器上可能的最低权限执行vbs.vbs脚本。
VBS脚本的行为很直接。它所做的一切就是首先实例化一个生成cmd命令行,并在其中附带以注释形式出现的“thisistesting”字符串,即:
然后,使用查询“Select * from Win32_Process Where Name=’powershell.exe’”向 WMI 发送查询,遍历返回的进程,并检查它们的命令行是否包含字符串“win.ps1”(与实例化的 psCommand 相同)。如果是,脚本退出。如果不是,脚本使用 psCommand 变量作为命令行启动一个新的 cmd 进程。
在vbs.vbs执行时,另外两个脚本(p27.ps1和win3.ps1)也在受害机上执行。
p27.ps1脚本的执行过程很简单。它执行的首要有意义的步骤是获取受害者信息,例如:
该脚本,以及除“下载者”之外的所有其他脚本,都揭示了威胁行为者的代码托管服务秘密。
这些秘密用于以下命名的功能:Create-GitHub、Create-GitLab、Create-Gitea、Create-Codeberg、Create-Bitbucket。此类功能旨在认证到威胁行为者的仓库,并以提交的形式上传收集到的受害机器信息。此类活动可在以下提交中观察到:
•dfa74ac•797760c•803dc24
以及更多。
与受害者机器信息一同,该脚本还会上传一个包含“版本”字符串“1.1”的文件。其用途将在下一段讨论。
另外,一同执行的最后一个文件是 vbs.vbs,p27.ps1 是 win3.ps1。这个 PowerShell 脚本 win3.ps1 的作用是获取之前提到的版本字符串,并根据“版本”字符串是否更新来决定是否执行更新的脚本。
该脚本首先实例化其输出目录。
这些目录随后会以“filename_last_version.txt”的形式接收从之前提到的代码托管服务中获取的内容。下次执行此脚本时,它将比较当前获取的内容(当前版本)与上一个版本;如果当前版本大于上一个版本,则会调用Run-Cmd函数。
Run-Cmd 是一个简单的 PowerShell/命令执行器,读者会对其有预期。命令字符串被编码为 Base64,然后通过Start-Process API 执行,输出和错误分别重定向到 out.txt 和 err.txt 文件。
macOS 工具链
macOS 目标的工具链与 Windows 工具链非常相似,也将会与 Linux 工具链非常相似。
与其他操作系统的工具链不同的是,威胁行为者实现持久化和规避的方式。持久化是通过一个自定义的 plist 文件实现的,其内容如下: