XCSSET恶意软件再次进化:分析最新变种的技术更新

微软威胁情报团队发现XCSSET恶意软件新变种,该变种针对Xcode项目进行感染,新增浏览器窃取、剪贴板劫持和持久化机制,采用高级加密混淆技术和仅运行编译的AppleScript实现隐蔽执行。

分析

最新XCSSET变种遵循四阶段感染链。前三个阶段与之前变种一致,分析从第四阶段开始,包括boot()函数及其相关调用以下载和运行子模块。

第四阶段脚本的boot()函数

新变种对boot函数进行了修改,包括增加对Firefox浏览器的检查并修改了Telegram存在性检查逻辑。此阶段还下载并执行多个新模块。

旧变种: 图1. 早期变种的boot()函数

新变种: 图2. 最新版本的boot()函数

以下部分将检查现有子模块的变化以及此变种中的附加模块。

vexyeqj [旧变种:seizecj](信息窃取器)

与之前变种相比,此脚本中的几个命令被注释掉。此外,它下载一个名为bnk的模块,使用osascript执行,并将域作为参数提供。然后等待三秒并删除下载的文件。

图3. 信息窃取子模块的主要逻辑

bnk文件是一个仅运行编译的AppleScript。使用GitHub上的AppleScript反汇编器项目可以对代码进行反汇编分析。

脚本定义了多个函数,用于数据验证、加密、解密、从命令和控制(C2)获取额外数据以及日志记录。脚本以域作为参数执行。

图4. dec()函数的反汇编代码

上面是dec()函数的代码片段,用于解密从C2服务器接收的数据。解析上述代码得到命令:

加密数据存储在变量in中。提取此变量的前32个字符作为初始化向量(IV)。剩余数据经过Base64解码后提供给AES解密函数。在这种情况下,解密密钥是预定义常量27860c1670a8d2f3de7bbc74cd754121,该常量在主函数内建立并计算。

解码的blob似乎是一个配置文件。以下是从C2服务器获取的解密响应的格式化和编辑示例:

图5. 从C2服务器接收的配置数据

以下部分检查下载的bnk有效负载的核心逻辑,解释如何解释和应用先前的信息。

首先,它调用定义的函数从C2服务器获取配置数据;这些数据被解密并存储在变量中。执行shell命令以检索SerialNumber和当前用户。

检索剪贴板内容,这是通过检查AEVT(Apple事件代码)代码确定的。然后进程识别最前端的应用程序,将其与C2响应中"bad"属性定义的阻止列表进行核对。仅当当前剪贴板数据与最后一个剪贴板条目和最后一个替换的剪贴板数据都不同,剪贴板数据的长度超过25个字符,且oD()函数不返回true时,处理才会继续。oD()函数在前四个字符为数字时返回true。经过上述检查后,它还有多个门和条件。第一个条件检查剪贴板长度是否在50 < len(剪贴板) < 300之间。然后检查剪贴板是否与响应中s记录定义的模式匹配。如果匹配,剪贴板数据将以记录类型字符串格式化并外泄到C2服务器。传输的数据也经过AES加密。

在第二个条件中,脚本验证剪贴板长度是否在25到65之间,是否使用单个参数执行,以及cD(剪贴板数据)函数返回的值是否大于1,该值指的是参数中传递的数据的数字计数。如果满足这些条件,脚本将遍历C2响应中的子集合,其中包括各个钱包的单独条目。每个子集合条目包含:

  • a:包含地址列表,从中选择一个;相应的剪贴板数据随后被替换。
  • t:指钱包标识符。
  • r:指定用于匹配与此钱包关联地址的正则表达式模式。
  • ir(可选):代表负正则表达式模式;匹配此模式的地址应被排除。
  • p:似乎用作计数器或记录索引。

对于每个记录,它匹配r和ir的模式。如果变量r为true且ir为false,则程序检查剪贴板内容是否与任何攻击者的地址匹配。如果不匹配,它从列表中选择一个地址并相应地替换剪贴板的内容。系统随后将信息(包括原始剪贴板数据、替换的数据、钱包名称、最前端应用程序和其他相关详细信息)发送到C2服务器。接下来,它将剪贴板数据的值分配给xcP变量,该变量跟踪最近替换的剪贴板条目。最后,它更新xP变量以反映当前剪贴板文本,等待两秒,然后重复循环。

neq_cdyd_ilvcmwx(文件窃取器)

