
Cobalt Strike 또는 Sliver C2 프로필에서 Caddy 리디렉터 구성을 생성합니다.
CaddySmith는 Cobalt Strike 또는 Sliver C2 프로필을 읽어서 Caddy 웹 서버 설정을 생성하는 작은 Python 스크립트입니다. 생성된 Caddyfile은 일반 Linux 서버를 리다이렉터로 바꿔줍니다: 합법적인 비콘 트래픽은 팀 서버로 리버스 프록시되고, 그 외 모든 것(스캐너, 검색 봇, 블루 팀 프로브, 임의 curl)은 데코이 URL로 보내집니다.
Apache보다 훨씬 쉽게 빠르게 설정할 수 있는 웹 서버인 Caddy를 사용하기 위해 이 도구를 만들었습니다. Caddy는 단일 정적 바이너리, 자동 Let's Encrypt 인증서, a2enmod 과정이 필요 없습니다.
승인된 작업만 가능합니다. 이는 공격적 보안 도구입니다. 테스트 권한을 서면으로 받은 환경에서만 실행하세요.
CaddySmith는 파일 내용에서 형식을 자동 감지합니다:
set uri "/foo" 지시어가 있는 고전적인 텍스트 형식. 각 HTTP-GET / HTTP-POST URI는 프로필의 클라이언트 헤더가 적용된 정확한 경로 라우트가 됩니다.path /api* /static* /resources*), UA의 Chrome 빌드 번호 하위 문자열 매칭을 수행합니다 (Sliver의 플랫폼별 UA 재작성에도 유지됨).--profile-type cobaltstrike 또는 --profile-type sliver로 특정 파서를 강제할 수도 있습니다.
프로필 파일이 주어지면 스크립트는 다음을 추출합니다:
--server-name을 전달하지 않으면 리다이렉터의 도메인 이름으로 사용)set host_stage)그런 다음 다음과 같은 Caddyfile을 빌드합니다:
.env, /wp-admin, .php 등)pip install 불필요)python3 caddysmith.py my.profile \
--backend https://teamserver.internal:443 \
--decoy https://www.example.com/ \
--server-name redirector.example.com \
--email [email protected] \
--forbid-http \
-o redirector.caddy
이 명령은 생성된 설정을 redirector.caddy에 쓰고 stderr에 수행된 작업 요약을 출력합니다.
생성된 파일을 리다이렉터로 복사하고 Caddy를 실행합니다. Caddy는 기본적으로 JSON 설정을 사용하므로 --adapter caddyfile 플래그가 필요합니다:
caddy run --config /etc/caddy/redirector.caddy --adapter caddyfile
실행 중인 인스턴스에 업데이트된 설정을 다시 로드하려면:
caddy reload --config /etc/caddy/redirector.caddy --adapter caddyfile
Caddy가 형식 불일치에 대해 경고하면 다음으로 정리하세요:
caddy fmt --overwrite /etc/caddy/redirector.caddy
파일을 /etc/caddy/에 넣고 메인 Caddyfile에서 가져옵니다:
# /etc/caddy/Caddyfile
import /etc/caddy/redirector.caddy
--email을 전달했다면 (권장), 생성된 스니펫에 전역 옵션 블록이 이미 포함되어 있으므로 메인 Caddyfile에는 import 줄만 있으면 됩니다. 전달하지 않았다면 { } 블록에 이메일을 수동으로 추가하고 import 위에 넣으세요.
그런 다음 검증 및 다시 로드:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
A 레코드가 리다이렉터를 가리키는 한 Caddy는 --server-name 도메인에 대해 Let's Encrypt 인증서를 자동으로 프로비저닝합니다.
보통은 strict를 원합니다. Lax는 실제 비콘이 연결되지 않는 이유를 디버깅할 때 유용합니다.
Amazon 엔드포인트를 모방하는 프로필이 있고 redirector.0xtb.sh에 배포하려는 경우:
python3 caddysmith.py amazon.profile \
--backend https://10.1.1.10:443 \
--decoy https://www.amazon.com/ \
--server-name redirector.0xtb.sh \
--forbid-http \
--policy strict \
-o /etc/caddy/redirector.caddy
요약은 어떤 경로가 생성되었는지 정확히 보여줍니다. 예:
Routes built: 2
- [profile-get] /broadcast
- [profile-post] /1/events/com.amazon.csm.csa.prod
다시 생성했는데 경로가 없다면 스크립트가 프로필을 구문 분석하지 못한 것입니다. stderr의 경고를 확인하세요.
Sliver 임플란트 설정 (JSON)의 경우:
python3 caddysmith.py sliver-implant.json \
--backend https://10.1.1.10:443 \
--decoy https://www.amazon.com/ \
--server-name redirector.0xtb.sh \
--email [email protected] \
--forbid-http \
--policy strict \
-o /etc/caddy/redirector.caddy
요약은 Sliver가 감지되었음을 알리고 접두사 경로를 보여줍니다:
Profile type: sliver
Routes built: 1
- [sliver] /api /public /resources /services /static (prefix)
Sliver는 path × file × extension 조합에서 무작위로 URI를 생성하므로, 생성된 path 매처는 정확한 경로 대신 접두사 glob (path /api* /public* /resources* /services* /static*)을 사용합니다. User-Agent 매처는 Chrome 빌드 번호의 하위 문자열 (예: 3921.146)을 사용하는데, Sliver가 플랫폼별 UA 재작성에서 이를 유지합니다.
# 일반 HTTP는 403이어야 함 (--forbid-http 사용 시)
curl -I http://redirector.0xtb.sh/
# 베어 호스트네임은 데코이로 리디렉션되어야 함
curl -kI https://redirector.0xtb.sh/
# 잘못된 UA도 리디렉션되어야 함
curl -kI -A "curl/8.4.0" https://redirector.0xtb.sh/broadcast
# 올바른 UA + 경로를 가진 요청은 프록시 통해 200 반환
# strict 모드에서는 프로필의 모든 클라이언트 헤더도 함께 보내야 함
set host_stage "true"가 있거나 전혀 설정되지 않은 경우, 스크립트는 경고하고 스테이저 URI를 건너뜁니다. 프로필에 set host_stage "false";를 추가하거나 --extra-uri를 통해 스테이저 URI를 명시적으로 전달하세요./api, /static 등으로 시작하는 모든 URL을 차지합니다. 이러한 접두사를 사용하는 스캐너 프로브 (예: /api/.env)는 로컬에서 차단되지 않고 팀 서버로 전송되지만, Sliver 자체 HTTP 전송은 임플란트 ID를 통해 인증하므로 승인되지 않은 요청은 C2 계층에서 거부됩니다. UA 게이팅은 여전히 대부분의 스캐너를 차단합니다.--backend로 프록시됩니다. 여러 팀 서버가 필요한 경우 스크립트를 여러 번 실행하고 수동으로 병합하세요.set uri "/path1 /path2";는 작동하지만 (한 줄에 여러 경로), 특이한 서식은 파서를 혼란시킬 수 있습니다. 요약의 경로 목록을 확인하세요.tls_insecure_skip_verify가 포함됩니다. 백엔드에 실제 인증서가 있는 경우 생성된 파일에서 해당 줄을 삭제하세요.Apache 기반 Malleable-Redirector가 이 스크립트가 생성하는 것의 시작점이었으며, 동일한 세 가지 트랙 URI 모델 (프로필 URI / 추가 URI / 느슨한 URI), 동일한 정책 모드, 동일한 일반적인 레이아웃을 사용합니다. CaddySmith는 출력을 Apache .htaccess 대신 Caddy 구문으로 변환합니다.
MIT
| 플래그 | 기본값 | 설명 |
|---|
profile | (필수) | .profile 파일 경로 |
--backend | https://teamserver.local:443 | 일치하는 트래픽을 프록시할 위치 |
--decoy | https://www.example.com/ | 일치하지 않는 트래픽의 리디렉션 대상 |
--server-name | c2.example.com | 리다이렉터의 도메인 이름 |
--policy | strict | strict, lax 또는 none |
--profile-type | auto | cobaltstrike 또는 sliver 강제 (기본값: 자동 감지) |
--extra-uri PATH | — | 프록시할 추가 URI (UA 검사 포함). 반복 가능. |
--lax-uri PATH | — | 프록시할 추가 URI (검사 없음). 반복 가능. |
--allow-ua STRING | — | --extra-uri 경로에서 허용할 추가 UA. 반복 가능. |
--forbid-http | off | 일반 HTTP에 403 반환 |
--email EMAIL | — | Let's Encrypt 등록 및 갱신 알림을 위한 이메일 |
-o, --output FILE | stdout | 설정을 파일에 작성 |