JOKERSPY 初步研究报告

概述于 2023 年 6 月发现的 JOKERSPY,它部署了定制的和开源的 macOS 工具来攻击位于日本的加密货币交易所。

15 分钟阅读攻击模式, 活动
Initial research exposing JOKERSPY

主要发现

  • 这是对正在进行的主动入侵的初步通知,更多详细信息将在稍后提供
  • REF9134 利用定制的和开源的工具进行侦察和命令与控制
  • 此活动的目标包括位于日本的加密货币交易所

前言

这篇研究文章探讨了我们最近发现的入侵事件,我们称之为 REF9134,该事件涉及使用 sh.py 后门来部署 macOS Swiftbelt 枚举工具。sh.pyxcc 最近被 Bitdefender 称为 JOKERSPY

具体而言,本研究涵盖:

  • Elastic 安全实验室如何识别来自攻击者组的侦察活动
  • 攻击者使用 xcc 逃避检测、安装 sh.py 后门以及部署枚举工具的步骤

可能会在稍后发布对此攻击的更深入分析。

概述

在 2023 年 5 月下旬,一个在日本一家知名加密货币交易所拥有现有访问权限的攻击者,触发了我们一个检测到二进制文件 ( xcc ) 执行的诊断端点警报。xcc 未被苹果信任,攻击者使用原生 macOS 工具 codesign 进行自签名。虽然此检测本身不一定无害,但行业垂直领域以及我们在这些初始警报后观察到的其他活动引起了我们的注意,并促使我们更加关注。

在执行 xcc 之后,我们观察到威胁行为者试图通过创建自己的 TCC 数据库并尝试替换现有数据库来绕过 TCC 权限。在 6 月 1 日,观察到一个新的基于 Python 的工具与 xcc 在同一目录下执行,并被用来执行一个名为 Swiftbelt 的开源 macOS 后期利用枚举工具。

分析

REF9134 是对一家总部位于日本的大型加密货币服务提供商的入侵,该提供商专注于交易比特币、以太坊和其他常见加密货币的资产交易所。

xcc 二进制文件

xcc ( d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8 ) 是一个用 Swift 编写的自签名多架构二进制文件,用于评估当前系统权限。Elastic 安全实验室观察到的版本签名为 XProtectCheck-55554944f74096a836b73310bd55d97d1dff5cd4,并具有类似于公开已知且不受信任的有效负载的代码签名。

为了识别使用相同标识符签名的其他二进制文件,我们将 XProtectCheck-55554944f74096a836b73310bd55d97d1dff5cd4 转换为十六进制,并在 VirusTotal 上搜索,以识别另外 3 个样本 ( content:{5850726f74656374436865636b2d35353535343934346637343039366138333662373333313062643535643937643164666635636434} )。

每个样本都包含相同的核心功能,但结构上存在差异。这些差异可能表明开发了这些 xcc 变体,以绕过干扰执行的端点功能。

在创建 xcc 后不久,研究人员观察到威胁行为者将 /Users/Shared/tcc.db 复制到现有的 TCC 数据库 /Library/Application Support/com.apple.TCC/TCC.db 上。这可能使威胁能够避免对系统用户可见的 TCC 提示,同时滥用具有广泛文件写入权限的目录。

XCode 工件

在分析此二进制文件时,研究人员发现了两个独特的路径,/Users/joker/Developer/Xcode/DerivedData//Users/joker/Downloads/Spy/XProtectCheck/XProtectCheck/ ,这两个路径显得异常。使用 Xcode 编译代码的默认路径是 /Users/[用户名]/Developer/Xcode/DerivedData

滥用 TCC

这些内省权限由原生透明度、同意和控制 (TCC) 功能管理。研究人员确定 xcc 检查 FullDiskAccess 和 ScreenRecording 权限,以及检查屏幕当前是否已锁定以及当前进程是否是受信任的辅助功能客户端。

在我们的 Detonate 环境中成功执行后,将显示以下结果:

