
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 출력의 Function 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와 모든 암호화된 데이터를 덮어씁니다.리스너는 세 가지 형식을 모두 감지하고 올바르게 처리합니다.
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
adaptix-serverless-c2/
agent/
src_beacon/ # Kharon implant (C++ source)
src_loader/ # Loader wrappers (EXE, DLL, SVC)
deploy/
aws/
main.tf # Lambda + DynamoDB + IAM + KMS
variables.tf # Terraform variables
outputs.tf # Output Lambda URL and table ARNs
lambda/
main.go # Lambda relay handler
listener/
pl_main.go # AdaptixC2 plugin entry (Teamserver interface)
pl_transport.go # DynamoDB polling, Kharon protocol, LokyCrypt
ax_config.axs # Listener creation UI
config.yaml # Plugin metadata
kharon/
agent_kharon/ # AXS commands + config for Kharon agent extender
listener_kharon_http/ # AXS + config for Kharon HTTP listener extender
patches/ # AdaptixC2 source patches
profiles/
lambda_default.json # Malleable profile for Lambda URL
scripts/
install.sh # Full install into AdaptixC2
uninstall.sh # Reverse patches + cleanup
build_relay.sh # Cross-compile Lambda binary
build_agent.sh # Build Kharon agent shellcode
build_objects.sh # Build beacon objects
deploy_infra.sh # Terraform init + apply