初步研究揭露 JOKERSPY

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

阅读时间:15 分钟攻击模式活动
揭露 JOKERSPY 的初步研究

关键要点

  • 这是主动入侵的初步通知,后续将提供更多详细信息
  • REF9134 利用定制和开源工具进行侦察和指挥控制
  • 此次活动的目标包括日本的一家加密货币交易所

前言

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

具体来说,本研究涵盖:

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

对这次袭击的更深入分析可能会在稍后发布。

Overview

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

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

分析

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

xcc 二进制文件

xcc ( d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8 ) 是一个用 Swift 编写的自签名多架构二进制文件,用于评估当前系统权限。 Elastic Security Labs 观察到的版本签名为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
  • /应用程序/Visual Studio Code.app/Contents/MacOS/Electron。

虽然我们仍在调查并继续收集信息,但我们坚信,该恶意软件的初始访问是一个恶意或后门插件或第三方依赖项,为威胁行为者提供了访问权限。 这与Bitdefender研究人员建立的联系一致,他们将sh.py后门版本中发现的硬编码域与一条关于受感染的 macOS QR 码阅读器的推文相关联,该阅读器被发现具有恶意依赖项。

已部署的加密库

5 月 31 日,研究人员发现部署到 /Users/shared/keybag/ 的 三个非本地 DyLib 分别名为 libcrypto.1.0.0.dylib libncursesw.5.dylib libssl.1.0.0.dylib 。在 MacOS 上,文件和钥匙串数据保护的密钥存储在密钥包中,并且与 iOS、iPadOS、watchOS 和 tvOS 相关。 目前,研究人员提出,此阶段旨在逃避防御,并推测它们可能包含有用的漏洞。 威胁行为者可能计划将这些漏洞引入已修补的系统或应用程序。

sh.py 后门

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

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

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

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

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

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

SWIFTBELT

6 月 1 日,受感染系统注册了MacOS.Hacktool.Swiftbelt的签名警报,这是一项受SeatBelt启发、由红队成员 Cedric Owens 创建的 MacOS 枚举功能。 与其他枚举方法不同,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 安全实验室在此次活动中观察到的策略:

MITRE ATT&CK Techniques / Sub techniques

技术和子技术代表对手如何通过执行某个动作来实现战术目标。 以下是 Elastic 安全实验室在此次活动中观察到的技术:

检测逻辑

雅拉

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
}

参考资料

上述研究参考了以下内容:

观察结果

本研究讨论了以下可观察的结果。

Observable类型名称参考
app.influmarket[.]org不适用sh.py域名
d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8SHA-256/用户/共享/xccMacos.Hacktool.JokerSpy
8ca86f78f0c73a46f31be366538423ea0ec58089f3880e041543d08ce11fa626SHA-256/用户/共享/sbMacOS.Hacktool.Swiftbelt
aa951c053baf011d08f3a60a10c1d09bbac32f332413db5b38b8737558a08dc1SHA-256/用户/共享/sh.pysh.py 脚本