今天看了一篇关于知名安全机构censys发布的AdaptixC2特征识别的文章,推荐搞安全的朋友们看看。
摘要部分
AdaptixC2 是一个开源的后渗透 C2 框架,其默认配置会 Server: AdaptixC2, Adaptix-Version: v1.2在每个未经身份验证的请求中发送品牌化的 HTTP 标头(),使得部署的服务器很容易通过被动扫描识别出来。截至 2026 年 6 月 16 日,Censys 跟踪了 236 台主机上的 412 个 Web 属性,这些主机运行 AdaptixC2,采用默认或接近默认的设置。 三个信标监听器集群(Hivelocity、M247、PSB Hosting)——每个集群跨越相邻子网的多个 IP 地址,并具有相同的默认 TLS 证书——表明各个运营商运行着协调的、冗余的回调基础设施。 一台主机( 2.26.229[.]254)正在积极提供有效载荷,其中包括一个具有 12 种持久化机制和俄语注释的 Linux 安装程序。篡改响应头以逃避检测的操作者 Server会保留默认的 404 页面主体。同时查询这两个信号可以捕获此类规避行为。所有检测结果均可通过THREAT-0210威胁标签在 Censys 中找到。
AdaptixC2 是一个开源的后渗透框架,其默认配置使得部署的服务器很容易通过被动扫描被识别出来。截至 2026 年 6 月 11 日,Censys 追踪到 217 台运行 AdaptixC2 且配置接近默认的主机上的 390 个 Web 属性(每个属性对应一个不同的 IP 地址或主机名和端口对)。这其中包括三个不同的信标监听器集群,表明存在协同的多服务器部署;此外,还有一个主机通过开放目录提供植入程序。该框架会在每个未经身份验证的请求中发送带有品牌标识的 HTTP 标头,因此,即使没有身份验证或端点信息,首次被动探测也能识别出该框架。
并非所有这些主机都代表恶意活动。其中一些几乎可以肯定是经过授权的红队基础设施。通过被动扫描,我们可以确定该基础设施存在且可检测,了解其特征的防御者可以据此做出明智的决策,决定阻止或监控哪些内容。
后渗透框架为攻击者在取得初步立足点后使用的工具提供了支持,例如:维持访问权限、运行命令、横向移动以及从受损系统中收集数据。
AdaptixC2 是一个公开可用的后渗透框架,使用 Go 语言(团队服务器)和 C++/Qt(图形用户界面客户端)编写。它专为红队演练而设计,但与大多数攻击框架一样,它也被用于未经授权的操作。该项目目前版本为 v1.2,与Cobalt Strike、Havoc 或 Sliver 等老牌框架相比,公开的分析覆盖率较低。
该框架包含两个代理系列。在C2术语中,代理是指运行在被入侵主机上并与操作员通信以获取任务的植入程序,而非人工智能代理。Beacon代理是一个C++植入程序,支持在Windows、Linux和macOS上执行Beacon对象文件(BOF);Gopher代理是一个Go植入程序,支持在上述平台上执行异步BOF。该框架将监听器实现为可加载插件(“扩展程序”),涵盖HTTP/S、DNS/DoH、SMB命名管道和原始TCP传输协议。团队服务器公开了完整的REST和WebSocket API,用于操作员控制——包括凭证管理、代理任务分配、屏幕截图、隧道管理和多操作员协作。
AdaptixC2 之所以能够大规模检测,是因为profile.yaml:其错误块集Server: AdaptixC2 和Adaptix-Version: v1.2每个未匹配路由都采用了特定的设计。任何与配置的端点不匹配的请求都会显示此错误块——无需身份验证,也无需预先了解端点路径。被动扫描器会在首次探测时就看到此横幅。
架构设计
团队服务器
teamserver 是一个单独的 Go 二进制文件。启动时,它会加载profile.yaml并配置网络接口、端口、端点路径、密码和 HTTP 响应行为。然后,它会生成或加载自签名 TLS 证书,从磁盘加载扩展插件,通过 gin 启动 HTTPS 服务器,并从 SQLite 数据库恢复状态。
路由器层级结构在connector.go配置的端点(默认/endpoint)下定义了四个不同的组:

前缀之外的任何内容/endpoint,以及 /endpoint 下任何未注册的路径,都会命中NoRoute处理程序,该处理程序会返回配置的错误响应——带有品牌标头的 404 页面。
身份验证模型
身份验证采用两层机制。该/login接口接收包含用户名和密码的 JSON 请求体,并返回一个有效期较短的 JWT 访问令牌(12 小时)和一个有效期较长的刷新令牌(168 小时,即 7 天)。每个启动项都会生成新的 JWT 签名密钥,crypto/rand并使用 HS256 对令牌进行签名。
OTP令牌用于控制WebSocket升级和一次性文件传输。经过身份验证的操作员/otp/generate使用JWT访问令牌调用系统,生成一个64个字符的十六进制OTP。这些令牌是一次性的——使用同一个令牌两次调用相应的端点会失败。
扩展系统
监听器会编译成 Go 共享库(.so文件),并在运行时加载。监听器启动时,可以注册路由到api_group(受 JWT 保护的)或public_group(未经身份验证的)路由。这是代理回调的正确设计——代理不携带操作员凭据,因此它们的签到端点不需要 JWT 身份验证。
实际上,HTTP 信标监听器(BeaconHTTP 扩展程序)根本不使用团队服务器的公共端点组。它会在操作员配置的回调端口上启动一个独立的 HTTP 服务器,与团队服务器无关:

这就是为什么 Censys 扫描会发现两种截然不同的群体——团队服务器(通常使用 802 端口4321,用于操作员 API)和信标监听器(使用高端口,例如 802 端口43211,用于代理回调)。两者都会返回默认的 404 页面,但它们的用途不同。