此模块从C2服务器检索额外的脚本,该脚本保存在/tmp/目录中。随后使用提供的域和moduleName作为参数执行脚本。执行后,删除下载的文件。该模块作为编译的仅运行AppleScript运行。该脚本与之前被识别为针对浏览器的数字钱包数据窃取器的txzx_vostfdi模块相似。在分析期间,C2服务器未提供文件夹列表;但是,它能够将文件外泄回C2服务器。

图6. 下载并执行额外脚本

xmyyeqjx(基于LaunchDaemon的持久化)

此子模块为~/.root文件设置LaunchDaemon持久化,该文件在此模块中创建。以下是脚本的摘要:

进程首先在用户的HOME目录中创建几个路径和一个~/.root文件,该文件将包含有效负载。有效负载执行以下操作:

  • 将目录更改为/Users/Shared
  • 检查网络连接
  • 检索本地登录用户
  • 睡眠30秒
  • 在登录用户的上下文中执行~/.zshrc文件(.zshrc文件在之前的子模块中附加了恶意负载)
  • 睡眠30秒
  • 修改两个配置以执行系统命令,禁用macOS自动配置更新和快速安全响应机制。

这些命令修改macOS软件更新首选项以禁用各种关键的Apple更新,包括快速安全响应(RSR)、安全配置更新等。

然后它调用doMainFunc()函数。

图7. 创建虚假应用程序并从C2服务器下载额外脚本。

此函数首先检查LaunchDaemon条目是否存在,其中内容包含.root文件。如果未找到,则从C2服务器下载另一个脚本,该脚本同样是一个仅运行编译的AppleScript。然后在/tmp目录中创建一个名为System Settings.app的虚假应用程序,该应用程序基本上使用两个参数执行此下载的AppleScript。这些参数似乎是标签/plist名称和要持久化的文件(~/.root文件)。创建虚假应用程序后,它调用另一个函数,在该函数中等待合法的系统设置应用程序启动,然后执行虚假应用程序。此行为旨在伪装成合法程序。

下载的脚本首先通过执行shell命令获取设备的序列号和当前用户名。然后形成LaunchDaemon plist文件的路径并构建其内容。它使用echo命令将此构建的内容粘贴到LaunchDaemon文件中。文件名是参数中传递的名称。以下是创建的plist文件的示例:

图8. 创建的LaunchDaemon条目的Plist内容

它在plist名称中使用前缀com.google.进行伪装,并使用bash执行~/.root文件。echo命令使用"do shell script …. with administrator privileges"运行,这可以通过badm AEVT代码推断。然后执行chown命令将所有者更改为root:wheel,并为plist文件设置644权限。最后,使用sudo执行launchctl load -w命令以启动守护进程。

jey [旧变种:jez](基于Git的持久化)

旧变种中的命令通过shell直接执行加密有效负载与重复解密命令的串联。在新变种中,解密逻辑封装在shell函数内,该函数内联定义,然后在传递给shell执行之前用于解密加密字符串。此更改主要增强了恶意软件使用的混淆方法。

旧逻辑: 图9. 旧变种中的有效负载生成逻辑

新逻辑: 图10. 最新变种中的有效负载生成逻辑

iewmilh_cdyd(针对Firefox的信息窃取器)

此新变种增加了一个信息窃取模块,以外泄Firefox存储的数据。首先调用runMe()函数从C2服务器下载一个Mach-O FAT二进制文件,该文件负责所有信息窃取操作。

图11. 下载HackBrowserData项目的编译二进制文件

此下载的二进制文件似乎是GitHub项目HackBrowserData的修改版本,能够解密和导出浏览器存储的数据。密码、历史记录、信用卡信息和cookie是它可以从几乎所有流行浏览器提取的一些关键信息。

下载后,二进制文件被赋予可执行文件权限,在受害者的机器上进行临时签名,并使用–b firefox -f json –dir ” & resDir & ” –zip作为参数执行:

  • -b:浏览器名称
  • -f:输出数据的格式
  • –dir:存储输出的导出目录
  • –zip:此标志将输出存储在压缩的ZIP中

一旦所有数据被检索,它使用其旧的数据分块外泄方法将压缩的ZIP和日志文件上传到C2服务器。

缓解和保护指南

