未知APT组织PlushDaemon针对韩国VPN提供商发起供应链攻击

ESET 研究人员提供了有关之前未披露的与中国结盟的 APT 组织的详细信息,我们将其追踪为 PlushDaemon,以及它的一项网络间谍行动:2023 年,一家韩国公司开发的 VPN 软件的供应链遭到入侵,攻击者用一个安装程序替换了合法的安装程序,该安装程序还部署了该组织的签名植入程序,我们将其命名为 SlowStepper - 一个功能丰富的后门,其工具包包含 30 多个组件。
概述
2024 年 5 月,我们注意到韩国用户从一家韩国公司开发的合法 VPN 软件 IPany(https://ipany.kr/;见图 1)的网站下载的 Windows NSIS 安装程序中检测到了恶意代码。经过进一步分析,我们发现安装程序中既部署了合法软件,又部署了我们称之为 SlowStepper 的后门。我们联系了 VPN 软件开发商,告知他们这一入侵行为,并将恶意安装程序从其网站上删除。
我们认为此次行动是 PlushDaemon 所为,该组织至少自 2019 年以来一直活跃于中国,并针对中国、台湾、香港、韩国、美国和新西兰的个人和实体开展间谍活动。PlushDaemon 使用我们追踪为 SlowStepper 的自定义后门,其主要初始访问技术是通过将流量重定向到攻击者控制的服务器来劫持合法更新。此外,我们还观察到该组织通过合法 Web 服务器中的漏洞获得访问权限。
图 1. IPany 网站上可下载恶意安装程序的页面
受害者似乎已从 URL https://ipany[.]kr/download/IPanyVPNsetup.zip手动下载了包含恶意 NSIS 安装程序的 ZIP 存档。我们在下载页面(如图 1 所示)上未发现任何可疑代码来生成有针对性的下载,例如通过地理围栏到特定的目标区域或 IP 范围;因此,我们认为使用 IPany VPN 的任何人都可能是有效目标。
通过 ESET 遥测,我们发现有数名用户试图在韩国一家半导体公司和一家未确定的软件开发公司的网络中安装木马软件。我们遥测中记录的最早的两个案例是 2023 年 11 月的一名日本受害者和 2023 年 12 月的一名中国受害者。
技术分析
如图 2 所示,当执行恶意IPanyVPNsetup.exe安装程序时,它会创建多个目录并部署合法文件和恶意文件。
图 2. 合法文件和恶意文件的部署
此外,安装程序还通过在 Run 键中添加名为IPanyVPN的条目(值为%PUBLIC%\Documents\WPSDocuments\WPSManager\svcghost.exe)来建立 SlowStepper 的持久性,以便恶意组件svcghost.exe (稍后由EncMgr.pkg中的加载程序提取和部署)在操作系统启动时启动。
安装程序加载的第一个恶意组件是AutoMsg.dll加载程序。图 3 说明了此组件执行过程中的主要步骤。
图 3. IPanyVPNSetup.exe 加载 AutoMsg.dll_时启动的加载链_
当IPanyVPNSetup.exe调用ExitProcess时,修补的字节将执行重定向到将EncMgr.pkg加载到内存中并执行的shellcode 。
EncMgr.pkg在%PUBLIC%\Documents中创建两个目录 - WPSDocuments和WPSManager,部署从自定义档案NetNative.pkg和FeatureFlag.pkg中提取组件开始。组件被拖放到磁盘上,并以新文件名移动到其他位置。顺序和采取的操作如下:
- 将文件从NetNative.pkg提取到:
a. %PUBLIC%\Documents\WPSDocuments\WPSManager\assist.dll,
b. %PUBLIC%\Documents\WPSDocuments\WPSManager\msvcr100.dll,
c. %PUBLIC%\Documents\WPSDocuments\WPSManager\PerfWatson.exe, and
d. %PUBLIC%\Documents\WPSDocuments\WPSManager\svcghost.exe.
- 删除NetNative.pkg。
- 将FeatureFlag.pkg移至C:\ProgramData\Microsoft Shared\Filters\SystemInfo\winlogin.gif。
- 将assist.dll移至C:\ProgramData\Microsoft Shared\Filters\SystemInfo\Winse.gif。
- 将文件从Winse.gif提取到%PUBLIC%\Documents\WPSDocuments\WPSManager\lregdll.dll。
- 将数据从BootstrapCache.pkg复制到%PUBLIC%\Documents\WPSDocuments\WPSManager\Qmea.dat。
它的最后操作是使用ShellExecute API执行svcghost.exe然后退出。
svcghost.exe组件会监控加载后门的PerfWatson.exe进程,确保后门始终处于运行状态。如果进程未运行,它会执行PerfWatson.exe(最初是 Visual Studio 中包含的合法命令行实用程序regcap.exe),攻击者会滥用该实用程序来侧载lregdll.dll。DLL的目的是从winlogin.gif文件加载 SlowStepper 后门。
在新的线程中,它会创建一个无名窗口,该窗口会忽略除WM_CLOSE、WM_QUERYENDSESSION和WM_ENDSESSION之外的所有消息。当收到这三个消息中的任何一个时,线程都会尝试根据当前进程的权限在 Windows 注册表中建立持久性;参见表 1。
表 1. 针对持久性的注册表项
需要 | 注册表项 | 入口 | 价值 |
---|---|---|---|
行政人员 | HKLM\软件\微软\Windows NT\CurrentVersion\Winlogon | 用户初始化 | svcghost.exe的当前路径。 |
用户 | HKCU\软件\微软\Windows NT\当前版本\Windows | 加载 |
SlowStepper 后门
SlowStepper 是一个用 C++ 开发的后门,其 C&C 通信代码大量使用了面向对象编程。虽然代码包含数百个函数,但根据后门代码,IPany VPN 软件供应链入侵中使用的特定变体似乎是 0.2.10 Lite 版本。所谓的“Lite”版本确实包含的功能少于其他以前和较新的版本。
我们所知的SlowStepper后门最老的版本是0.1.7,根据其PE时间戳编译于2019-01-31;最新版本是0.2.12,编译于2024-06-13,是该后门的完整版本。
完整版和精简版都使用了一系列用 Python 和 Go 编写的工具,包括大量收集数据的功能以及通过录制音频和视频进行监视的功能。这些工具存储在中国平台 GitCode 上托管的远程代码存储库中,位于 LetMeGo22 帐户下;在撰写本文时,该个人资料是私密的(图 4)。
图 4. GitCode 上的 LetMeGo22 帐户
C&C 通信
SlowStepper 在其配置中不携带 C&C IP 地址;相反,它会制作 DNS 查询来获取域7051.gsm.360safe[.]company 的TXT 记录。该查询被发送到三个合法的公共 DNS 服务器之一:
- 8.8.8.8 – Google 公共 DNS,
- 114.114.114.114 – 114dns.com,或
- 223.5.5.5 – 阿里巴巴公共 DNS。
我们获得了与该域名相关的四条记录:
- &%QT%#/zZDmb4ATTVIxwHXPLGrj0FAOV7q+P/sMG109ooj5YLnVZBs3R/eZcuQximtgLkf
- &%QT%#/zZDmb4ATTVIxwHXPLGrj0FAOV7q+P/sMG109ooj5YKQs3XiHSjM3f+h9ok9XfQ1AjoX+C4UXZsDLVqCDhvxyw==
- &%QT%#aT1sAjOFTcwzQ7hwc0iyfygP/ooo8pkIRyaNKWcqBz+QRGYBV/2v8HrVg28+aZXhfXvgDxS1vXAuhdcN2dEKxw==
- &%QT%#aT1sAjOFTcwzQ7hwc0iyfySJBEDM0z6na7BiogG0hDJqdKlUqkrb9ppOjg8epeQ6I6cUXWLKyZGZCkJwFyKD4Q==
查询中的数据格式如图 5 所示。代码检查 TXT 记录的前六个字节是否与&%QT%#匹配,如果匹配,则提取字符串的其余部分,该字符串是一个 base64 编码的 AES 加密 blob,其中包含 10 个 IP 地址数组,用作 C&C 服务器。用于解密的密钥是sQi9&*2Uhy3Fg7se,IV 是Qhsy&7y@bsG9st#g。
图 5. 获取恶意域名的 DNS TXT 记录
在解析解密数据时,代码可以提取至少四个数据标识符,如表 2 所示。
表 2. 后门代码处理的数据类型
数据标识符 | 数据大小 | 描述 |
---|---|---|
0x04 | 4 | 数据是 IP 地址。 |
0x05 | 6 | 数据是 IP 地址和端口号。 |
0x06 | 16 | 跳过接下来的 16 个字节数据。我们怀疑,考虑到数据的大小,它可能是 IPv6 地址。 |
0x00~0x03 <br>0x07~0xFF | 数据标识符值是数据大小的值。 | 跳过下一个(未知)数据字节。 |
选择其中一个 IP 地址后,SlowStepper 通过 TCP 连接到 C&C 服务器,开始其通信协议。如果经过多次尝试后仍无法与服务器建立连接,它会使用域st.360safe[.]company上的gethostbyname API获取映射到该域的 IP 地址,并使用获取的 IP 作为其后备 C&C 服务器。
一旦建立通信,SlowStepper 就可以处理表 3 中列出的命令。
表 3. SlowStepper 支持的基本命令
命令ID | 执行的操作 |
---|---|
0x32 | 从受感染的计算机收集以下信息并将其发送到服务器: <br>· CPU 的品牌(使用CPUID指令)、 <br>· 连接到计算机的 HDD 及其序列号、 <br>· 计算机名称、 <br>· 本地主机名、 <br>· 公共 IP 地址(通过查询多个服务)、 <br>· 正在运行的进程列表、 <br>· 已安装的应用程序列表、 <br>· 网络接口信息、 <br>· 有关计算机驱动器的其他信息(例如卷名和可用空间)、 <br>· 系统内存、 <br>· 当前用户名、 <br>· 使用的持久性类型、 <br>· 是否连接摄像头、 <br>· 是否连接麦克风、 <br>· 操作系统是否作为虚拟机运行、 <br>· 系统正常运行时间、 <br>· HTTP 代理配置、以及· 查询114.114.114.114:53 <br>的 DNS 服务器以解析两个合法域名cf.duba.net(金士顿)和f.360.cn (360 奇虎)的地址是失败还是成功。我们不清楚这些信息的用途。 |
0x38 | 从其工具包中执行 Python 模块;模块的输出和所有由模块创建的文件都将发送到服务器。该过程与 shell 模式中使用的过程非常相似。 |
0x39 | 删除指定文件。 |
0x3A | 此命令可以处理操作员在 SlowStepper 的 shell 模式下发送的其他命令,我们将在下面详细解释。或者,它也可以: · 通过cmd.exe <br>运行命令并将输出发送回服务器。 · 通过cmd.exe运行命令而不将输出发送到服务器。 |
0x3C | 通过删除其持久机制和文件来卸载 SlowStepper。 |
0x3F | 列出指定目录中的文件,并列出驱动器。 |
0x5A | 下载并执行指定文件。 |
SlowStepper 有一个相当不寻常的功能:开发人员在其通信协议之上实现了自定义 shell 或命令行界面。虽然后门以传统方式接受和处理命令,但0x3A命令会激活对操作员编写的命令的解释(表 4)。
表 4. shell 模式下支持的命令
命令 | 参数 | 描述 |
---|---|---|
光盘 | 目录的路径。 | 检查目录是否存在。 |
呼叫 | 模块名称和其他未知参数。 | 此功能可以执行两项任务: <br>· 从远程代码存储库下载模块并执行。该模块应该是一个控制台应用程序。 <br>· 将文件从受感染的机器发送给操作员。 |
调用 | 要执行的工具名称。 | _该命令在通过 SlowStepper 的 pycall shell 命令部分执行工具_中有详细解释。 |
重启 | 自己 | 通过重新运行主机进程并调用ExitProcess API 来重新启动 SlowStepper。当 SlowStepper 通过滥用 Winsock 命名空间提供程序的持久性技术在进程中运行时, <br>将返回消息NSP 模式不支持自行重启。但是,它不包含在 SlowStepper 的此变体中。 |
更新 | 不适用 | 从远程代码库下载模块,替换先前存在的版本。 |
配置 | 展示 | 显示ServerIP(C&C IP 地址)的值。 |
放 | 修改ServerIP的值。 <br>控制台向操作员建议: <br>如果要使配置立即生效,请输入命令“gconfig reload”。 | |
重新加载 | 重新加载配置。 | |
获取名称 | 返回 SlowStepper 当前正在运行的进程的名称。 | |
获得dll | 返回当前进程中的 SlowStepper DLL 的名称。 | |
获取进程ID | 返回 SlowStepper 当前正在运行的进程的进程 ID。 | |
得到 | 返回当前进程的远程桌面服务会话 ID。这表明 SlowStepper 可能还打算攻击运行 Windows Server 的计算机。 | |
获取密码 | 从远程代码库下载getcode.mod并使用rundll32.exe执行。该模块生成一个名为psf.bin的文件,其中包含收集的数据。 | |
命令 | 询问 | 创建有关指定文件或目录的完整信息报告。 |
删除 | 删除指定的文件、目录或目录中的所有文件。 | |
放 | 设置配置参数。 | |
终止 | 终止指定进程。 | |
取消 | 创建一个带有.delete扩展名的文件。 |
通过 SlowStepper 的 pycall shell 命令执行工具
图 6 说明了执行链,从操作员发出pycall命令开始,请求在受感染的机器上执行 Python 模块;这里以模块CollectInfo为例。
图6. pycall 命令__的执行流程
pycall命令从远程存储库下载包含 Python 解释器及其支持库的 ZIP 存档。下载三种可能的自定义发行版之一,如表 5 所示。
表 5. 定制 Python 发行版列表及其下载条件
健康)状况 | 存档名称 | 描述 |
---|---|---|
Windows操作系统是XP。 | 温克斯皮 | Python 3.4 |
所有必需的 Windows API 集(存根)DLL 和 Microsoft C 运行时均存在。 | 温皮诺 | Python 3.7 |
上述两个条件均不满足。 | win7py.org | Python 3.7;包括 Windows API 集(存根)DLL 和 Microsoft C 运行时库。 |
图 7 显示了包含 Python 发行版的解压档案的目录结构,仅列出了其中包含的恶意文件。
图 7. 定制的 Python 发行版和恶意文件的目录结构
SlowStepper 使用以下命令行运行 Python 解释器:
%PUBLIC%\Documents\WPSDocuments\WPSManager\Python\Pythonw.exe -m runas <模块名称>
名为runas 的模块是一个自定义 Python 脚本(图 8),它加载另一个名为help 的自定义 Python 模块,并从中使用名为run 的函数解密模块并执行它。
图8. runas.py的代码
表 6 列出了我们在远程存储库可用期间恢复的模块。
表 6. Python 模块及其用途列表
磁盘上的文件名 | 原始模块名称 | 目的 |
---|---|---|
900150983cd24fb0d6963f7d28e17f72 | 美国广播公司 | 打印hello world的测试模块。 |
ef15fd2f45e6bb5c e57587895ba64f93 | 浏览器 | 从网络浏览器收集各种数据:Google Chrome、Microsoft Edge、Opera、Brave、Vivaldi、Cốc Cốc 浏览器、UC 浏览器、360 浏览器和 Mozilla Firefox。 |
967d35e40f3f95b1 f538bd248640bf3b | 相机 | 如果计算机连接了相机,它就会拍摄照片。 |
a7ba857c30749bf4 ad76c93de945f41b | 收集信息 | 扫描磁盘中扩展名为.txt、.doc 、 .docx 、 .xls 、 .xlsx 、 .ppt和.pptx的文件。 <br>收集来自多个软件的信息,包括:LetsVPN、腾讯 QQ、微信、金山 WPS、e2eSoft VCam、酷狗、Oray Sunlogin 和 ToDesk。 |
6002396e8a3e3aa7 96237f6469eb84f8 | 解码 | 从远程存储库下载模块并解密。 |
9348a97af6e8a2f4 82d5dbee402c8c6f | 钉钉 | 收集钉钉(中国开发的一款企业管理工具)的多种数据,包括聊天消息、音频、视频、联系信息以及用户加入的群组。 |
801ab24683a4a8c4 33c6eb40c48bcd9d | 下载 | 下载(非恶意)Python 包。 |
16654b501ac48e46 75c9eb0cf2b018f6 | 文件扫描仪 | 使用与CollectInfo相同的代码扫描磁盘上的文件。 |
7d3b40764db47a45 e9bc3f1169a47fe2 | 文件扫描仪所有磁盘 | |
3582f6ebaf9b6129 40011f98b110b315 | 获取 OperaCookie | 从 Opera 浏览器获取 cookie。 |
10ae9fc7d453b0dd 525d0edf2ede7961 | 列表 | 列出带有.py扩展名的模块。 |
ce5bf551379459c1 c61d2a204061c455 | 地点 | 使用在线服务获取计算机的 IP 地址和 GPS 坐标。 |
68e36962b09c99d6 675d6267e81909ad | 位置1 | |
5e0a529f8acc19b4 2e45d97423df2eb4 | 通过 IP 定位 | |
c84fcb037b480bd2 5ff9aaaebce5367e | 打包目录 | 创建指定文件的 ZIP 档案。 |
4518dc0ae0ff517b 428cda94280019fa | 通行证 | 该脚本似乎未完成。 <br>它从腾讯 QQ 浏览器获取并解密密码。 <br>可能被qqpass模块取代。 |
5fbf04644f45bb2b e1afffe43f5fbb57 | QQ密码 | 获取并解密Google Chrome、Mozilla Firefox、腾讯QQ浏览器、360 Chrome和UC浏览器的密码。 |
874f5aaef6ec4af8 3c250ccc212d33dd | 屏幕录制 | 记录屏幕,并将结果保存为 ZIP 档案中的 AVI 文件。 |
c915683f3ec888b8 edcc7b06bd1428ec | 电报 | 从 Telegram 桌面应用程序收集帐户信息。 |
104be797a980bcbd 1fa97eeacfd7f161 | 网络通行证 | 类似于qqpass模块。 |
e5b152ed6b4609e9 4678665e9a972cbc | 微信 | 最大的模块之一,它从微信收集广泛的数据。 |
6d07a4ebf4dff8e5 d4fdb61f1844cc12 | wechat_all_file 复制代码 | 从微信收集数据。 |
17cf4a6dd339a131 2959fd344fe92308 | 微信源码 | |
8326cef49f458c94 817a853674422379 | 微信1 | 类似于微信。 |
427f01be70f46f02 ef0d18fcbbfaf01d | 微信档案 | |
72704d83b916fa1f 7004e0fdef4b77ae | 无线钥匙 | 收集无线网络信息和密码,以及ipconfig /all命令的输出。 |
除了 Python 工具包之外,我们还发现远程代码库中存储了其他未加密的工具(表 7);其中一些是用 C/C++ 编写的,另一些是用 Go 编写的,如下所示。
表 7. 工具及其功能
工具文件名 | 描述 |
---|---|
代理模式 | 用 Go 编程的反向代理。 |
获取代码.mod<br><br>获取code64.mod | Mimikatz。该工具是通过getpwd命令下载的 DLL 。 |
初始化Python模块 | 旧版下载程序,用于在受感染的机器上安装自定义的 Python 发行版。此工具是一个 DLL。 |
遠端模式 | RealVNC 服务器允许攻击者远程控制受感染的机器。此工具是一个 DLL。 |
soc.mod | 用 Go 编程的反向代理。<br><br>证书由一家名为杭州富阳齐盛信息技术服务部的中国公司签署。我们无法找到有关该公司的任何信息。 |
斯托尔 | 用于执行下载的工具,用 Go 编写。<br><br>证书由中国公司舟山小文软件开发工作室签署。我们无法找到有关该公司的任何信息。 |
结论
在这篇博文中,我们分析了针对韩国 VPN 提供商的供应链攻击,该攻击针对的是东亚用户,这一点从专门用于收集信息的软件中可以看出,并通过 ESET 遥测技术得到确认。我们还记录了 SlowStepper 后门,该后门由 PlushDaemon 独家使用。该后门以其使用 DNS 的多级 C&C 协议以及下载和执行数十个具有间谍功能的附加 Python 模块的能力而闻名。
PlushDaemon 工具集中的众多组件及其丰富的版本历史表明,尽管之前不为人知,但这个与中国结盟的 APT 组织一直在努力开发各种各样的工具,这使其成为一个需要警惕的重大威胁。