
AdaptixC2 v1.2 向けのサーバーレス C2 トランスポートプラグイン。AWS Lambda + DynamoDB をリレーインフラストラクチャとして使用します。

AWS Lambda + DynamoDB をリレーインフラとして使用する、AdaptixC2 v1.2 向けのサーバーレス C2 トランスポートプラグイン。エージェントのトラフィックは 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 テーブルをポーリング(登録時の非同期ギャップを橋渡し)inbound テーブルからポーリングoutbound に保存| Component | Path | Purpose |
|---|---|---|
| Kharon agent | agent/ | 同梱の Kharon インプラント(C++ ソース) |
| Terraform | deploy/aws/ | Lambda + DynamoDB + IAM + KMS インフラ |
| Lambda relay | deploy/aws/lambda/ | アウトバウンドポーリング付きのステートレス HTTP-to-DynamoDB プロキシ |
| Listener plugin | listener/ | AdaptixC2 プラグイン、DynamoDB ポーリング、Kharon プロトコルブリッジ |
| Kharon configs | kharon/ | エージェント/リスナーエクステンダー用の AXS コマンド登録と設定 |
| Patches | patches/ | BeaconServerless サポート用の AdaptixC2 ソースパッチ |
| Profiles | profiles/ | Lambda URL 用の Malleable HTTP プロファイル |
| Scripts | scripts/ | インストール、ビルド、デプロイ、アンインストール |
aws configure)apt install clang lldapt install nasmapt install binutils-mingw-w64-x86-64AWS コンソールにて:
adaptix-deployer と命名AmazonDynamoDBFullAccessAWSLambda_FullAccessIAMFullAccessCloudWatchLogsFullAccess{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"kms:*","Resource":"*"}]}KMSFullAccess と命名aws 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 エージェントを生成deploy/aws/terraform.tfvars)region = "us-east-1"
function_name = "adaptix-relay"
relay_api_key = "your-secret-key-here"
tags = {
Project = "adaptix-serverless"
}
| Field | Description | Default |
|---|---|---|
| AWS Region | インフラがデプロイされているリージョン | us-east-1 |
| Lambda URL | Terraform 出力の Function URL | (required) |
| Relay API Key | Terraform の relay_api_key と一致させる必要あり | (optional) |
| Inbound Table | エージェントチェックイン用の DynamoDB テーブル | adaptix-inbound |
| Outbound Table | サーバーレスポンス用の DynamoDB テーブル | adaptix-outbound |
| Poll Interval | DynamoDB をチェックする頻度(秒) | 5 |
| TTL Hours | DynamoDB レコードの有効期限 | 24 |
Kharon エージェントは 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 とすべての暗号化データを上書きします。リスナーはこれら 3 つのフォーマットすべてを検出し、正しく処理します。
Lambda + DynamoDB の非同期性により、Lambda が最初にレスポンスをチェックした時点では、リスナーがインバウンドレコードを処理していない可能性があります。Lambda はインバウンドレコードを保存した後、最大 8 秒間 outbound テーブルをポーリングし、リスナーがレスポンスを処理してキューに入れる時間を確保します。これは登録にとって重要です(Checkin レスポンスは、後の GetTask ではなく、Checkin フェーズ中に到着する必要があります)。
エージェントの暗号化キーは TsExtenderDataSave/TsExtenderDataLoad(SQLite ベース)を介して永続化されます。これによりサービス再起動後も保持されます。再起動時、リスナーは既知のエージェント ID に遭遇すると、永続ストアからキーを復元します。
Kharon は GET リクエストと POST リクエストをランダムに交互に使用します(HTTP_METHOD_USE_BOTH)。GET リクエストはデータを id クエリパラメータに配置します(プロファイルに従って base64 エンコード)。POST リクエストは生のバイナリを HTTP ボディに配置します。Lambda は両方を透過的に処理します。
*.lambda-url.*.on.aws エンドポイントへのアウトバウンド HTTPS# Remove plugin from AdaptixC2
./scripts/uninstall.sh /path/to/AdaptixC2
# Destroy AWS infrastructure
cd deploy/aws && terraform destroy