防御者可以采取以下缓解步骤来防御此威胁:

  • 运行最新版本的操作系统和应用程序。一旦有最新安全更新,立即部署。
  • 始终检查并验证从存储库下载或克隆的Xcode项目,因为恶意软件通常通过受感染的项目传播。
  • 在复制和粘贴剪贴板中的敏感数据时要谨慎。始终验证粘贴的内容是否与预期来源匹配,以避免成为剪贴板劫持或数据篡改攻击的受害者。
  • 鼓励用户使用支持Microsoft Defender SmartScreen的Web浏览器,如适用于macOS和各种平台的Microsoft Edge,它可以识别并阻止恶意网站,包括网络钓鱼网站、诈骗网站以及包含漏洞利用和托管恶意软件的网站。
  • 使用Microsoft Defender for Endpoint on Mac,它可以检测、停止和隔离此博客中讨论的恶意软件。

Microsoft Defender for Endpoint客户还可以应用以下缓解措施,以减少环境攻击面并减轻此威胁及其有效负载的影响:

  • 在Microsoft Defender防病毒上开启云提供的保护和自动样本提交。这些功能使用人工智能和机器学习快速识别和阻止新的未知威胁。
  • 在阻止模式下启用可能不需要的应用程序(PUA)保护,以自动隔离如广告软件之类的PUA。PUA阻止在下次签名更新或计算机重启后在终端客户端生效。
  • 开启网络保护以阻止与恶意域和IP地址的连接。

Microsoft Defender XDR检测

Microsoft Defender XDR客户可以参考以下适用的检测列表。Microsoft Defender XDR在终端、身份、电子邮件、应用程序之间协调检测、预防、调查和响应,以提供针对如此博客讨论的威胁的综合保护。

战术 观察到的活动 Microsoft Defender覆盖
初始访问 – 恶意Xcode项目 Microsoft Defender防病毒 – Trojan:MacOS/XCSSET.PB Microsoft Defender for Endpoint – Possible XCSSET activity
执行 – 恶意命令执行 – 恶意文件执行 – 恶意osascript执行 Microsoft Defender防病毒 – Behaviour:MacOS/SuspOsascriptExec.B – Behaviour:MacOS/SuspOsascriptExec.C – Trojan:MacOS/XCSSET.AB – Trojan:MacOS/XCSSET.BA – Trojan:MacOS/XCSSET.SE – Behavior:MacOS/SuspXcssetBehavior.AT – Trojan:MacOS/XCSSET.ST – Trojan:MacOS/XCSSET.SB – Trojan:MacOS/XCSSET.SC Microsoft Defender for Endpoint – Suspicious file dropped and launched – Suspicious script launched – Network connection by osascript – Suspicious process launched from a world-writable directory
持久化 – 隐藏的LaunchDaemon持久化 Microsoft Defender防病毒 – Behavior:MacOS/SuspHiddenPersistence.A1 Microsoft Defender for Endpoint – Suspicious Plist modifications – Suspicious launchctl tool activity
防御规避 – 可疑的混淆命令 Microsoft Defender for Endpoint – Suspicious file or information obfuscation detected
凭据访问 – 使用修改版的HackBrowserData项目 Microsoft Defender防病毒 – Trojan:MacOS/HackBrowserData.A
影响 – Xcode项目感染 Microsoft Defender防病毒 – Behavior:MacOS/XCSSET.A

注意:有关与旧版XCSSET变种相关的检测,请参阅我们2025年3月的博客文章。

威胁情报报告

Microsoft客户可以在Microsoft产品中使用以下报告,以获取有关威胁参与者、恶意活动以及此博客讨论的技术的最新信息。这些报告提供情报、保护信息以及建议的操作,以预防、缓解或响应在客户环境中发现的关联威胁。

Microsoft Defender XDR威胁分析

  • 工具配置文件:XCSSET

狩猎查询

Microsoft Defender XDR

Microsoft Defender XDR客户可以运行以下查询在其网络中找到相关活动:

构建Xcode项目时的可疑命令

在构建Xcode项目时搜索与此XCSSET相关的可疑命令。

1
2
3
4
DeviceProcessEvents 
| where ProcessCommandLine has_all("echo", "xxd -p -r", "| sh") or ProcessCommandLine has_all("echo", "base64 -d", "| sh")
| where InitiatingProcessFileName has_any ("sh", "bash", "zsh") 
| where InitiatingProcessCommandLine contains "/Developer/Xcode/DerivedData"

XCSSET信息窃取模块执行的可疑命令

搜索与从C2接收的数据解密逻辑相关的可疑命令。

1
2
DeviceProcessEvents
| where ProcessCommandLine has_any ("base64 --decode", "base64 -d") and ProcessCommandLine has_all ("openssl enc -d", "cut -c1-32")

可疑应用程序创建

搜索此XCSSET在Temp文件夹中创建的可疑应用程序。

