2025年6月11日,Huntress收到合作伙伴的联系,称最终用户下载了疑似恶意的Zoom扩展程序。安装Huntress EDR代理后,入侵的深度立即显现出来。经过一番分析,发现受害者在几周前就收到了用于获取访问权限的诱饵。
这篇文章旨在提供入侵从开始到结束的详细分析,包括对威胁行为者使用的几种新型恶意软件的全面分析。
我们高度确信,此次入侵是由朝鲜 (DPRK) APT 子组织实施的,该子组织被追踪为 TA444,又名 BlueNoroff、Sapphire Sleet、COPERNICIUM、STARDUST CHOLLIMA 或 CageyChameleon,这是一个由国家支持的威胁行为者,以针对加密货币而闻名,其活动至少可以追溯到 2017 年。
1:攻击链可视化
初始访问
设置:
一家加密货币基金会的一名员工在其 Telegram 上收到了一条来自外部联系人的消息。该消息请求安排与该员工的通话时间,攻击者发送了一个 Calendly 链接来安排会议时间。该 Calendly 链接原本是 Google Meet 活动的链接,但点击后,该 URL 会将最终用户重定向到由威胁行为者控制的虚假 Zoom 域名。
图 2:以 Google Meeting 为幌子发送给员工的 .ics 会议邀请文件
几周后,当这名员工加入Zoom群组会议时,会议中包含了公司内部知名高层领导以及外部联系人的多个深度伪造视频。会议期间,这名员工无法使用麦克风,深度伪造视频提示他们需要下载一个Zoom扩展程序。
通过 Telegram 发送给他们的“Zoom 扩展程序”链接是hxxps[://]support[.]us05web-zoom[.]biz/troubleshoot-issue-727318 。下载的文件是一个名为zoom_sdk_support.scpt的 AppleScript(苹果内置脚本语言)。
图 3:发送给受害者的初始有效载荷 - zoom_sdk_support.scpt
这段 AppleScript 首先会打开一个合法的 Zoom SDK 网页,但在超过 10,500 行空白行之后,它会从恶意网站https[://]support[.]us05web-zoom[.]biz下载有效载荷,并在下载完成后运行脚本。虽然我们无法从入侵的第二阶段恢复数据,但我们在 VirusTotal 上找到了一个版本,可以很好地洞察接下来发生的事情。
该脚本首先禁用 Bash 历史记录,然后检查是否安装了 Rosetta 2(该软件允许 Apple Silicon Mac 运行 x86_64 二进制文件)。如果没有,它会静默安装,以确保 x86_64 负载能够运行。然后,它会创建一个名为.pwd的文件(由于文件名前面带有句点,因此用户无法查看),并将负载从恶意的伪造 Zoom 页面下载到/tmp/icloud_helper。
图 4:禁用日志记录,安装 Rosetta 2,并下载二进制文件
接下来,它使用cur1-request用户代理执行另一个 curl 请求。这在之前的 BlueNoroff 入侵事件中也曾出现过,例如Kasperksy 在 2022 年报道的那次。遗憾的是,在分析时,这个有效载荷也尚未激活。
图 5:打印提取下载有效载荷的“进度”
然后尝试获取用户的密码并使用sudo进行验证。系统会一直执行此操作,直到输入有效的密码为止。
图 6:尝试验证用户密码
最后,它会删除shell历史记录,因此用户不知道运行了什么。在调查过程中,我们注意到这些历史记录文件在攻击发生时已被修改。
图 7:删除 shell 历史记录的 bash 脚本
技术分析
调查结束后,我们从受害主机中恢复了 8 个不同的恶意二进制文件。本节将介绍其中一些二进制文件的功能。以下是每个二进制文件的具体功能:
-
Telegram 2 :用 Nim 编写的持久二进制文件,负责启动主要后门。
-
Root Troy V4(远程):功能齐全的后门,用 Go 编写,用于下载其他有效载荷并运行它们。
-
InjectWithDyld (a):一个用 C++ 编写的二进制加载器,由 Root Troy V4 下载。它将解密另外两个有效载荷。
-
基础应用程序:注入的良性 Swift 应用程序。
-
有效载荷:用 Nim 编写的不同植入物,具有命令执行能力。
-
XScreen(keyboardd):用 Objective-C 编写的键盘记录器,能够监控击键、剪贴板和屏幕。
-
CryptoBot(airmond):一个用 Go 编写的信息窃取程序,旨在从主机收集与加密货币相关的文件。
-
NetChk:一个几乎为空的二进制文件,它将永远生成随机数。
除使用 Nim 编写的植入程序外,大多数植入程序都包含构建工件,其中显示了编译二进制文件的人员的用户名。共有 4 个角色负责不同的工具:
图 8:负责编译某些工具的攻击者机器的用户名
持久植入:Telegram 2
负责运行所有其他组件的核心植入程序名为Telegram 2,由 Nim 编写。它驻留在/Library/LaunchDaemons/com.telegram2.update.agent.plist中,并在/Library/Application Support/Frameworks/Telegram 2中运行一个二进制文件。该二进制文件使用标识符root_startup_loader_arm64进行临时签名。
Telegram 2被用作持久化机制,每小时启动一次,其plist如下:
图9:com.telegram2.update.agent LaunchDaemon
配置
执行后,该二进制文件将在 /private/var/tmp/cfg 中创建一个配置文件。遗憾的是,我们无法从受害计算机中恢复此文件。
功能
这个二进制文件非常小,只有几个功能:
-
poEchoCmd:运行 echo 命令(测试)
-
poEvalCommand:使用 /bin/bash 运行命令
-
poInteractive:生成交互式 shell
-
poDaemon:初始化持久性
后门:Root Troy V4(远程)
这个在 /Library/WebServer/bin/remoted 中运行的二进制文件是一个用 Go 编写的功能齐全的后门。构建文件显示,它实际上名为“Root Troy V4”或“RTV”。
图 10:构建工件显示用户“dominic”和项目结构
我们发现该二进制文件的主要用途是执行 AppleScript 有效载荷,以下载并执行另一个植入程序(下一节将介绍)。从客户入职到主机被隔离,此命令运行了 6 次。
图 11:远程卷曲附加植入物
配置
该二进制文件将相关信息(例如其配置、有效负载版本和启动命令)存储在位于/Library/Google/Cache/ 的目录中。配置文件 ( .cfg ) 使用二进制文件中的 RC4 密钥 ( 3DD226D0B700F33974F409142DEFB62A8CD172AE5F2EB9BEB7F5750EB1702E2A ) 进行加密。该文件包含 C2 信息以及用户 ID(此处已删除)。
图12:配置文件的内容
还有一个使用另一个 RC4 密钥(C4DB903322D17C8CBF1D1DB55124854C0B070D6ECE54162B6A4D06DF24C572DF )加密的版本文件( .version ) 。该文件包含稍后使用的两个 Payload 的版本信息:{"cbot":"1.0.1","rt":"4.0.1"}。
.startup文件包含用户登录时应运行的命令。它将开始运行键盘记录二进制文件和.version文件中包含的二进制文件之一:
图13:.startup脚本文件的内容
主要执行
当main运行时,它首先创建用于存储配置文件的目录:
图 14:创建配置目录
然后,它会尝试从二进制文件内部加载 C2 信息,我们在上一节中已经介绍过。如果加载失败,无论出于何种原因,它们都会终止当前进程,删除文件并退出。
图 15:如果配置提取失败则自行删除
在检查配置无误,并且没有其他实例正在使用 PID 文件运行后,它将运行两个新线程:execStartup函数(用于运行前面详述的脚本)和logoutMonitor 函数(用于监视用户是否注销)。如果注销成功,它将再次触发execStartup 函数。
图 16:运行脚本并监视注销的新线程
最后,它进入一个无限循环,从系统中收集/Volumes以及正在运行的进程列表。这些信息会使用sendRequest函数定期发送到 C2 服务器。
功能:远程代码执行
操作员可以使用此恶意软件以多种不同的方式在主机上执行命令:
-
execScript :使用osascript -e运行远程 AppleScript 有效负载。
-
execShell:使用 /bin/zsh -sc 运行 shell 命令
-
execShellDetached:在后台使用 /bin/zsh -sc 运行 shell 命令
功能:睡眠期间执行
为了避免用户可能观察到正在执行的代码,命令会被包装在一个checkSleep函数中,该函数会查询显示器的状态。如果显示器处于睡眠状态,则执行命令;否则,命令会被放入队列中等待稍后执行。为此,它们使用system_profiler SPDisplaysDataType并查找Online字段。
图 17:查询system_profiler SPDisplaysDataType 的示例输出
C2通信
对 C2 的请求被发送到http://$DOMAIN/update ,其中包含使用库github.com/shirou/gopsutil/中的host.PlatformInformationWithContex t函数收集的主机信息。它还提供启动时间以及当前正在运行的其他植入程序的版本。
加载器:InjectWithDyld(一)
如前所述,名为a的二进制文件是通过 AppleScript 有效载荷远程下载的。该下载器中的密码是该二进制文件正常工作所必需的,因为它用于派生用于有效载荷解密的 AES 密钥。快速回顾一下威胁参与者对该二进制文件的操作:
图 18:远程运行脚本来安装并运行
该二进制文件主要执行两项操作:首先,它接受另一个二进制文件和密码作为参数,并解密嵌入的有效载荷。其次,它仅接受参数 --d,并将当前目录中的所有文件用零覆盖,以作为反取证措施。攻击者首先使用参数./cloudkit和密码gift123$%^运行有效载荷。
密钥派生函数
为了解密有效负载和基本应用程序,提供的密码与基于密码的密钥派生函数 (PBKDF) 一起使用来派生 AES 密钥。
图 19:对提供给密钥偏差函数的密码进行反编译
盐被添加到实际有效载荷的前面,对于 baseApp 来说,它是 base64 解码的GJM0bP36hbomz9Gw。
图 20:在有效载荷 base64 前添加盐
有效载荷解密
密钥生成后,该样本使用修改版的 AES-CFB 解密两个 Payload。解密后,样本将 Base64 解码后的内容(跳过盐字节)和密钥传递给AesEncrypt函数。
图 21:对有效载荷进行 base64 解码并跳过前 16 个字节(盐)的反编译
它们遍历解码后的 base64 并在每个块上调用 AesTrans,使用 AES 加密缓冲区,然后将此输出与原始输出进行异或运算,从而得到解密的内容。
图 22:AES-CFB 实现
图23:解密例程的反编译
这发生在两个 base64 blob 中,它们稍后将在进程注入部分中使用。
进程注入
到目前为止,这款恶意软件最有趣的部分在于它如何部署恶意负载。任何熟悉 Windows 的人都非常熟悉进程注入技术,即一个进程会将代码写入另一个进程的内存中。但是,从历史上看,进程注入在 macOS 上并不常见,因为绕过 Apple 的内存保护机制需要满足大量的先决条件。
此样本利用了 Apple 安全模型中的一些边缘情况来实现注入!想要实现此目的的二进制文件需要调试工具授权,这允许它们附加到其他进程,更重要的是获取任务端口。此二进制文件以及此次入侵中使用的其他几个二进制文件都具有以下特征:
-
com.apple.security.cs.debugger
-
com.apple.security.get-task-allow
解密有效载荷后,恶意软件会检查生成的 macho 文件的魔法字节。如果魔法字节为0xbebafeca,则说明它是一个 FAT 可执行文件(意味着 ARM 和 x86_64 二进制文件粘合在一起),因此它必须遍历 FAT 头条目,直到找到 x86_64 macho 头。否则,如果魔法字节为0xfeedfacf,则说明它只是一个 x86_64 macho,无需执行此操作,因此它可以直接调用注入例程。ARM 可执行文件也会发生同样的过程,但它会查找CPU_TYPE_ARM64的CPU 类型。
图24:调用进程注入代码的设置
然后通过调用InjectAMD64开始注入过程,如下图所示:
图 25:使用posix_spawnattrs反编译InjectAMD64函数
为了启动注入过程,恶意软件会创建一个新进程,并使用之前设置的属性。然后在该进程上调用 task_for_pid 函数,该函数将返回该进程的 Mach 端口。访问此端口后,恶意软件可以利用mach_vm API 进行任意内存操作和任务管理。
图 26:在牺牲进程上获取 Mach 端口的反编译
然后,攻击者使用task_threads获取与该进程关联的线程列表。如果成功,他们就开始解析解密后有效载荷的 mach-o 头。这个过程与他们决定是否调用 FAT 二进制文件的注入例程非常相似。攻击者这样做是为了找出有效载荷二进制文件中的段总数。
图 27:解析有效载荷 mach-o 以准备复制
此时,恶意软件开始将有效载荷二进制文件中的段复制到牺牲进程中,并修改内存以允许执行。以下反编译代码显示了页面权限如何被修改为读写,如_mac_vm_protect函数所示,其中new_protection变量设置为 3 ( VM_PROT_READ | VM_PROT_WRITE )。
图 28:每个段的内存保护修改的反编译
在进行上述内存修改之后,睡眠进程将通过注入的有效载荷恢复,如下图所示:
图 29:恢复休眠进程的反编译以执行注入的有效载荷
有效载荷清理
部署有效载荷后,攻击者使用--d标志运行二进制文件,该标志调用ZeroWrite函数。这将遍历当前目录中的所有文件,并在所有包含的函数中写入空字节。
解密的有效载荷:Nim 植入程序(木马 1)和基础应用程序
正如所提到的,上一步解密了两个二进制文件。
Nim 植入程序(木马 1)
Nim 植入程序主要用于与受感染主机交互发送命令。其主文件名为trojan1.nim,允许操作员异步发出命令并接收响应。为了与 C2 通信,它使用 websockets wss[:]//firstfromsep[.]online/client。
该二进制文件的分析仍在进行中,完成后将会更新帖子。
基础应用
基础应用程序是作者dominic用 Swift 编写的相对简单的二进制文件。
图 30:从基本可执行文件构建工件
主要方法只是循环运行一个简单的任务(每 3.37 秒)。
图 31:基础应用程序的 Main 方法
该任务只是将字符串Current: YYYY-MM-DD HH:MM:SS打印到 /dev/null。这可能只是为了保持二进制文件处于活动状态,以便在将来需要时将其注入。
图 32:main 方法调用的闭包
键盘记录器:XScreen(keyboardd)
该二进制文件用于键盘记录、屏幕录制和剪贴板检索。它使用 Objective-C 编写,由名为pooh 的用户编译。
图 33:从keyboardd二进制文件构建工件
要开始执行,它会首先检查文件/Users/Shared/._cfg是否存在,该文件包含 C2 URL。它默认使用服务器https[:]//metamask[.]awaitingfor[.]site/update,但在本例中,它与在恢复的._cfg文件中找到的 URL 相同。
图34:C2解析的反编译
它接受 3 个潜在的命令行参数:
-
-u:使用自定义 C2 域
-
-c:两次屏幕截图之间休眠多长时间
-
-p:是否应监视剪贴板
在这次入侵的情况下,远程二进制文件使用 -p 参数 反复调用它。
该二进制文件的整体工作方式是启动3个异步循环,每个循环对应一种类型的数据收集。第一个循环会将键盘记录缓冲区的内容发送到C2服务器:
图35:异步循环1的反编译
第二个循环调用MonitorClipboared (原文如此)函数:
图36:MonitorClipboared回调
最后一个负责下一节讨论的屏幕收集功能。
键盘记录功能
实际的键盘记录功能是使用 Core Graphics 库的EventTapCreate API 实现的。此 API 接收一个回调函数,该函数会在每次注册按键事件时执行。
图 37:键盘记录功能循环
回调函数首先会追踪每次按键时与哪个应用程序交互。它通过查询frontmostApplication并获取该应用程序名称的 bundle identifier 来实现这一点。如果与上次调用不同,它会将应用程序名称和时间记录到键盘记录缓冲区中:
图 38:回调函数检查正在使用哪个活动窗口
之后,他们会检查键码是否为可打印字符。如果是特殊字符(例如控制字符、命令字符等),则会将其转换为文本形式,然后将其附加到键盘记录缓冲区中:
图 39:将不可打印字符转换为文本表示
图40:转换输出
屏幕截图功能
为了捕获屏幕,恶意软件会进入一个无限循环,使用CGGetActiveDsiplayList检查活动显示器的数量。如果至少有一个活动显示器,它将开始捕获数据;如果有多于一个的显示器,它将遍历所有可用屏幕,以捕获每一个屏幕。
图41:屏幕录制驱动函数反编译
CaptureAndSend函数负责实际收集数据。它使用CGDisplayCreateImage API 获取显示屏图像,然后将该内容保存到位于/private/tmp/google_cache.db的文件中。如果成功,它会将图像转换为 base64 编码,并在图像后附加字母“I”,以便 C2 能够识别哪些数据是图像。最后,它使用相同的 SendData 函数将所有内容发送到 C2 服务器。
在我们的调查过程中,我们没有发现文件保存位置存储的任何数据。
图42:CaptureAndSend函数的反编译
剪贴板功能
为了监视剪贴板,攻击者只需抓取系统粘贴板,然后从该对象中提取文本内容。无限循环将监视剪贴板内容是否有变化,如果是,则将内容写入共享的键盘记录缓冲区。
图43:剪贴板监控代码的反编译
发送数据
为了将数据发送到 C2 服务器,他们创建一个字符串,其中包含 UUID、受害者的 uid、数据、用户名以及嵌入在二进制文件中的令牌:
图 44:向 C2 服务器发送数据
信息窃取者:CryptoBot(airmond)
airmond二进制文件是一款功能齐全的信息窃取程序,专注于加密货币盗窃。它使用 Go 语言编写,拥有大量构建工件,表明它是一个名为CryptoBot的项目,由用户chris编译。
图 45:来自airmond二进制文件的编译工件
配置
与此事件中的其他恶意软件非常相似,CryptoBot 利用其当前目录中的多个文件
-
/Library/AirPlay/.pid:用于防止多个实例的 PID 文件。
-
/Library/AirPlay/.cache:用于存储收集的加密数据的缓存。
-
/Library/AirPlay/.CFUserTextEncoding:用户和密钥(user|key)
-
/Library/Google/Cache/.cfg:与“Root Troy V4”二进制文件共享配置。
-
/Library/Google/Cache/.version:与“Root Troy V4”二进制文件共享版本信息。
AirPlay 目录中的配置文件使用 AES-CFB 加密,IV 为 0。密钥是静态的,嵌入在二进制文件f6102a492570dee84bbc9ebd8bd7bfab4e442eae3b416b1a中。创建前面提到的文件需要用到几个初始化函数:
-
main.initializeCryptoCache
-
main.initializeUserInfo
-
main.initializeVersion
-
main.writePid
还有另一组函数可以在运行时加载这些配置文件:
-
main.loadUserInfo
-
main.loadVersions
-
main.writeCryptoCache
-
main.readCryptoCache
加密货币窃取者
该二进制文件的主要目的是从主机中索引与加密货币相关的信息。正如窃取程序的典型做法一样,它们会遍历已安装的浏览器扩展程序,查找钱包插件。如果找到,它会调用一系列辅助函数,用于从这些扩展程序中提取敏感信息。这些辅助函数都包含在加密机器人模块中:
-
crypto-bot/wallet.ExtractAddressInfosFromBinance
-
crypto-bot/wallet.ExtractAddressInfosFromBitget
-
crypto-bot/wallet.ExtractAddressInfosFromCoin
-
crypto-bot/wallet.ExtractAddressInfosFromKeplr
-
crypto-bot/wallet.ExtractAddressInfosFromLeather
-
crypto-bot/wallet.ExtractAddressInfosFromMetamask
-
crypto-bot/wallet.ExtractAddressInfosFromNabox
-
crypto-bot/wallet.ExtractAddressInfosFromOKX
-
crypto-bot/wallet.ExtractAddressInfosFromPhantom
-
crypto-bot/wallet.ExtractAddressInfosFromPhantom.Println.func1
-
crypto-bot/wallet.ExtractAddressInfosFromRabby
-
crypto-bot/wallet.ExtractAddressInfosFromRainbow
-
crypto-bot/wallet.ExtractAddressInfosFromRonin
-
crypto-bot/wallet.ExtractAddressInfosFromSafepal
-
crypto-bot/wallet.ExtractAddressInfosFromSender
-
crypto-bot/wallet.ExtractAddressInfosFromStation
-
crypto-bot/wallet.ExtractAddressInfosFromSubwallet
-
crypto-bot/wallet.ExtractAddressInfosFromSui
-
crypto-bot/wallet.ExtractAddressInfosFromTon
-
crypto-bot/wallet.ExtractAddressInfosFromTron
-
crypto-bot/wallet.ExtractAddressInfosFromTrust
-
crypto-bot/wallet.ExtractAddressInfosFromUnisat
-
crypto-bot/wallet.ExtractAddressInfosFromXverse
C2交互
该二进制文件通过 HTTP 与productnews[.]online 上的 C2 进行交互。请求使用与加密配置文件相同的密钥和算法进行加密。如有必要,还可以选择发送未加密的数据包:
-
main.postEncryptedData
-
main.postToServer
识别并缓解会议应用程序社会工程
远程工作者,尤其是在高风险工作领域的工作者,往往是像TA444这样的组织的理想目标。培训员工识别以远程会议软件相关的社会工程学为开端的常见攻击至关重要:
-
警惕日历邀请,这些邀请来自您一段时间没有联系过的个人,或者通常不一起开会的个人群体,这些邀请带有紧急标记。
-
用户应立即警惕突然的、非自然的变化,例如最后一刻切换会议平台、安装“扩展”或“插件”的请求、不受欢迎的 TLD 名称(例如 .biz、.xyz、.site、.online 或 .click)以及启用远程访问或类似控制的请求。
-
建议员工在出现任何这些指标或甚至不确定性时立即断开会议软件,并将此情况报告给您的安全团队、人力资源部和其他团队。
结论
从历史上看,macOS 的目标规模一直小于 Windows。过去二十年,“Mac 不会感染病毒”这句谚语在业界盛行,macOS 也常常被视为“无需保护”。正因如此,macOS 很容易与更具针对性的攻击相吻合。过去几年,我们发现 macOS 已成为威胁行为者更大的目标,尤其是在那些技术高度成熟、由国家支持的攻击者眼中。
在本例中,我们发现 BlueNoroff 使用了 Mac 特有的技术进行针对性极强的攻击。他们利用了 macOS 独有的 AppleScript、多种植入程序、键盘记录器和屏幕截图。此外,他们还会捕获剪贴板内容、清理会话历史记录,并查找大量的加密钱包,这表明他们专注于 macOS。
随着这些攻击及其发生频率的不断上升,保护您的 Mac 将变得愈发重要。正如我们在此看到的,攻击者不仅使用了常见的跨平台攻击技术,还利用了 Mac 特有的二进制文件、API 和功能。
IOCs
Name |
SHA256 |
Notes |
a |
4cd5df82e1d4f93361e71624730fbd1dd2f8ccaec7fc7cbdfa87497fb5cb438c |
C++ Dropper |
remoted |
ad01beb19f5b8c7155ee5415781761d4c7d85a31bb90b618c3f5d9f737f2d320 |
Go Backdoor |
airmond |
ad21af758af28b7675c55e64bf5a9b3318f286e4963ff72470a311c2e18f42ff |
Go Infostealer |
keyboardd |
432c720a9ada40785d77cd7e5798de8d43793f6da31c5e7b3b22ee0a451bb249 |
Obj-C keylogger / screenrecorder |
zoom_sdk_support.scpt |
1ddef717bf82e61bf79b24570ab68bf899f420a62ebd4715c2ae0c036da5ce05 |
Initial access AppleScript payload |
Telegram 2 |
14e9bb6df4906691fc7754cf7906c3470a54475c663bd2514446afad41fa1527 |
Persistent Nim implant |
cloudkit |
2e30c9e3f0324011eb983eef31d82a1ca2d487bbd13a6d32d9e11cb89392af23d |
Sacrificial binary used for process injection |
netchk |
469fd8a280e89a6edd0d704d0be4c7e0e0d8d753e314e9ce205d7006b573865f |
C Injection candidate |
payload |
080a52b99d997e1ac60bd096a626b4d7c9253f0c7b7c4fc8523c9d47a71122af |
Nim Implant |
baseApp |
2e30c9e3f0324011eb983eef31d82a1ca2d47bbd13a6d32d9e11cb89392af23d |
Swift Injection Candidate |
Infrastructure
IP |
Notes |
hxxps[://]safeupload[.]online |
|
hxxps[://]metamask[.]awaitingfor[.]site/update |
C2 server for keylogger |
hxxps[://]support[.]us05web-zoom[.]biz/842799/check |
Initial url sent to victim via Telegram, resulting in download of zoom_sdk_support.scpt |
productnews[.]online |
C2 for CryptoBot |
firstfromsep[.]online |
C2 for a’s Nim Payload |
safefor[.]xyz |
C2 for RTV4 |
readysafe[.]xyz |
C2 for RTV4 |
原文始发于微信公众号(Ots安全):忧郁(Noroff):朝鲜复杂的 Web3 入侵
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论