AdaptixC2:大规模开源C2框架的特征识别

作者:小白安全成长记 发布:2026-09-16 11:54 收录:2026-09-16 12:43 2 次阅读 约 9684 字
摘要:知名安全机构censys发布的AdaptixC2特征识别报告
推荐理由:本文围绕「开源」、「被动扫描」等主题展开。

今天看了一篇关于知名安全机构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.yaml404page.html都位于公开的 GitHub 代码库中——指纹信息可以直接读取,无需事先接触基础设施。我们针对实际部署验证了预期的标头,并对 Censys 运行了这两个查询。

联合扫描返回了 236 个不同的主机。默认配置足够明确,一次查询就能捕获大部分主机。更难的是理解这些主机代表什么。

Censys ARC 透视图

主机分布在多个 ASN 和地理位置,集群表明存在有组织的部署。

港口配送

港口数数笔记
4321
46
默认团队服务器端口
43211
15
通用信标监听端口
8080
//8443``8989
每人约3个
非默认团队服务器端口
各种(1337,,,等等99998562
50岁以上
运营商选择非标准端口

端口上的 46 次命中4321证实,许多运营商使用默认配置进行部署,并且端口保持不变。15 次命中43211集中在下文所述的三个信标监听器集群中的两个集群上。

顶级ASN

ASN姓名主持人笔记
AS29802
HVC-AS(蜂巢速度)
13
信标监听器集群;在多个区域观察到多个活跃的 AdaptixC2 服务器23.227.203.0/2446.21.153.0/24
AS9009
M247
9
信标监听器集群38.132.122.x146.70.87.x
AS132203
腾讯
7
端口4321;服务器托管于腾讯云香港和中国大陆区域
AS9081
PSB主机
6
信标监听器集群45.155.69.x
AS20473
沃尔特
5
地理分布

地理分布

国家主机
美国
38
香港
18
中国
14
荷兰
12
新加坡
8
德语
8
FR
5
俄罗斯
3

美国服务器数量较多部分原因是 Hivelocity 是一家总部位于美国的供应商,而且这些主机几乎可以肯定是信标监听器而非团队服务器。香港和中国大陆的主机集群位于腾讯云上,这与总部位于东亚或目标市场为该地区的运营商相符。

受关注的主机

IP端口笔记
185.190.142[.]664321
Contabo FR;RDP(3389)也已开放;O=OpenClaw端口上的证书443
89.125.255[.]294321
RoyaleHosting NL ;自签名证书C=RU,,ST=as``O=as
38.147.173[.]248562
Lucidacloud HK;端口50050也已开放
156.225.22[.]2011337
CognetCloud HK;非标准端口
202.95.8[.]92 / .97 / .984321
CTG 服务器 HK;三个连续的 IP 地址

该证书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 req
  • M247 集群。38.132.122.x分布在两个子网(和)中的八个 IP 地址146.70.87.x,几乎全部使用端口43211。与 Hivelocity 集群使用相同的默认 OpenSSL 证书。M247 是红队和灰色地带基础设施的热门选择。共享端口和共享证书模式表明它们由同一运营商或同一部署工具提供支持。
  • **PSB 托管集群。**六个 IP 地址分布在两个子网(45.155.69.x185.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.sh479b7abd5df2f6ab3de8c32a36478c15012dbc8217f9fa825fd4b9cb7e9b8d13
Linux 持久化安装程序
timesync.binfb1f4f5a4ef76960577462634f4a104fb307e161fc2791b9231a07a2c751beca
Gopher代理(ELF x64)
svhost.exe06b13dfd84493b01a020eecdabff6308b5b790ed4cd4c7a96a30ae6be1ca325d
Beacon(Windows x64)
svc_timesync.x64.exe7d35d687ae8d4056e394905e9f8962512e6d55ff98664ed1facee6554a565624
Beacon(Windows x64)
agent.x86.exe51fba778dae6f108f7afa800bdb7745e6a0f6d2630a37ecc84c1d4a1609f9692
Beacon(Windows x86)

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 个独立的持久化机制并建立它们,之后自行销毁。

  1. 隐藏用户— 创建systemd-timesync(UID 9999),使用随机密码和硬编码的操作员 SSH 密钥authorized_keys。SSH 访问权限在代理移除后仍然存在。
  2. 伪造的 systemd 服务——覆盖systemd-timesyncd.service以执行信标,伪装成 NTP 同步守护进程。
  3. 三个定时任务分别在不同的 crontab 位置运行,时间间隔分别为 5 分钟、10 分钟和 15 分钟。任何一个任务成功运行后,代理程序都会重启。
  4. Initramfs hook — 将脚本放入/etc/initramfs-tools/scripts/init-premount/并重建 initrd update-initramfs。代理在根文件系统挂载之前运行。
  5. GRUB 初始化替换——追加init=/usr/local/lib/systemd/systemd-persistence.shGRUB_CMDLINE_LINUX_DEFAULT重建内核。grub.cfg.内核在下次启动时将进程 ID 1 交给攻击者的脚本,而不是 systemd。即使服务被移除、cron 清除任务被执行或用户被删除,此操作仍然有效。
  6. LD_PRELOAD 库——负责写入和编译libsystemd-override.so,已在 GCC 中注册/etc/ld.so.preload。GCC 构造函数会导致每个动态链接的进程 fork 并执行该 beacon。仅仅删除该二进制文件是不够的。
  7. 内核线程伪装——两个信标实例以[kworker/0:0][kthreadd]通过启动exec -a,混入 ps 输出中的内核线程条目。
  8. 完整性监视器monitor.sh以 身份运行,每 60 秒检查一次,如果代理不存在[kworker/u:0]则从 重新下载代理。hxxp://2.26.229[.]254:7000/timesync.bin
  9. Shell 配置文件注入— 将代理启动添加到.bashrc每个.profile用户/home/*和 root 用户。
  10. DNS劫持——将其设置2.26.229[.]254为主systemd-resolvedDNS服务器。所有DNS查询都将通过C2主机路由。
  11. eBPF hook — 如果bpftool存在,则在返回 0 时加载 kprobe sys_getdents64,尝试从目录列表中隐藏进程。
  12. 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.0
  • RC4密钥: 1baccab4cbd2b84f6bc54bf8e6551f93
  • 睡眠: 10 秒

API界面

团队服务器的 REST API 在 [此处应填写 API 文档名称]server.go和 [此处应填写 API 文档名称] 中有详细说明connector.go。以下是其背后的原理。

身份验证流程:

  1. POST /endpoint/login操作员使用 JSON 凭据正文进行调用。服务器返回访问令牌(12 小时)和刷新令牌(168 小时)。
  2. Authorization: Bearer <token>操作员会在所有后续请求中附加访问令牌。
  3. 在打开 WebSocket 通道之前,操作员调用POST /endpoint/otp/generate获取一次性令牌,然后通过 GET 进行升级/endpoint/connect?otp=<token>
  4. POST /endpoint/refresh过期的访问令牌通过刷新令牌进行刷新。

身份验证和会话:

端点方法身份验证目的
/login
邮政
没有任何
颁发访问令牌和刷新令牌
/refresh
邮政
没有任何
使用刷新令牌轮换访问令牌
/otp/generate
邮政
JWT
为 WebSocket 或文件传输生成一次性密码
/otp/upload/temp
邮政
OTP
上传文件以供代理任务执行
/otp/download/sync
得到
OTP
从服务器下载文件
/connect
GET(WS)
OTP
打开操作员 WebSocket 通道
/channel
GET(WS)
OTP
开启辅助通道(终端/构建/隧道)
/sync
邮政
JWT
同步连接运算符的状态

代理和任务:

端点方法目的
/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
邮政
启动 SOCKS5 代理隧道
/tunnel/start/lportfwd
邮政
启动本地端口转发
/download/list
得到
从代理中提取的列表文件
/targets/list
得到
列出已跟踪的目标主机

无需身份验证即可公开哪些信息,哪些信息不会公开。

当密码设置正确时,团队服务器管理 API 的安全性相当高。团队服务器端口上未经身份验证的访问面有限:

端点身份验证它揭露了什么
ANY /<path>
没有任何
Server: AdaptixC2
以及Adaptix-Version: v1.2标题;404 正文带有品牌标识
POST /endpoint/login
没有任何
如果密码正确,则返回令牌;否则返回 404 错误。
POST /endpoint/refresh
没有任何
如果刷新令牌有效,则返回新的访问令牌;否则返回 404。

所有 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.yamlbe4c0149.

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[.]97202.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[.]20543211
HVC-AS
默认 OpenSSL 证书
46.21.153[.]14643211
HVC-AS
相同的证书;随机高端口
46.21.153[.]14843211
HVC-AS
相同的证书;随机高端口

M247信标监听器集群:

IP端口ASN笔记
38.132.122[.]14143211
M247
默认 OpenSSL 证书
38.132.122[.]14543211
M247
同一证书
38.132.122[.]16143211
M247
同一证书
146.70.87[.]2343225
M247
相同的证书模式
146.70.87[.]6443211
M247
相同的证书模式
146.70.87[.]9643211
M247
相同的证书模式
146.70.87[.]21842445
M247
相同的证书模式
146.70.87[.]23743211
M247
相同的证书模式

PSB 托管信标监听器集群:

IP端口ASN笔记
45.155.69[.]10642211
PSB主机
随机高端口
45.155.69[.]15343345
PSB主机
同样的模式
45.155.69[.]17542455
PSB主机
同样的模式
185.242.245[.]444355
PSB主机
同样的模式
185.242.245[.]2744875
PSB主机
同样的模式
185.242.245[.]12042534
PSB主机
同样的模式

受关注的主机:

IP端口笔记
185.190.142[.]664321
Contabo FR;RDP 已打开;O=OpenClaw端口证书443
89.125.255[.]294321
RoyaleHosting NL;C=RU, ST=as, O=as 证书
38.147.173[.]248562
Lucidacloud HK;端口50050也已开放
156.225.22[.]2011337
CognetCloud HK
202.95.8[.]924321
CTG 服务器 HK;顺序与.97.98
167.17.47[.]121443
//4321``53
TRUNKNETWORKS-AS SG;团队服务器 + 活动 DNS 信标监听器(dns.version: "OK"
91.230.94[.]2354321
/53
NetRack-AS RU;团队服务器 + 活动 DNS 信标监听器(dns.version: "OK"

**样本和工件(**2.26.229[.]254 

文件名SHA256类型
install.sh479b7abd5df2f6ab3de8c32a36478c15012dbc8217f9fa825fd4b9cb7e9b8d13
Linux 持久化安装程序
timesync.binfb1f4f5a4ef76960577462634f4a104fb307e161fc2791b9231a07a2c751beca
Gopher代理(ELF x64)
svhost.exe06b13dfd84493b01a020eecdabff6308b5b790ed4cd4c7a96a30ae6be1ca325d
Beacon(Windows x64)
svc_timesync.x64.exe7d35d687ae8d4056e394905e9f8962512e6d55ff98664ed1facee6554a565624
Beacon(Windows x64)
agent.x86.exe51fba778dae6f108f7afa800bdb7745e6a0f6d2630a37ecc84c1d4a1609f9692
Beacon(Windows x86)

操作员 SSH 公钥(硬编码install.sh):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIoi/bPuWr2EOQZo2OVDqG8XsRMz5epEGqG9sjcwZGJ1 timesync-manager

任何主机上存在此密钥authorized_keys都会将感染与该操作员联系起来。

BeaconHTTP RC4 密钥(从 Windows 样本中提取): 1baccab4cbd2b84f6bc54bf8e6551f93

代理水印

代理人默认水印
Beacon(C++)
be4c0149
地鼠(Go)
904e5493

在 Censys 上查找 AdaptixC2 基础设施

该数据集中的所有主机在 Censys 中均被标记为Adaptix C2威胁标签 ( THREAT-0210 )。威胁检测涵盖了默认的基于标头的检测和基于正文的回退检测,包括“TestCoonection”规避变体。

host.services.threats.name: "Adaptix C2" or web.threats.name: "Adaptix C2"

要点总结

  1. **默认品牌标识使得被动检测变得轻而易举。**由于这些Server: AdaptixC2Adaptix-Version: v1.2 头是在错误处理程序中设置的,而不是在特定路由中设置的,因此它们会出现在每个未经身份验证的请求中。无需任何凭据或端点信息即可识别默认配置部署。
  2. 试图规避响应头的运营商会保留响应体字符串。 “TestCoonection”变体证实,至少有一个运营商修改了响应头以避免被检测,但保留了默认的 404 页面。基于响应体的检测可以捕获此类规避行为。防御者应该同时查询这两个信号。
  3. 三个信标监听器集群表明存在协同的多服务器操作。Hivelocity、M247 和 PSB 集群——可通过连续的 IP 地址、共享端口和相同的默认 OpenSSL 证书来识别——可能代表运行冗余回调基础设施的单个运营商。共享证书模式是集群的标志。
  4. 外部可见性因传输方式而异。BeaconHTTP、BeaconDNS 和 BeaconTCP 都会暴露套接字,被动扫描可以访问到这些套接字。BeaconSMB 则不会——SMB 扩展程序不会在团队服务器上绑定任何套接字,而且命名管道位于已被攻破的受害者服务器上。如果攻击者在初始访问后完全依赖 SMB 进行攻击,那么互联网扫描器将无法发现任何痕迹。此处统计的部署必须至少保持一个外部可访问的监听器运行。
  5. **覆盖 236 台主机的 412 个网站资产是一个值得监控的群体——但需要注意的是,被动扫描无法区分授权活动和未经授权的活动。**其中一些是授权的红队演练活动。被动扫描无法区分它们与未经授权的活动。它能做的是揭示基础设施,以便分析人员自行做出判断。该指纹已投入生产环境 (THREAT-0210),涵盖基于头部和基于主体的检测路径,包括规避变体。防御者可以使用上述查询在其威胁情报管道中识别 AdaptixC2 部署。

作者

艾丹·霍兰德

高级安全研究员

艾丹·霍兰德是Censys ARC的高级安全研究员,专长于威胁情报和全网安全研究。他的工作重点是识别和分析恶意基础设施、追踪威胁行为者,以及开发大规模安全分析工具。艾丹积极参与开源安全社区,构建并维护用于威胁狩猎、数据分析和安全自动化的工具。(原文链接:https://censys.com/blog/adaptixc2-open-source-c2-framework)

转载声明:本文转载自原发布平台 (作者:小白安全成长记), 原文标题《AdaptixC2:大规模开源C2框架的特征识别》, 查看原文。 版权归原作者及原发布平台所有,本站仅作收录与展示,未对正文内容作实质性修改; 若涉及侵权请联系本站处理。