1
2
DeviceFileEvents
| where FolderPath matches regex @"/tmp/[a-zA-Z]\.app"

Microsoft Sentinel

Microsoft Sentinel客户可以使用TI映射分析(一系列以"TI map"为前缀的分析)自动将此博客文章中提到的恶意域指示器与其工作区中的数据匹配。如果当前未部署TI Map分析,客户可以从Microsoft Sentinel内容中心安装威胁情报解决方案,以在其Sentinel工作区中部署分析规则。

以下是使用Sentinel高级安全信息模型(ASIM)函数在Microsoft第一方和第三方数据源中狩猎威胁的查询。ASIM还支持使用ARM模板或手动从GitHub将解析器部署到特定工作区。

使用ASIM检测网络IP和域危害指示器

以下查询检查ASIM网络会话解析器支持的数据源中的IP地址和域IOC:

1
2
3
4
5
6
7
8
//IP list and domain list- _Im_NetworkSession
let lookback = 30d;
let ioc_ip_addr = dynamic([]);
let ioc_domains = dynamic(["cdntor.ru", "checkcdn.ru", "cdcache.ru", "applecdn.ru", "flowcdn.ru", "elasticdns.ru", "rublenet.ru", "figmastars.ru", "bulksec.ru", "adobetrix.ru", "figmacat.ru", "digichat.ru", "diggimax.ru", "cdnroute.ru", "sigmanow.ru", "fixmates.ru", "mdscache.ru", "trinitysol.ru", "verifysign.ru", "digitalcdn.ru", "windsecure.ru", "adobecdn.ru"]);
_Im_NetworkSession(starttime=todatetime(ago(lookback)), endtime=now())
| where DstIpAddr in (ioc_ip_addr) or DstDomain has_any (ioc_domains)
| summarize imNWS_mintime=min(TimeGenerated), imNWS_maxtime=max(TimeGenerated),
  EventCount=count() by SrcIpAddr, DstIpAddr, DstDomain, Dvc, EventProduct, EventVendor

使用ASIM检测域和URL危害指示器

以下查询检查ASIM Web会话解析器支持的数据源中的域和URL IOC。

1
2
3
4
// file hash list - imFileEvent
// Domain list - _Im_WebSession
let ioc_domains = dynamic(["cdntor.ru", "checkcdn.ru", "cdcache.ru", "applecdn.ru", "flowcdn.ru", "elasticdns.ru", "rublenet.ru", "figmastars.ru", "bulksec.ru", "adobetrix.ru", "figmacat.ru", "digichat.ru", "diggimax.ru", "cdnroute.ru", "sigmanow.ru", "fixmates.ru", "mdscache.ru", "trinitysol.ru", "verifysign.ru", "digitalcdn.ru", "windsecure.ru", "adobecdn.ru"]);
_Im_WebSession (url_has_any = ioc_domains)

危害指示器

指示器 类型 描述
cdntor[.]ru C2服务器
checkcdn[.]ru C2服务器
cdcache[.]ru C2服务器
applecdn[.]ru C2服务器
flowcdn[.]ru C2服务器
elasticdns[.]ru C2服务器
rublenet[.]ru C2服务器
figmastars[.]ru C2服务器
bulksec[.]ru C2服务器
adobetrix[.]ru C2服务器
figmacat[.]ru C2服务器
digichat[.]ru C2服务器
diggimax[.]ru C2服务器
cdnroute[.]ru C2服务器
sigmanow[.]ru C2服务器
fixmates[.]ru C2服务器
mdscache[.]ru C2服务器
trinitysol[.]ru C2服务器
verifysign[.]ru C2服务器
digitalcdn[.]ru C2服务器
windsecure[.]ru C2服务器
adobecdn[.]ru C2服务器
12ea52c4089d100e679a2350f03e598b2f3feebfbbd2ed5631a2a7a20b07e826 SHA-256 /tmp/ancr(HackBrowserData Github项目的修改版本)
5a212c5ce1e0f41e721ce0940afb381b694a2e32a6d19c1d2210f703636362df SHA-256 /tmp/b(第四阶段有效负载)
0fbd0e1995472f308cf1ac8229a02c277035404426769fa50947a72c95ad7d31 SHA-256 jey(通过Git提交建立持久化)
f3bc158619b2aad17def966f0ac8dddc2107e4911a7c488d358d906f27ac2a2b SHA-256 /tmp/xmyyeqjx(基于LaunchDaemon的持久化)

参考

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计