用于 AdaptixC2 v1.2 的无服务器 C2 传输插件,使用 AWS Lambda + DynamoDB 作为中继基础设施。

用于 AdaptixC2 v1.2 的 Serverless C2 传输插件,使用 AWS Lambda + DynamoDB 作为中继基础设施。Agent 流量表现为发往 AWS 端点的出站 HTTPS,C2 服务器无需开放任何入站端口或公网 IP。
Kharon Agent (target)
|
| HTTPS GET/POST (outbound only, randomly alternated)
v
AWS Lambda Function URL (stateless relay)
|
| Store inbound / Poll outbound (up to 8s)
v
DynamoDB (inbound + outbound tables)
^
| Poll every 5 seconds
|
Listener Plugin (inside AdaptixC2)
|
| TsAgent API + TsExtenderData (key persistence)
v
AdaptixC2 Teamserver + UI
数据流:
inbound 表中outbound 表,最长持续 8 秒(弥合注册过程中的异步间隙)inbound 表以获取未处理的记录outbound 中| 组件 | 路径 | 用途 |
|---|---|---|
| Kharon agent | agent/ | 捆绑的 Kharon 植入体(C++ 源码) |
| Terraform | deploy/aws/ | Lambda + DynamoDB + IAM + KMS 基础设施 |
| Lambda 中继 | deploy/aws/lambda/ | 无状态 HTTP 到 DynamoDB 代理,带出站轮询 |
| 监听器插件 | listener/ | AdaptixC2 插件、DynamoDB 轮询、Kharon 协议桥接 |
| Kharon 配置 | kharon/ | 用于 agent/监听器扩展器的 AXS 命令注册和配置 |
| 补丁 | patches/ | 用于支持 BeaconServerless 的 AdaptixC2 源码补丁 |
| 配置文件 | profiles/ | 用于 Lambda URL 的 Malleable HTTP 配置文件 |
| 脚本 | scripts/ | 安装、构建、部署、卸载 |
aws configure)apt install clang lldapt install nasmapt install binutils-mingw-w64-x86-64在 AWS 控制台中:
adaptix-deployerAmazonDynamoDBFullAccessAWSLambda_FullAccessIAMFullAccessCloudWatchLogsFullAccess{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"kms:*","Resource":"*"}]}KMSFullAccessaws configure
# AWS Access Key ID: <paste access key>
# AWS Secret Access Key: <paste secret key>
# Default region: us-east-1
# Default output format: json
验证:
aws sts get-caller-identity
# Build the Lambda relay binary (cross-compiled for Amazon Linux)
./scripts/build_relay.sh
# Deploy Lambda + DynamoDB + IAM with Terraform
./scripts/deploy_infra.sh
# Note the Lambda Function URL from the output, e.g.:
# lambda_function_url = "https://xxxxx.lambda-url.us-east-1.on.aws"
./scripts/install.sh /path/to/AdaptixC2
此脚本将:
dist/ 目录(证书、数据库、配置文件)GOEXPERIMENT 标志.so)BeaconServerless 监听器relay_api_key 匹配)profiles/lambda_default.json 上传 malleable 配置文件BeaconServerless 监听器生成 Kharon agentdeploy/aws/terraform.tfvars)region = "us-east-1"
function_name = "adaptix-relay"
relay_api_key = "your-secret-key-here"
tags = {
Project = "adaptix-serverless"
}
| 字段 | 描述 | 默认值 |
|---|---|---|
| AWS Region | 部署基础设施所在的区域 | us-east-1 |
| Lambda URL | 来自 Terraform 输出的函数 URL | (必填) |
| Relay API Key | 必须与 Terraform 的 relay_api_key 匹配 | (可选) |
| Inbound Table | 用于 agent 签到的 DynamoDB 表 | adaptix-inbound |
| Outbound Table | 用于服务器响应的 DynamoDB 表 | adaptix-outbound |
| Poll Interval | 检查 DynamoDB 的频率(秒) | 5 |
| TTL Hours | DynamoDB 记录过期时间 | 24 |
Kharon agent 通过 HTTP 使用自定义二进制协议:
[36-byte UUID][encrypted_checkin_data][16-byte LokyCrypt key][36-byte UUID][encrypted_payload](无尾部密钥)TotalLen-16 的 16 字节密钥会重叠到 UUID 区域。对于 44 字节的数据包,密钥从偏移 28 开始,覆盖 UUID 字节 28-35 以及所有加密数据。监听器会检测全部三种格式并正确处理它们。
Lambda + DynamoDB 的异步特性意味着当 Lambda 首次检查响应时,监听器尚未处理入站记录。Lambda 在存储入站记录后会轮询出站表最多 8 秒,为监听器留出处理并排队响应的时间。这对注册至关重要(Checkin 响应必须在 Checkin 阶段到达,而不是在之后的 GetTask 阶段)。
Agent 加密密钥通过 TsExtenderDataSave/TsExtenderDataLoad(由 SQLite 支持)持久化。这可以在服务重启后保留。重启时,监听器在遇到已知 agent ID 时会从持久化存储中恢复密钥。
Kharon 会在 GET 和 POST 请求之间随机交替(HTTP_METHOD_USE_BOTH)。GET 请求将数据放在 id 查询参数中(按 profile 进行 base64 编码)。POST 请求将原始二进制数据放在 HTTP body 中。Lambda 会透明地处理这两种情况。
*.lambda-url.*.on.aws 端点的出站 HTTPS# Remove plugin from AdaptixC2
./scripts/uninstall.sh /path/to/AdaptixC2
# Destroy AWS infrastructure
cd deploy/aws && terraform destroy