一旦自定义的 TCC 数据库放置在预期的位置,威胁行为者就会执行 xcc 二进制文件。

初始访问

xcc 二进制文件通过三个独立的进程通过 bash 执行:

  • /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
  • /Applications/iTerm.app/Contents/MacOS/iTerm2
  • /Applications/Visual Studio Code.app/Contents/MacOS/Electron.

虽然我们仍在调查并继续收集信息,但我们强烈认为,此恶意软件的初始访问是一个恶意或后门插件或第三方依赖项,它为威胁行为者提供了访问权限。这与 Bitdefender 的研究人员建立的联系相吻合,他们将 sh.py 后门版本中找到的硬编码域与一条关于感染了恶意依赖项的 macOS 二维码阅读器的推文联系起来。

已部署的加密库

5 月 31 日,研究人员观察到三个非原生 DyLibs 被部署到 /Users/shared/keybag/ 中,名为 libcrypto.1.0.0.dyliblibncursesw.5.dyliblibssl.1.0.0.dylib。在 MacOS 上,用于文件和钥匙串数据保护的密钥存储在 keybags 中,并且属于 iOS、iPadOS、watchOS 和 tvOS。目前,研究人员认为此暂存具有防御规避目的,并推测它们可能包含有用的漏洞。威胁行为者可能计划将这些漏洞引入其他已修补的系统或应用程序。

sh.py 后门

sh.py 是一个 Python 后门,用于部署和执行其他后期利用功能,例如 Swiftbelt .

该恶意软件从 ~/Public/Safari/sar.dat 加载其配置。该配置文件包含关键要素,例如命令与控制 (C2) URL、用于信标目的的睡眠计时器(默认值为 5 秒)以及分配给每个代理的唯一的九位数字标识符。

作为其定期信标的一部分,该恶意软件会收集并传输各种系统信息。发送的信息包括:

  • 主机名
  • 用户名
  • 域名
  • 当前目录
  • 可执行二进制文件的绝对路径
  • 操作系统版本
  • 是否为 64 位操作系统
  • 是否为 64 位进程
  • Python 版本

下表概述了后门可以处理的各种命令:

命令描述
sk停止后门的执行
l列出作为参数提供的路径的文件
c执行并返回 shell 命令的输出
cd更改目录并返回新路径
xs在当前上下文中执行作为参数给定的 Python 代码
xsi解码作为参数给定的 Base64 编码的 Python 代码,编译它,然后执行它
r从系统中删除文件或目录
e使用或不使用参数从系统执行文件
u将文件上传到受感染的系统
d从受感染的系统下载文件
g获取存储在配置文件中的当前恶意软件配置
w使用新值覆盖恶意软件的配置文件

Swiftbelt

6 月 1 日,受感染的系统注册了 MacOS.Hacktool.Swiftbelt 的签名警报,这是一种受 SeatBelt 启发的 MacOS 枚举功能,由红队成员 Cedric Owens 创建。与其他枚举方法不同,Swiftbelt 调用 Swift 代码以避免创建命令行工件。值得注意的是,xcc 变体也是使用 Swift 编写的。

签名警报指出,Swiftbelt 被写入到 /Users/shared/sb 目录,并使用 bash shell 解释器 sh 执行。研究人员观察到的完整命令行是 Users/Shared/sb /bin/sh -c /users/shared/sb \> /users/shared/sb.log 2\>&1 ,这表明威胁行为者将结果捕获到 sb.log 中,同时将错误重定向到 STDOUT。

钻石模型

Elastic Security 使用 钻石模型 来描述入侵的攻击者、能力、基础设施和受害者之间的高级关系。虽然钻石模型最常用于单个入侵,并利用活动线程(第 8 节)作为创建事件之间关系的方式,但以攻击者为中心(第 7.1.4 节)的方法允许创建一个,尽管杂乱的,单一钻石模型。

观察到的策略和技术

MITRE ATT&CK 策略

