macOS.ZuRu重现江湖 | 修改版Khepri C2隐藏在篡改的Termius应用中
2025年7月10日
作者:Phil Stokes & Dinesh Devadoss
macOS.ZuRu后门最初于2021年7月由一名中国博主发现,当时通过百度搜索结果中的恶意链接分发。用户搜索流行的终端模拟器iTerm2时,会被重定向到一个托管特洛伊木马化版本应用的恶意网站。随后的ZuRu变种采用相同模式,针对其他流行的macOS实用程序(包括SecureCRT、Navicat和Microsoft的Remote Desktop for Mac)在百度搜索结果中投毒。这些被篡改的应用选择表明,恶意软件作者的目标是使用SSH和其他远程连接工具的后端工具用户。
2024年1月,JAMF的研究人员发现了使用类似技术指标的盗版macOS应用,但现在利用开源的Khepri C2框架进行感染后操作。2025年5月下旬,一个特洛伊木马化跨平台SSH客户端和服务器管理工具Termius的新样本在社交媒体上曝光。
这个最新样本使用了一种新方法来特洛伊木马化合法应用,以及一个修改的Khepri信标。在本文中,我们提供了这个恶意软件最新版本的技术分析,以及新的技术指标,以帮助检测工程师和威胁猎人。
特洛伊木马化应用包
恶意软件通过.dmg磁盘映像分发,包含一个被篡改的正版Termius.app。正版Termius的磁盘映像大小约为225MB,而特洛伊木马化版本由于添加了恶意二进制文件,略大为248MB。
由于磁盘映像中的应用包已被修改,攻击者用自己的临时签名替换了开发者的代码签名,以通过macOS代码签名规则。
除了修改的签名外,特洛伊木马还向嵌入的Termius Helper.app添加了两个可执行文件。正版Termius Helper二进制文件(约248KB)被替换并重命名为.Termius Helper1。执行时,植入的Termius Helper二进制文件(一个巨大的25MB Mach-O)会启动恶意软件加载器.localized和.Termius Helper1,以确保父应用按用户预期运行。在后台,.localized从download.termius[.]info下载另一个二进制文件,并将其写入/tmp/.fseventsd。这个下载是一个Khepri C2信标。
虽然Khepri的使用在早期版本的ZuRu中已经出现,但这种特洛伊木马化合法应用的方法与威胁行为者之前的技术不同。在旧版本的ZuRu中,恶意软件作者通过添加一个引用外部.dylib的额外加载命令来修改主包的可执行文件,动态库充当Khepri后门和持久化模块的加载器。
通过LaunchDaemon持久化
执行时,.localized二进制文件连接到download.termius[.]info,并向用户请求提升权限。如果权限被授予,它会将一个持久化plist(标签为com.apple.xssooxxagent)写入域级文件夹/Library/LaunchDaemons/。
持久化模块硬编码在.localized二进制文件中,设计为每小时执行一次位于/Users/Shared/com.apple.xssooxxagent的.localized副本。
为了在恶意守护进程写入磁盘后管理它,.localized使用函数_writePlistAndStartDaemon()执行以下命令:
|
|
恶意软件还使用Security框架的已弃用API AuthorizationExecuteWithPrivileges来请求持久化模块的权限。
函数_copySelfToShare()使用[NSBundle mainBundle].executablePath获取当前可执行文件的路径,并检查是否包含字符串/Users/Shared/。如果不包含,它将自身复制到/Users/Shared/com.apple.xssooxxagent,首先删除可能已存在于该路径的任何文件。
.localized加载器和md5更新机制
除了安装持久化,加载器还执行一些检查和安装任务。
_LockManager()函数通过将锁文件写入/tmp/apple-local-ipc.sock.lock来确保只有一个恶意软件实例运行。尽管名称如此,锁文件与IPC或套接字无关。_LockManager()使用flock获取文件的独占锁,如果另一个进程已经持有锁,则退出。如果文件锁成功,恶意软件会将自己的PID写入文件。
_checkFileAndDownloadIfNeeded()函数下载、验证并执行第二阶段有效负载。它首先检查有效负载是否已存在于/tmp/.fseventsd。如果不存在,它从C2 http[:]//download.termius[.]info/bn.log.enc检索有效负载,使用硬编码密钥my_secret_key解密。我们注意到这个URL模式与早期ZuRu版本中看到的非常相似,例如hxxp://download[.]finalshell[.]cc/bd.log。
如果文件存在,该函数计算其md5哈希值,并与从http[:]//download.termius[.]info/bn.log.md5远程调用接收的值进行比对。如果值不匹配,则从C2下载新版本的文件。这很可能是一个更新机制,允许恶意软件检查是否有更新或不同版本的有效负载可从C2获取,但它也可以确保有效负载未被损坏或篡改。
有趣的是,我们在这个二进制文件中看到一些可能表明恶意软件源代码可能从早期活动中重用或至少有过早期开发的痕迹。例如,_startBackgroundProcess()函数在代码中未被调用,并且与_runfile(_maziFilePath)函数功能几乎相同。后者由_main调用,接受文件路径参数/tmp/.fseventsd,然后分叉并执行有效负载。_startBackgroundProcess()函数做类似的事情,但它不接受参数,而是将文件路径/tmp/check_id硬编码到其他相同的函数体中。这个文件路径在执行恶意软件时未使用,并且除了冗余的_startBackgroundProcess()函数外,似乎没有其他交叉引用。
类似地,代码包含一个早期版本的_writePlistAndStartDaemon()函数,称为_startLaunchDaemon。后一个函数从未被调用,并使用kickstart参数而不是launchctl的bootout/bootstrap参数,如我们在前一节中所述。
修改的ZuRu有效负载解密例程
我们注意到早期版本的ZuRu使用自定义XOR例程。JAMF研究人员描述了一个函数:
“接受一个编码字节,应用XOR和减法操作的组合,使用XOR密钥0x7a,并产生一个解密字节。XOR和减法的使用使加密比简单的XOR密码稍微复杂。与0xff的掩码确保所有操作保持在字节的有效范围内,考虑了减法期间的任何下溢。”
在我们分析的新版本中,解密仍然使用XOR,并结合加法和减法。但是,单字节XOR密钥0x7a已被密钥字符串my_secret_key替换。解密函数_decryptData()迭代输入数据的每个字节,并按顺序应用四个操作。
首先,它通过从密钥中取一个字节,依次循环my_secret_key的13个字节,并执行模3操作,向输入添加一个字节。这确保要添加的字节有效地为0、1或2。接下来,为确保结果保持在0-255的有效范围内(即可以存储为单个字节),它添加0x100(256),然后再次除以0x100取余数。第三步根据字节在数据中的位置减去0、1或2(再次模3)。最后,它与原始密钥字节进行XOR。我们可以用伪代码更简单地表示逻辑如下:
|
|
XOR例程的对称性确保相同的代码可用于编码和解码传输的数据。然而,像这样的自研例程不提供真正的加密,主要用来自动化分析和检测引擎混淆数据。
修改的Khepri命令与控制植入
从C2获取的有效负载是一个通用的Mach-O,约174KB,带有标识符beacon_arm64_x86_64的临时签名。可执行文件需要Sonoma 14.1(2023年10月发布)或更高版本,表明攻击者不期望其目标用户运行旧版本的macOS。
有效负载是一个修改的Khepri C2信标,首次于2024年12月5日在VirusTotal上出现。嵌入的字符串表明,托管在GitHub上的原始开源版本Khepri已被定制,专门用于Termius特洛伊木马。
Khepri是一个功能齐全的C2植入,具有以下功能:
- 文件传输
- 系统侦察
- 进程执行和控制
- 带输出捕获的命令执行
信标可以带-s或-bd标志启动,或不带标志。如果未使用-s,代码尝试获取/tmp/my_unique_process.lock文件的锁。如果锁失败,信标退出;否则,它查找-bd标志。如果启动时提供-bd,信标调用runInBackground()函数将进程守护化。如果使用-s,信标跳过检查锁文件并继续检查-bd。
信标设置恒定的5秒心跳间隔,比开源版本中的10秒默认值稍快,并将C2设置为端口53,一个常用于DNS的端口。它使用合法域www.baidu[.]com作为诱饵,而实际上连接到ctl01.termius[.]fun。C2解析到阿里云IP 47[.]238.28[.]21,遵循早期ZuRu恶意软件工件中看到的模式,特别是ctl01.macnavicat[.]com,解析到47[.]242.144[.]113,并在2024年被先前研究人员报告。
SentinelOne Singularity检测macOS.ZuRu
SentinelOne Singularity检测并防护macOS.ZuRu。当启用保护策略时,所有恶意组件被阻止在设备上执行。如果策略设置为检测,SentinelOne Singularity检测macOS.ZuRu尝试安装持久化,并立即终止所有相关进程并隔离其恶意组件。
结论
macOS.ZuRu的最新变种继续了威胁行为者特洛伊木马化开发者和IT专业人员使用的合法macOS应用的模式。从Dylib注入到特洛伊木马化嵌入式助手应用的技术转变,可能是为了规避某些类型的检测逻辑。即便如此,行为者继续使用某些TTP——从目标应用和域名模式的选择到文件名、持久化和信标方法的重复使用——表明这些在缺乏足够端点防护的环境中继续取得成功。
SentinelOne客户受到保护,免受macOS.ZuRu的侵害;没有这种保护的组织建议查看下面提供的指标和上面呈现的技术细节。
入侵指标
文件路径
- /Library/LaunchDaemons/com.apple.xssooxxagent.plist
- /Users/Shared/com.apple.xssooxxagent
- /private/tmp/Termius
- /tmp/.fseventsd
- /tmp/apple-local-ipc.sock.lock
文件
| SHA-1 | 名称 | 描述 |
|---|---|---|
| a7a9b0f8cc1c89f5c195af74ce3add74733b15c0 | .fseventsd | Khepri C2信标 |
| ace81626924c34dfbcd9a485437cbb604e184426 | Termius Helper | 特洛伊木马Mach-O |
| de8aca685871ade8a75e4614ada219025e2d6fd7 | Termius9.5.0.dmg | 特洛伊木马磁盘映像 |
| fa9b89d4eb4d47d34f0f366750d55603813097c1 | .localized, Termius, com.apple.xssooxxagent | 恶意软件加载器 |
网络通信
- http[:]//download.termius[.]info/bn.log.enc
- http[:]//download.termius[.]info/bn.log.md5
- ctl01.termius[.]fun
- 47[.]238.28[.]21
喜欢这篇文章?在LinkedIn、Twitter、YouTube或Facebook上关注我们,查看我们发布的内容。
阅读更多关于网络安全的内容:
- 2024年macOS恶意软件回顾 | 信息窃取器、后门和针对企业的APT活动
- PinnacleOne ExecBrief | 中国的大国手段意味着大责任
- ReaderUpdate Reforged | macOS恶意软件大熔炉添加Go到Crystal、Nim和Rust变种
- HellCat和Morpheus | 两个品牌,一个有效负载,勒索软件附属丢弃相同代码
- 2024年云勒索软件状态
- DragonForce勒索软件团伙 | 从黑客活动家到商业街勒索者
阅读更多