
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 に保存する| コンポーネント | パス | 目的 |
|---|---|---|
| Kharon エージェント | agent/ | 同梱の Kharon インプラント(C++ ソース) |
| Terraform | deploy/aws/ | Lambda + DynamoDB + IAM + KMS インフラストラクチャ |
| Lambda リレー | deploy/aws/lambda/ | アウトバウンドポーリングを備えたステートレスな HTTP-to-DynamoDB プロキシ |
| リスナープラグイン | listener/ | AdaptixC2 プラグイン、DynamoDB ポーリング、Kharon プロトコルブリッジ |
| Kharon 設定 | kharon/ | エージェント/リスナーエクステンダー用の AXS コマンド登録と設定 |
| パッチ | patches/ | BeaconServerless サポート用の AdaptixC2 ソースパッチ |
| プロファイル | profiles/ | Lambda URL 用の Malleable HTTP プロファイル |
| スクリプト | 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"
}
| フィールド | 説明 | デフォルト |
|---|---|---|
| AWS Region | インフラがデプロイされるリージョン | us-east-1 |
| Lambda URL | Terraform出力からの関数URL | (必須) |
| Relay API Key | Terraformのrelay_api_keyと一致する必要あり | (任意) |
| 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秒間アウトバウンドテーブルをポーリングし、リスナーがレスポンスを処理してキューに入れる時間を確保します。これは登録にとって重要です (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