指纹
检测依赖于默认配置中的两个独立信号,这两个信号均无需身份验证即可查看。
**标头。**默认情况下,profile.yaml这些标头设置为HttpServer.error.headers:
HttpServer:
error:
status: 404
headers:
Content-Type: "text/html; charset=UTF-8"
Server: "AdaptixC2"
Adaptix-Version: "v1.2"
page: "404page.html"
因为这是错误处理程序,而非特定路由,所以这些标头会出现在任何与配置端点不匹配的路径上。即使操作员使用默认路径,API 访问仍然需要有效的 JWT。但是,任何发送到 `` 、 ` `、 `` 或任何任意路径/endpoint的请求都会返回 404 错误,并在响应中包含 `
/``/robots.txt``/favicon.ico``Server: AdaptixC2**404 错误信息。**默认404page.html包含:
<h1>AdaptixC2 404</h1>
<p>You need to enter the correct connection details.</p>

该字符串足够具体,可用作操作员何时更改响应标头的独立指示符。
组合查询:
host.services.endpoints.http.headers: (key: "server" and value: "AdaptixC2") or host.services.endpoints.http.headers: (key: "adaptix-version" and value: "v1.2")
在 Censys 中操作
仅正文回退(捕获头部已修改的部署):
host.services.endpoints.http.body: "You need to enter the correct connection details."
DNS 监听器(三级信号)。BeaconDNS扩展程序会AA=true在每个响应中设置此参数,并返回TXT "OK"任何不符合其信标协议格式的查询——具体来说,就是任何标签少于五个的查询。Censys 会将此作为 UDP/53 端口上的 DNS 服务进行捕获version: "OK"。
host.services.dns.version: "OK" and host.services.protocol = "DNS"
此查询在全球范围内返回约 30 个主机。其中大多数是合法的 DNS 服务器,它们使用自定义字符串隐藏了其 BIND 版本,因此需要交叉验证该信号,可以通过与Adaptix C2威胁标签进行比对,或者通过主动探测进行验证。查询一个随机的短主机名会返回结果TXT "OK"(Censys 捕获到的结果),而使用 Beacon 签入格式(BeaconDNS 协议格式中包含五个或更多以点分隔的标签)的查询则会A 127.0.0.1在真正的监听器上返回结果。默认 TTL 值在 10 到 70 秒之间波动。对于未运行 BeaconHTTP 的主机,这是唯一的被动信号。
发现
我们从源代码入手。AdaptixC2 的profile.yaml和404page.html都位于公开的 GitHub 代码库中——指纹信息可以直接读取,无需事先接触基础设施。我们针对实际部署验证了预期的标头,并对 Censys 运行了这两个查询。
联合扫描返回了 236 个不同的主机。默认配置足够明确,一次查询就能捕获大部分主机。更难的是理解这些主机代表什么。
Censys ARC 透视图
主机分布在多个 ASN 和地理位置,集群表明存在有组织的部署。
港口配送
| 港口 | 数数 | 笔记 |
|---|---|---|
4321 | ||
43211 | ||
80808443``8989 | ||
1337,,,等等9999)8562 |
端口上的 46 次命中4321证实,许多运营商使用默认配置进行部署,并且端口保持不变。15 次命中43211集中在下文所述的三个信标监听器集群中的两个集群上。
顶级ASN
| ASN | 姓名 | 主持人 | 笔记 |
|---|---|---|---|
23.227.203.0/24,46.21.153.0/24 | |||
38.132.122.x;146.70.87.x | |||
4321;服务器托管于腾讯云香港和中国大陆区域 | |||
45.155.69.x; | |||
地理分布
| 国家 | 主机 |
|---|---|
美国服务器数量较多部分原因是 Hivelocity 是一家总部位于美国的供应商,而且这些主机几乎可以肯定是信标监听器而非团队服务器。香港和中国大陆的主机集群位于腾讯云上,这与总部位于东亚或目标市场为该地区的运营商相符。
受关注的主机
| IP | 端口 | 笔记 |
|---|---|---|
185.190.142[.]66 | 4321 | 3389)也已开放;O=OpenClaw端口上的证书443 |
89.125.255[.]29 | 4321 | C=RU,,ST=as``O=as |
38.147.173[.]24 | 8562 | 50050也已开放 |
156.225.22[.]201 | 1337 | |
202.95.8[.]92 / .97 / .98 | 4321 |
该证书89.125.255[.]29存在一个显著特征:C=RU, ST=as, O=as在提示输入状态和组织时,“as”填写了两次。该证书185.190.142[.]66同时在端口上启用了 AdaptixC2 4321,并在端口上打开了 RDP 3389,这表明操作员直接在团队服务器上工作,而不是通过跳转主机进行远程管理。
38.147.173[.]24AdaptixC2 正在端口上运行8562,并且端口也处于50050开放状态。端口50050是 Cobalt Strike 团队服务器的默认端口。我们无法通过被动扫描确认是否存在正在运行的 Cobalt Strike 实例——端口50050可能正被其他进程占用,或者扫描时该进程可能并未运行。这些情况表明,一名操作员可能正在使用多种攻击工具。
基础设施集群
Censys 扫描中最有价值的发现不是单个主机,而是三个信标监听器集群,它们可能代表单个运营商运行多个回调服务器。
这些是信标监听器,而非团队服务器。团队服务器需要运营商能够访问才能进行 API 访问——通常是通过固定 IP 地址上的单个端口。而信标监听器只需被受控主机上的代理访问即可。运营商通常会在不同的提供商、端口和地理位置上运行多个信标监听器,以实现冗余并增加清除难度。共享的 TLS 证书模式将这些集群连接在一起。
**Hivelocity 集群。**两个子网( 23.227.203.0/24和)上的八个或更多 IP 地址均在随机高端口( 、、、、)46.21.153.0/24上提供 AdaptixC2 404 页面服务。此集群中的每个主机都使用默认的 OpenSSL 自签名证书: 。该证书是 OpenSSL 在您运行并接受所有默认设置时生成的。同一提供商在两个相邻子网的八个 IP 地址上都存在此证书,这强烈表明是由单个操作员搭建了一批回调服务器,而没有自定义 TLS 配置。42215``42235``43211``43435``43655``C=AU, ST=Some-State, O=Internet Widgits Pty Ltd``openssl reqM247 集群。 38.132.122.x分布在两个子网(和)中的八个 IP 地址146.70.87.x,几乎全部使用端口43211。与 Hivelocity 集群使用相同的默认 OpenSSL 证书。M247 是红队和灰色地带基础设施的热门选择。共享端口和共享证书模式表明它们由同一运营商或同一部署工具提供支持。**PSB 托管集群。**六个 IP 地址分布在两个子网( 45.155.69.x和185.242.245.x)上,端口随机分布在42xxx-44xxx范围内。规模小于其他两个集群,但行为特征相同:相邻 IP 地址、随机高端口、默认证书。
每个集群内 IP 地址的顺序或近似顺序分配表明这些资源是同时配置的,很可能来自同一提供商账户。批量启动信标监听器的运营商通常会选择连续的 IP 地址,因为在同一会话中在同一区域订购多个虚拟机时,系统会自动分配连续的 IP 地址。被动扫描无法判断这些操作是否经过授权——集群模式描述的是基础设施的构建方式,而不是其用途。
实际部署版本:2.26.229[.]254
该数据集中最明显的活动证据是2.26.229[.]254:它在端口4433(BeaconHTTP) 和4455(GopherTCP) 上运行 AdaptixC2 监听器,并同时通过端口上的开放 HTTP 目录提供有效载荷7000。无需身份验证——任何连接的用户都可以公开访问这些文件。
有效载荷
| 文件名 | SHA256 | 类型 |
|---|---|---|
install.sh | 479b7abd5df2f6ab3de8c32a36478c15012dbc8217f9fa825fd4b9cb7e9b8d13 | |
timesync.bin | fb1f4f5a4ef76960577462634f4a104fb307e161fc2791b9231a07a2c751beca | |
svhost.exe | 06b13dfd84493b01a020eecdabff6308b5b790ed4cd4c7a96a30ae6be1ca325d | |
svc_timesync.x64.exe | 7d35d687ae8d4056e394905e9f8962512e6d55ff98664ed1facee6554a565624 | |
agent.x86.exe | 51fba778dae6f108f7afa800bdb7745e6a0f6d2630a37ecc84c1d4a1609f9692 |
timesync.bin这是一个适用于 Linux 的 Gopher 代理(ELF x64)。这三个.exe文件是 Windows Beacon 植入程序,分别对应 x64 和 x86 版本。VC_redist.x86.exe此外,还有一个合法的文件,可能是运行时依赖项。
install.sh:Linux 持久化安装程序
该安装程序伪装成例行软件包更新——伪造apt输出,伪造内核解包——而实际安装则在后台子 shell 中运行。脚本中随处可见的俄语注释表明了作者的工作语言。它会部署timesync.bin到/usr/local/lib/systemd/timesync 12 个独立的持久化机制并建立它们,之后自行销毁。
隐藏用户— 创建 systemd-timesync(UID 9999),使用随机密码和硬编码的操作员 SSH 密钥authorized_keys。SSH 访问权限在代理移除后仍然存在。伪造的 systemd 服务——覆盖 systemd-timesyncd.service以执行信标,伪装成 NTP 同步守护进程。三个定时任务分别在不同的 crontab 位置运行,时间间隔分别为 5 分钟、10 分钟和 15 分钟。任何一个任务成功运行后,代理程序都会重启。 Initramfs hook — 将脚本放入 /etc/initramfs-tools/scripts/init-premount/并重建 initrdupdate-initramfs。代理在根文件系统挂载之前运行。GRUB 初始化替换——追加 init=/usr/local/lib/systemd/systemd-persistence.sh并GRUB_CMDLINE_LINUX_DEFAULT重建内核。grub.cfg.内核在下次启动时将进程 ID 1 交给攻击者的脚本,而不是 systemd。即使服务被移除、cron 清除任务被执行或用户被删除,此操作仍然有效。LD_PRELOAD 库——负责写入和编译 libsystemd-override.so,已在 GCC 中注册/etc/ld.so.preload。GCC 构造函数会导致每个动态链接的进程 fork 并执行该 beacon。仅仅删除该二进制文件是不够的。内核线程伪装——两个信标实例以 [kworker/0:0]和[kthreadd]通过启动exec -a,混入 ps 输出中的内核线程条目。完整性监视器— monitor.sh以 身份运行,每 60 秒检查一次,如果代理不存在[kworker/u:0]则从 重新下载代理。hxxp://2.26.229[.]254:7000/timesync.binShell 配置文件注入— 将代理启动添加到 .bashrc每个.profile用户/home/*和 root 用户。DNS劫持——将其设置 2.26.229[.]254为主systemd-resolvedDNS服务器。所有DNS查询都将通过C2主机路由。eBPF hook — 如果 bpftool存在,则在返回 0 时加载 kprobesys_getdents64,尝试从目录列表中隐藏进程。Systemd 定时器— systemd-timesync.timer启动后两分钟触发,之后每 10 分钟触发一次。
清理:将 下的所有文件清零/var/log,清除 bash 历史记录,并使用 销毁安装程序shred -u。
GRUB 初始化程序替换和 LD_PRELOAD 的结合意味着,除了完全重装操作系统之外,该植入程序能够躲过大多数检测和移除流程。eBPF 钩子(加载 kprobe 以将sys_getdents64进程目录条目清零)旨在使正在运行的进程对标准用户空间工具不可见,从而在第 7 项和第 9 项中进程名称伪装的基础上,增加了一个内核级隐藏层。
信标配置(通过静态分析提取)
下面的“代理”部分介绍了如何从 Windows 信标二进制文件中提取配置。这三个.exe示例都2.26.229[.]254 回调到同一个监听器:
C2: hxxp://2.26.229[.]254:4433回调 URI : /api/v1/status,,/updates/check.php``/content.html自定义页眉: X-ISS用户代理: Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20121202 Firefox/20.0RC4密钥: 1baccab4cbd2b84f6bc54bf8e6551f93睡眠: 10 秒
API界面
团队服务器的 REST API 在 [此处应填写 API 文档名称]server.go和 [此处应填写 API 文档名称] 中有详细说明connector.go。以下是其背后的原理。
身份验证流程:
POST /endpoint/login操作员使用 JSON 凭据正文进行调用。服务器返回访问令牌(12 小时)和刷新令牌(168 小时)。Authorization: Bearer <token>操作员会在所有后续请求中附加访问令牌。在打开 WebSocket 通道之前,操作员调用 POST /endpoint/otp/generate获取一次性令牌,然后通过 GET 进行升级/endpoint/connect?otp=<token>。POST /endpoint/refresh过期的访问令牌通过刷新令牌进行刷新。
身份验证和会话:
| 端点 | 方法 | 身份验证 | 目的 |
|---|---|---|---|
/login | |||
/refresh | |||
/otp/generate | |||
/otp/upload/temp | |||
/otp/download/sync | |||
/connect | |||
/channel | |||
/sync |
代理和任务:
| 端点 | 方法 | 目的 |
|---|---|---|
/agent/list | ||
/agent/generate | ||
/agent/command/execute | ||
/agent/command/raw | ||
/agent/command/file | ||
/agent/task/list | ||
/agent/task/cancel |
基础设施和收集:
| 端点 | 方法 | 目的 |
|---|---|---|
/listener/create | ||
/listener/list | ||
/creds/list | ||
/creds/add | ||
/screen/list | ||
/screen/image | ||
/tunnel/start/socks5 | ||
/tunnel/start/lportfwd | ||
/download/list | ||
/targets/list |
无需身份验证即可公开哪些信息,哪些信息不会公开。
当密码设置正确时,团队服务器管理 API 的安全性相当高。团队服务器端口上未经身份验证的访问面有限:
| 端点 | 身份验证 | 它揭露了什么 |
|---|---|---|
ANY /<path> | Server: AdaptixC2Adaptix-Version: v1.2标题;404 正文带有品牌标识 | |
POST /endpoint/login | ||
POST /endpoint/refresh |
所有 50 多个数据接口都需要有效的 JWT 访问令牌。通过团队服务器 API,无法通过未经身份验证的途径访问代理列表、凭据、屏幕截图、下载内容或操作员会话。
使用 OTP 验证的端点(/connect,,,)需要由已认证的操作员生成/channel的有效 OTP。OTP 令牌为一次性使用,过期时间短。/otp/upload/temp``/otp/download/sync
错误响应行为
身份验证失败(密码错误、令牌缺失、令牌过期)都会返回 HTTP 404 错误代码,且响应内容相同Server: AdaptixC2。服务器在响应客户端时不会区分“密码错误”和“路径不存在”。这是有意为之:它可以防止攻击者通过观察不同的状态码来确认哪些端点路径有效。
其副作用是,该Server: AdaptixC2标头会出现在每个响应中,包括失败的身份验证尝试。攻击者在进行任何身份验证尝试之前,就能从第一次探测中获知服务器的框架身份。
代理人
AdaptixC2 提供两种不同的代理系列。
Beacon是一款面向 Windows、Linux 和 macOS 的 C++ 植入程序。除了标准的 C2 任务之外,它的主要功能是 BOF(Beacon 对象文件)执行——这项技术由 Cobalt Strike 推广,允许攻击者在进程内运行已编译的 C 代码,而无需访问磁盘。这使得专注于子进程创建的终端工具更难检测到 Beacon。默认嵌入的水印config.yaml是be4c0149.
Beacon 通过其扩展器系统支持多种传输协议:
BeaconHTTP:带有可配置 URI、标头和 User-Agent 轮换功能的 HTTP/S 回调 BeaconDNS:基于 DNS 的回调通道。监听器会回复 TXT "OK"任何短标签或未识别的查询,并在每个响应中设置权威应答位,Censys 将dns.version: "OK"其显示为——一个可用的被动指纹。BeaconSMB:用于在受损网络内进行点对点跳转的命名管道通信 BeaconTCP:用于内部枢纽的绑定式 TCP 通道
这些传输协议的外部可见性各不相同。BeaconHTTP、BeaconDNS 和 BeaconTCP 都会暴露一个套接字,任何互联网扫描器都可以访问它。BeaconSMB 则完全没有外部痕迹——SMBStart()扩展器的 teamserver 端实际上什么都不做。命名管道位于一台已经运行另一个信标的受害机器上,该信标充当网络中其他设备的 SMB 中继。仅使用 SMB 的部署对 Censys 或任何其他互联网扫描器都是不可见的。
Gopher是一个支持相同平台的 Go 语言植入程序。它支持异步 BOF 执行,这意味着任务在后台 goroutine 中运行,而代理程序会持续轮询而无需等待任务完成。默认水印为904e5493。Gopher 编译成静态链接的二进制文件,没有任何外部运行时依赖,这使得 Linux 部署变得非常简单。
这两个代理都使用水印(嵌入到编译后的二进制文件中的短十六进制字符串)将回调函数与特定版本关联起来。如果操作员不更改这些默认值( be4c0149, ),则可以在内存或二进制转储中识别它们。904e5493
代理信标协议
当 BeaconHTTP 监听器启动时,它会在配置的回调端口上运行自己的 HTTP 服务器,与团队服务器完全分离。代理回调不会发送到普通端口4321,而是发送到监听器的专用端口。这就是为什么 Hivelocity 集群(全部使用高端口,没有操作员 API)与单个团队服务器(单端口,完整的 REST API)看起来不同的原因。
签到时,代理会向配置的 URI 路径发送一个带有自定义标头的请求,该标头包含一个经过 base64 编码和 RC4 加密的“beat”数据块。监听器使用预共享字节encrypt_key(在创建监听器时配置的 32 个十六进制字符)解密该数据块,并提取代理类型、代理 ID 和信标数据。请求正文包含来自代理的任何传出任务数据。响应正文包含代理的待处理任务,这些任务嵌入在配置的page-payload模板字符串中。
RC4 密钥是每个监听器实例特有的,由操作员在创建监听器时设置。为特定监听器编译的代理会嵌入此密钥。这有效地将回调协议和团队服务器 API 分离。
信标配置提取
Beacon 植入程序会在编译后的 PE 文件段中嵌入一个 RC4 加密的配置 blob。MinGW.rdata构建(默认工具链)会将其放置在开头.rdata。布局源自 Go 端的序列化pl_main.go和 C++ 解析器AgentConfig.cpp:
[4-byte LE: ciphertext_size]
[ciphertext_size bytes: RC4 ciphertext]
[16 bytes: RC4 key]
解密无需外部密钥——RC4 密钥存储在二进制文件本身中。使用 4 字节的大小字段对密文进行切片,使用末尾的 16 个字节作为密钥进行解密。明文的前四个字节是代理水印(0xBE4C0149Beacon 为 16,0x904E5493Gopher 为 16)。C2 主机字符串作为长度前缀字段紧随其后,每个字段后紧跟一个 4 字节的端口值。
由于水印和第一个主机字符串之间的头部字段数量因构建配置而异,最可靠的提取方法是扫描明文以查找与 IP 或主机名模式匹配的字符串,而不是在固定偏移量处进行解析。非 MinGW 工具链可能会将 blob 放置在非零偏移量处.rdata;在这种情况下,对该部分进行 4 字节对齐的滑动搜索即可恢复它。
任何从端点恢复、从暂存服务器拉取或从沙箱中检索的 Beacon 植入程序,都可以解析其 C2 服务器、回调 URI 和监听器 RC4 密钥——而无需执行二进制文件。2.26.229[.]254 上面的示例证明了这一点:三个独立编译的可执行文件,都指向相同的监听器配置。
第三方扩展:KharonHTTP
AdaptixC2 的扩展系统支持将第三方监听器作为 Go 插件加载。KharonHTTPgithub.com/entropy-z/Kharon就是其中之一——我们在本数据集中的两台主机上发现了它的运行。
KharonHTTP 实现了一个可塑性强的 C2 配置文件系统——操作员可以通过 JSON 配置文件配置 URI 路径、响应头、User-Agent 模式、请求体前置/后置包装器以及 cookie 或参数编码。这与 Cobalt Strike 的可塑性 C2 配置文件类似:一个监听器二进制文件可以根据操作员配置扮演不同的网络角色。KharonHTTP 使用自定义分组密码(“LokyCrypt”)——一个 8 字节分组、16 轮 Feistel 构造,并带有 XOR 后处理——而不是 AdaptixC2 默认的 RC4。
我们在两台主机上发现了活跃的 KharonHTTP 服务。其中1.14.172[.]47一台主机在端口 上运行了两个 KharonHTTP 监听器,另一台主机在端口 上运行了一个监听器。回调域是从主机 的监听器配置中提取的。硬编码的代理类型标识符为。56743``56744``104.236.230[.]184``443``llmscience.top``1.14.172[.]47``c17a905a
对于执行主动扫描的防御者,需要注意以下行为:"Bad Request"当响应头与任何已配置的回调都不匹配时,KharonHTTP 会在响应体中返回字面字符串Host。此操作会在查询操作员的可塑性配置文件之前触发,因此无论加载哪个配置文件,其行为都保持一致。KharonHTTP 监听器默认运行纯 HTTP 协议(操作员需单独配置 TLS),因此即使在非标准端口上,此响应也可以以明文形式读取。
操作员简介
该基础设施表明,威胁行为者并非单一的;而是由不同程度的行动纪律性各异的群体组成。
这三个信标监听集群——Hivelocity、M247 和 PSB——表明运营商对多服务器部署有着深刻的理解。在两个子网中启动八台服务器并将代理指向所有服务器并非默认行为;有人特意选择运行冗余的回调基础设施。至于这些活动是否获得授权,则是另一个问题。
这些集群中可见的默认 OpenSSL 证书(C=AU, ST=Some-State, O=Internet Widgits Pty Ltd)表明运营商并不关心 TLS 指纹识别——他们要么不知道这是一个检测途径,要么不认为这是他们特定操作的优先事项。
异常主机显示出更多样化的配置。证书中89.125.255[.]29使用了“as”——有人自定义了 TLS 配置,但在状态和组织中都填写了两次“as”。端口上携带了证书,同时运行着一个活动的 AdaptixC2 实例并打开了 RDP。分发的安装程序通篇包含俄语注释。这些是对单个主机的观察,并非将它们彼此关联起来的依据。C=RU, ST=as, O=as``185.190.142[.]66``O=OpenClaw``443``install.sh``2.26.229[.]254
这三个连续出现的 CTG 服务器 IP 地址(202.95.8[.]92, 202.95.8[.]97,202.95.8[.]98),均使用端口4321,很可能由同一运营商提供。端口于 5 月 26 日出4321 现在 上, 5 月 29 日出现,5 月 30 日出现:这三个连续的 IP 地址均来自同一提供商,且都在四天之内上线。

对于检测而言,“TestCoonection”变体是数据集中最具指导意义的信号。更改Server标头需要编辑profile.yaml并重启团队服务器——操作员显然是故意选择绕过基于标头的检测。该Server值包含一个始终存在的拼写错误:“Coonection”,其中“o”是两个“o”,在多次扫描中均出现。即使查询404响应体字符串,仍然可以检测到它。

这群运营商的普遍模式是:他们的安全操作成熟度各不相同,有的采用默认设置,有的则进行针对性修改。进行针对性修改的运营商往往一次只针对一种检测手段,而忽略其他手段。正因如此,分层检测——包括头部和主体、被动和主动检测——才值得维护。
IOCs
检测查询
威胁标签(最简单——查找所有检测结果,包括规避变体):
host.services.threats.name: "Adaptix C2" or web.threats.name: "Adaptix C2"
基于标头(主要):
web.endpoints.http.headers: (key: "Server" and value: "AdaptixC2")
版本特定:
web.endpoints.http.headers: (key: "Adaptix-Version" and value: "v1.2")
基于请求体(捕获头部修改后的部署):
web.endpoints.http.body: "You need to enter the correct connection details."
DNS 监听器(三级——需要交叉引用):
host.services.dns.version: "OK" and host.services.protocol = "DNS"
Censys 威胁检测: THREAT-0210(包含正文哈希、标头和“TestCoonection”变体)
代表性基础设施
Hivelocity信标监听器集群:
| IP | 端口 | ASN | 笔记 |
|---|---|---|---|
23.227.203[.]205 | 43211 | ||
46.21.153[.]146 | 43211 | ||
46.21.153[.]148 | 43211 |
M247信标监听器集群:
| IP | 端口 | ASN | 笔记 |
|---|---|---|---|
38.132.122[.]141 | 43211 | ||
38.132.122[.]145 | 43211 | ||
38.132.122[.]161 | 43211 | ||
146.70.87[.]23 | 43225 | ||
146.70.87[.]64 | 43211 | ||
146.70.87[.]96 | 43211 | ||
146.70.87[.]218 | 42445 | ||
146.70.87[.]237 | 43211 |
PSB 托管信标监听器集群:
| IP | 端口 | ASN | 笔记 |
|---|---|---|---|
45.155.69[.]106 | 42211 | ||
45.155.69[.]153 | 43345 | ||
45.155.69[.]175 | 42455 | ||
185.242.245[.]4 | 44355 | ||
185.242.245[.]27 | 44875 | ||
185.242.245[.]120 | 42534 |
受关注的主机:
| IP | 端口 | 笔记 |
|---|---|---|
185.190.142[.]66 | 4321 | O=OpenClaw端口证书443 |
89.125.255[.]29 | 4321 | C=RU, ST=as, O=as 证书 |
38.147.173[.]24 | 8562 | 50050也已开放 |
156.225.22[.]201 | 1337 | |
202.95.8[.]92 | 4321 | .97和.98 |
167.17.47[.]121 | 4434321``53 | dns.version: "OK") |
91.230.94[.]235 | 432153 | dns.version: "OK") |
**样本和工件(**2.26.229[.]254 )
| 文件名 | SHA256 | 类型 |
|---|---|---|
install.sh | 479b7abd5df2f6ab3de8c32a36478c15012dbc8217f9fa825fd4b9cb7e9b8d13 | |
timesync.bin | fb1f4f5a4ef76960577462634f4a104fb307e161fc2791b9231a07a2c751beca | |
svhost.exe | 06b13dfd84493b01a020eecdabff6308b5b790ed4cd4c7a96a30ae6be1ca325d | |
svc_timesync.x64.exe | 7d35d687ae8d4056e394905e9f8962512e6d55ff98664ed1facee6554a565624 | |
agent.x86.exe | 51fba778dae6f108f7afa800bdb7745e6a0f6d2630a37ecc84c1d4a1609f9692 |
操作员 SSH 公钥(硬编码install.sh):
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIoi/bPuWr2EOQZo2OVDqG8XsRMz5epEGqG9sjcwZGJ1 timesync-manager
任何主机上存在此密钥authorized_keys都会将感染与该操作员联系起来。
BeaconHTTP RC4 密钥(从 Windows 样本中提取): 1baccab4cbd2b84f6bc54bf8e6551f93
代理水印
| 代理人 | 默认水印 |
|---|---|
be4c0149 | |
904e5493 |
在 Censys 上查找 AdaptixC2 基础设施
该数据集中的所有主机在 Censys 中均被标记为Adaptix C2威胁标签 ( THREAT-0210 )。威胁检测涵盖了默认的基于标头的检测和基于正文的回退检测,包括“TestCoonection”规避变体。
host.services.threats.name: "Adaptix C2" or web.threats.name: "Adaptix C2"
要点总结
**默认品牌标识使得被动检测变得轻而易举。**由于这些 Server: AdaptixC2标Adaptix-Version: v1.2头是在错误处理程序中设置的,而不是在特定路由中设置的,因此它们会出现在每个未经身份验证的请求中。无需任何凭据或端点信息即可识别默认配置部署。试图规避响应头的运营商会保留响应体字符串。 “TestCoonection”变体证实,至少有一个运营商修改了响应头以避免被检测,但保留了默认的 404 页面。基于响应体的检测可以捕获此类规避行为。防御者应该同时查询这两个信号。 三个信标监听器集群表明存在协同的多服务器操作。Hivelocity、M247 和 PSB 集群——可通过连续的 IP 地址、共享端口和相同的默认 OpenSSL 证书来识别——可能代表运行冗余回调基础设施的单个运营商。共享证书模式是集群的标志。 外部可见性因传输方式而异。BeaconHTTP、BeaconDNS 和 BeaconTCP 都会暴露套接字,被动扫描可以访问到这些套接字。BeaconSMB 则不会——SMB 扩展程序不会在团队服务器上绑定任何套接字,而且命名管道位于已被攻破的受害者服务器上。如果攻击者在初始访问后完全依赖 SMB 进行攻击,那么互联网扫描器将无法发现任何痕迹。此处统计的部署必须至少保持一个外部可访问的监听器运行。 **覆盖 236 台主机的 412 个网站资产是一个值得监控的群体——但需要注意的是,被动扫描无法区分授权活动和未经授权的活动。**其中一些是授权的红队演练活动。被动扫描无法区分它们与未经授权的活动。它能做的是揭示基础设施,以便分析人员自行做出判断。该指纹已投入生产环境 (THREAT-0210),涵盖基于头部和基于主体的检测路径,包括规避变体。防御者可以使用上述查询在其威胁情报管道中识别 AdaptixC2 部署。
作者
艾丹·霍兰德
高级安全研究员
艾丹·霍兰德是Censys ARC的高级安全研究员,专长于威胁情报和全网安全研究。他的工作重点是识别和分析恶意基础设施、追踪威胁行为者,以及开发大规模安全分析工具。艾丹积极参与开源安全社区,构建并维护用于威胁狩猎、数据分析和安全自动化的工具。(原文链接:https://censys.com/blog/adaptixc2-open-source-c2-framework)