未知APT组织RedGolf组织针对日本大型公司开展网络攻击

一份与 KeyPlug 恶意软件相关的基础设施目录被短暂曝光,揭示了可能用于主动攻击的工具。该服务器上线不到一天,就暴露了 Fortinet 防火墙和 VPN 攻击漏洞脚本、一个基于 PHP 的 Webshell,以及针对一家日本大型公司相关的身份验证和内部门户的网络侦察脚本。虽然曝光时间短暂,但此次曝光却为了解潜在高级对手的行动部署和计划提供了一窥究竟的途径。
要点:
- Fortinet 防火墙和 VPN 漏洞脚本在与 KeyPlug 恶意软件活动相关的基础设施上被暴露。
- 其中包括一个基于 PHP 的 webshell,能够执行 AES 和 XOR 解密的有效负载。
- 网络侦察脚本针对与日本一家大型公司相关的登录、开发和身份门户。
- 该服务器上线时间不到 24 小时,强调了监控短期运营基础设施的必要性。
当分阶段基础设施进入视野时
@Jane_0sint 最近在 X 上发帖,重点介绍了 IP/port ,这是一个归因于RedGolf154.31.217[.]200:443
威胁组织的服务器,与 APT41 存在重叠。帖子中包含一个恶意 ELF 样本 ( SHA-256 : ),展示了后门功能,并指出该服务器全天间歇性出现,这是我们在与 RedGolf 相关的基础设施中持续观察到的行为。53a24e00ae671879ea3677a29ee1b10706aa5aa0dccd4697c3a94ee05df2ec45
作为我们对 KeyPlug 基础设施进行更广泛研究的一部分,该 IP 已处于长期监控之下,我们之前已通过 TLS 证书重用将其关联起来。在 Hunt.io 中进行查询154.31.217[.]200
显示,它与另外五台服务器共享了 WolfSSL 颁发的 TLS 证书。
图 1:Hunt.io中共享证书的快速枢轴点。
其中,45.77.34[.]88
引人注目的是,80 端口出现了一个Python 3.12.4 SimpleHTTP/0.6
标头,最早是在 3 月初观察到的——这个细节通常表明存在一个临时或持久文件暂存服务器。
证书详细信息
- 主题通用名称:www[.]wolfssl[.]com
- 主题组织单位:Support_1024
- 发行人组织单位:Consulting_1024
- SHA-256指纹:
4C1BAA3ABB774B4C649C87417ACAA4396EBA40E5028B43FADE4C685A405CC3BF
图 2: Hunt中的 IP 概览屏幕截图,显示端口 80 上的 Python SimpleHTTP 服务器。
尝试直接访问该目录失败,表明错误配置已被发现并纠正。然而,在 Hunt.io 内部,AttackCapture™模块在服务器短暂暴露期间已将其索引,并保留了其内容的快照。
图 3: AttackCapture™从暴露的服务器下载的文件片段。
文件分析
此次简短的曝光45.77.34[.]88
让我们清晰地了解了可能用于侦察和行动阶段的工具。多个文件指向了基础设施指纹识别工作、Fortinet 目标定位活动、访问后有效载荷以及早期扫描阶段的输出。
虽然有些文件从检测角度来看与防御者直接相关,但它们也反映了基础设施背后运营者的工作流程、规划和目标优先级。接下来是对此次暴露期间恢复的最值得注意的文件进行细分,重点介绍它们的功能和潜在影响。
针对资生堂企业基础设施的侦察输出
打开的目录中包含一个文件夹alive_urls_20250305_090959.txt
内的文件awvs/
,以及一份 fscan 的副本,fscan 是一款用于端口扫描和服务枚举的公开工具。该文件列出了近一百个资生堂域名,其中许多指向登录门户、开发环境、内部仪表板和第三方身份提供商。
图 4:攻击者所针对的资生堂相关域名的片段。
第二个文件non_cdn_ips_20250305_090959.txt
似乎将这些域名与未受 CDN 屏蔽的源 IP 关联起来,这很可能是为了暴露可直接访问的基础设施,以便后续的攻击目标。下一节将讨论的 CDN 指纹识别工具 script.py 的存在,进一步强化了这种行为。
资生堂最初是一家日本药店,如今已发展成为一家大型国际化妆品公司,业务遍及120个国家和地区。该文件包含托管在新加坡和欧洲各地的域名,包括Okta和Keycloak门户、暂存环境和数据保护服务。这表明该公司重点关注身份验证界面和内部系统,这些系统可能与员工访问、合规性工作流程以及更广泛的企业运营相关。
script.py - CDN 指纹识别器
此脚本执行实时 URL 检查,并确定资产是否受内容分发网络 (CDN) 保护或直接暴露在互联网上。它会通过 HTTPS 和 HTTP 检查每个域名,收集服务器响应标头,并标记缺少常见 CDN 指示符(例如CF-RAY
、X-Amz-Cf-Id
或Akamai-Cache-Status
)的域名。
图 5:Attack Capture 中 script.py 的 Python 代码片段。
该脚本输出两个文件:
alive_urls_*.txt
:确认哪些域响应成功non_cdn_ips_*.txt
:隔离被认为面向源的资产
缺少与 CDN 相关的标头并不能保证直接访问,但这种逻辑反映了一种识别可见性或缓解层较少的基础设施的策略。该脚本可能充当了过滤阶段,用于显示未受边缘保护的高价值目标。
1.py - Fortinet 侦察脚本
在 for/ 目录中发现的GeoLite2-Country.mmdb
多个文本输出文件,1.py
旨在针对 Fortinet VPN 和防火墙设备执行定向侦察。其主要功能是识别实时 Fortinet 登录门户并提取特定版本的 JavaScript 哈希值,这些哈希值可用于对设备进行指纹识别并确定漏洞利用的兼容性。
该脚本的核心是自动向两个关键的 Fortinet 登录路径(/remote/login
和)发出请求/login
,并解析每个响应以定位包含特定版本哈希值的 login.js 脚本 URL。然后,该哈希值将与域名和解析后的国家/地区一起记录下来。
以下逻辑用于从 FortiClient 门户提取哈希:
script_tag = soup.select_one("script[src^='/sslvpn/js/login.js']")
Hash = script_tag['src'].split('=')[1]
路径中嵌入的哈希值login.js
通常会因 FortiOS 版本的不同而有所差异,并可用于推断正在使用的软件版本。识别这些值可帮助操作员根据已知的易受攻击的版本或特定平台的行为调整后续操作。
然后将提取的数据写入1.txt
或2.txt
取决于哪个端点响应,并使用国家级元数据进行丰富:
with geoip2.database.Reader('GeoLite2-Country.mmdb') as reader:
response = reader.country(ip)
ip_check = response.country.names['zh-CN']
User-Agent 字符串静态设置为真实的浏览器配置文件,可能是为了避免自动阻止或信誉过滤器:
Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
防守方注意事项:
确保 Fortinet SSL VPN 接口已安装补丁并运行受支持的版本,尤其是在暴露于互联网的情况下。监控跨多个资产或在短时间内对 /remote/login 和 /login 端点的自动访问。查找对这些路径的重复请求,这些请求使用一致的 User-Agent 字符串,并且未进入完整的身份验证流程。
ws_test.py - 自动利用 Fortinet WebSocket CLI 访问
该脚本及其变体test.py
可ws_tests.py
自动利用 Fortinet 基于 WebSocket 的 CLI 端点。代码与ws_test.py
CVE-2024-23108 和 CVE-2024-23109 的公开利用技术非常相似,这些技术最初由WatchTowr记录,它们滥用 FortiOS 中未经身份验证的 WebSocket 端点来执行特权 CLI 命令。
为了绕过访问控制,代码使用硬编码标头来欺骗本地流量:
headers = {'Forwarded': 'for=127.0.0.1; by=127.0.0.1;', 'User-Agent': 'Node.js'}
该脚本/ws/cli/open
针对/ws/newcli/open
FortiOS 7.0.0至7.0.15版本,并创建模拟本地访问和绕过身份验证的请求。根据版本,它会相应地调整 WebSocket 路径和令牌参数:
if 7002 <= version <= 7015:
url = "wss://{0}:{1}/ws/cli/open?cols=154&rows=13&local_access_token=1112"
elif 7000 <= version <= 7001:
url = "wss://{0}:{1}/ws/newcli/open?cols=154&rows=13&access_token=1"
一旦连接,它会立即发送一个模仿多个管理用户名和欺骗 IP 地址的有效载荷:
payload = '"admin" "admin" "root" "super_admin" "root" "none" [1.1.1.1]:1 [2.2.2.2]:2'
ws.send(payload + '
')
然后,逻辑发出 CLI 命令(例如 showfull-configuration
或自定义序列)来检索管理员帐户详细信息、提升权限或重置密码 - 所有这些都无需任何身份验证。
除了 WatchTowr 进行的大量研究之外,防御者还应该:
/ws/cli/open
在/ws/newcli/open
历史代理和防火墙日志中查找 WebSocket 握手请求。- 重复提交精心设计的身份字符串,例如“
admin
”、“root
”和“super_admin
”。
bx.php - 用于远程命令执行的基于 POST 的加密 Webshell
bx.php 脚本是一个紧凑的 PHP Webshell,旨在通过 HTTP POST 接收加密的命令有效负载,在内存中解密并动态执行。它使用混淆技术、运行时加密和最小的磁盘行为来支持静默的远程访问操作。
在脚本的顶部,使用以下命令抑制所有 PHP 错误:
@error_reporting(0);
这可确保解密或执行失败不会产生可见的输出或在日志中留下痕迹 - 这是有意为之的 OPSEC 措施,旨在减少实时操作期间的噪音。
使用基于 XOR 的例程对有效载荷源进行混淆:
$p = '|||||||||||'^chr(12)... // resolves to 'php://input'
该脚本从 POST 正文中读取加密数据,并使用硬编码密钥 ( a75d6a841eafd550
) 进行 AES-128 解密。如果 OpenSSL 不可用,则回退到自定义的 XOR 和基于 base64 的例程。解密结果被拆分为函数和参数组件,并通过基于类的 __invoke() 方法使用 eval() 执行。
通过使用 AES-128 加密有效载荷并仅在内存中进行评估,bx.php
避免在磁盘或日志中留下可读的命令内容。它不依赖 URL 参数或命名 POST 字段来传递命令,而是直接从原始 HTTP POST 正文中读取加密的有效载荷。
图6:bx.php脚本内容。
client.ps1——通过 TCP 的 PowerShell 反向 Shell
位于开放目录的根目录中,client.ps1
是一个用PowerShell编写的自定义反向shell,它45.77.34[.]88
通过TCP端口连接到8080
。它使用ECB模式下的AES-128加密所有任务和响应,完全通过原始TCP而不是HTTP/S进行操作。
连接后,该脚本使用静态密钥进行身份验证,并等待 cmd_mode 标志,然后进入主循环。它会解密内存中的传入命令,使用 Invoke-Expression 执行这些命令,然后加密输出,并通过同一套接字返回。
图 7:使用 ECB 模式和静态密钥的 AES 加密/解密例程。
除了常规任务外,植入体还支持发送PING
和HEARTBEAT
接收消息,并使用加密的响应进行回复PONG
,HEARTBEAT_ACK
以保持与控制器的连续性。这些检查有助于操作员验证会话的稳定性和响应能力。
图 8:任务循环中的 PING/PONG 和 HEARTBEAT 响应逻辑。
如果连接断开,植入物会进入 30 分钟的休眠状态,然后再重试,从而使其能够安静地持续一段时间,而不会产生嘈杂的重复连接尝试。
服务器 - 基于 HTTP 的监听器
目录中的最后一个文件是一个名为 的 ELF 二进制文件Server
,它会在端口上打开一个 HTTP 监听器8080
并接受基本的操作员命令。虽然它的界面很小,但该工具可以充当会话控制器,使操作员能够列出可用的连接 ( sessions
) 或直接与连接交互 ( use <id>
)。
图 9:在实验室环境中运行服务器程序的示例输出。
对侦听器的未经身份验证的请求将返回 200 OK 状态和字符串Authentication Failed
,表示二进制文件在初始交互期间需要特定的密钥或握手。
配套文件捕获了二进制文件的交互使用情况,其中显示了几个输入错误的命令以及对可能上传到受害系统的command_history.txt
PowerShell 脚本()的引用。helps.ps1
图 10:链接到基于 Linux 的“服务器”的命令历史记录片段。
随着服务器工具集的完善,暴露的目录提供了难得一见的视角,让我们得以一窥攻击者的操作:从基础设施侦察、漏洞利用工具到访问后会话管理。在下一节中,我们将概述一些关键要点和表面可观察对象,以支持即时检测。
最后的想法
操作人员很少抛开工作逻辑。然而,在短暂的一瞬间,一台可能与 RedGolf/APT41 相关的KeyPlug基础设施相连的服务器浮出水面,展现的不仅仅是工具。它捕捉到了操作的节奏:扫描、过滤、准备和任务分配,所有这些都通过工作脚本和实时输出进行映射。
这不是单一的收获;而是一个难得的机会,可以了解入口是如何准备的,任务是如何组织的,以及基础设施是如何支持从初始进入到长期目标之间的静默工作的。对于防御者来说,这些一瞥虽然罕见,但往往最能揭示真相。
RedGolf 开放目录网络可观察数据和攻击指标 (IOC)
IP 地址 | 域名 | 托管公司 | 地点 |
---|---|---|---|
154.31.217[.]200 | 不适用 | V控股有限责任公司 | 太平绅士 |
45.32.21[.]176 | 不适用 | V控股有限责任公司 | 太平绅士 |
45.77.34[.]88 | 不适用 | V控股有限责任公司 | 太平绅士 |
45.77.249[.]100 | 联合中国[.]com | V控股有限责任公司 | 太平绅士 |
66.42.55[.]203 | 不适用 | SGP_V_CUST | SG |
108.160.129[.]175 | 不适用 | V控股有限责任公司 | 太平绅士 |
185.82.219[.]201 | 联合中国[.]com | GreenFloid有限责任公司 | 保龄球 |
RedGolf Open Directory 主机可观察数据和入侵指标 (IOC)
文件名 | SHA-256 哈希 | 笔记 |
---|---|---|
系统开发 | 53a24e00ae671879ea3677a29ee1b10706aa5aa0dccd4697c3a94ee05df2ec45 | ELF 程序由 @Jane0sint 发布 |
1.py | 09b220a315ea0aebae2de835a3240d3690c962a3c801dd1c1cf6e6e2c84ede95 | Fortinet侦察脚本 |
bx.php | 7146774db3c77e27b7eb48745aef56b50e0e7d87280fea03fa6890646af50d50 | 混淆的 webshell |
客户端.ps1 | c8d2b2ba5b6585584200ca46564b47db8048d748aefbdfe537bceaf27fb93ad7 | 基于 PowerShell 的 TCP 反向 Shell |
客户端_linux | c1da6449513844277acc969aae853a502f177e92f98d37544f94a8987e6e2308 | 基于Linux的反向shell |
createdump | 468b1799fbda3097b345a59bc1fec1cbc2a015efa473b043a69765a987ad54ed | Linux 版本的开源项目、运行时 |
日志 | 759246465014acaf3e75a575d6fe36720cfdbfe2eeac1893fe6d7a0474815552 | Linux日志程序 |
普什 | 827b5d8ed210a85bf06214e500a955f5ad72bd0afd90127de727eb7d5d70187e | PowerShell 终端 |
脚本.py | 2386baf4bf3a57ae7bca44c952855a98edf569da7b62bb0c8cbe414f1800d2b6 | CDN指纹识别脚本 |
服务器 | f21a7180405c52565fdc7a81b2fb5a494a3d936a25d1b30b9bd4b69a5e1de9a3 | 基于HTTP的服务器 |
ws_测试.py | 98261d1f92ae8f7a479bc5fc4d0a8d6a76c0d534e63e9edbc2d6257a9ba84b9d | Fortinet 漏洞利用代码 |
fscan | e82ecbe3823046a27d8c39cc0a4acb498f415549946c9ff0e241838b34ed5a21 | 开源端口扫描器 |