策略代表技术或子技术背后的原因。它是攻击者的战术目标:执行操作的原因。以下是 Elastic Security Labs 在此活动中观察到的策略

MITRE ATT&CK 技术/子技术

技术和子技术代表攻击者如何通过执行操作来实现战术目标。以下是 Elastic Security Labs 在此活动中观察到的技术

检测逻辑

YARA

Elastic Security 创建了 YARA 规则来识别此活动。以下是识别 JOKERSPY 后门和 SwiftBelt 工具的 YARA 规则。

rule Macos_Hacktool_JokerSpy {
    meta:
        author = "Elastic Security"
        creation_date = "2023-06-19"
        last_modified = "2023-06-19"
        os = "MacOS"
        arch = "x86"
        category_type = "Hacktool"
        family = "JokerSpy"
        threat_name = "Macos.Hacktool.JokerSpy"
        reference_sample = "d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8"
        license = "Elastic License v2"

    strings:
        $str1 = "ScreenRecording: NO" fullword
        $str2 = "Accessibility: NO" fullword
        $str3 = "Accessibility: YES" fullword
        $str4 = "eck13XProtectCheck"
        $str5 = "Accessibility: NO" fullword
        $str6 = "kMDItemDisplayName = *TCC.db" fullword
    condition:
        5 of them
}
rule MacOS_Hacktool_Swiftbelt {
    meta:
        author = "Elastic Security"
        creation_date = "2021-10-12"
        last_modified = "2021-10-25"
        threat_name = "MacOS.Hacktool.Swiftbelt"
        reference_sample = "452c832a17436f61ad5f32ee1c97db05575160105ed1dcd0d3c6db9fb5a9aea1"
        os = "macos"
        arch_context = "x86"
        license = "Elastic License v2"

    strings:
        $dbg1 = "SwiftBelt/Sources/SwiftBelt"
        $dbg2 = "[-] Firefox places.sqlite database not found for user"
        $dbg3 = "[-] No security products found"
        $dbg4 = "SSH/AWS/gcloud Credentials Search:"
        $dbg5 = "[-] Could not open the Slack Cookies database"
        $sec1 = "[+] Malwarebytes A/V found on this host"
        $sec2 = "[+] Cisco AMP for endpoints found"
        $sec3 = "[+] SentinelOne agent running"
        $sec4 = "[+] Crowdstrike Falcon agent found"
        $sec5 = "[+] FireEye HX agent installed"
        $sec6 = "[+] Little snitch firewall found"
        $sec7 = "[+] ESET A/V installed"
        $sec8 = "[+] Carbon Black OSX Sensor installed"
        $sec9 = "/Library/Little Snitch"
        $sec10 = "/Library/FireEye/xagt"
        $sec11 = "/Library/CS/falcond"
        $sec12 = "/Library/Logs/PaloAltoNetworks/GlobalProtect"
        $sec13 = "/Library/Application Support/Malwarebytes"
        $sec14 = "/usr/local/bin/osqueryi"
        $sec15 = "/Library/Sophos Anti-Virus"
        $sec16 = "/Library/Objective-See/Lulu"
        $sec17 = "com.eset.remoteadministrator.agent"
        $sec18 = "/Applications/CarbonBlack/CbOsxSensorService"
        $sec19 = "/Applications/BlockBlock Helper.app"
        $sec20 = "/Applications/KextViewr.app"
    condition:
        6 of them
}

参考

以下内容在上述研究中被引用

观察

以下是在此研究中讨论的可观察对象。

可观察对象类型名称参考
app.influmarket[.]org域名不适用sh.py 域名
d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8SHA-256/Users/Shared/xccMacos.Hacktool.JokerSpy
8ca86f78f0c73a46f31be366538423ea0ec58089f3880e041543d08ce11fa626SHA-256/Users/Shared/sbMacOS.Hacktool.Swiftbelt
aa951c053baf011d08f3a60a10c1d09bbac32f332413db5b38b8737558a08dc1SHA-256/Users/Shared/sh.pysh.py 脚本