
Adaptix C2 서비스 플러그인으로, 운영자 UI에서 LitterBox 페이로드 분석을 구동합니다.

Adaptix용 사전 점검 페이로드 QA, LitterBox 기반.
Cheshire는 Adaptix 클라이언트를 LitterBox 샌드박스에 연결하는 Adaptix C2 서비스 플러그인입니다. 운영자는 Adaptix UI 안에서 임의의 바이너리를 선택하여 LitterBox의 전체 분석기 체인(정적 + 동적 + 도달 가능한 모든 EDR 프로필)을 통해 전달하고, Adaptix를 떠나지 않고도 판정 결과가 도출되는 것을 지켜볼 수 있습니다.
이름은 프로젝트 마스코트 계보를 따릅니다:
| 동작 | LitterBox 엔드포인트 | 결과 |
|---|---|---|
| 페이로드 업로드 | POST /upload | md5 + 파일 메타데이터 |
| Run All | POST /analyze/static/<md5> + /analyze/dynamic/<md5> + /analyze/edr/<profile>/<md5> (×N 프로필)을 병렬 고루틴으로 실행 | 각각 완료되는 대로 Static, Dynamic, 모든 EDR 프로필 반영 |
| 정적 분석만 | /analyze/static/<md5> | YARA / CheckPlz / Stringnalyzer 결과 |
| 동적 분석만 | /analyze/dynamic/<md5> | YARA-mem / PE-Sieve / Moneta / Patriot / HSB / RedEdr 결과 |
| EDR (다중) | 프로필별 /analyze/edr/<profile>/<md5> + /api/results/edr/<profile>/<md5>에 대한 Phase 2 폴링 | 프로필별 알림 테이블 + 종합 알림 상세(이유, MITRE, API, 메모리 영역, 호출 스택, 최종 사용자 모듈, 프로세스, 부모 프로세스, EDR 응답) |
| 정리 | DELETE /file/<md5> | LitterBox에서 업로드 + 결과 폴더 + 샘플별 분석 디렉터리 제거 |
| Fleet 프로브 | GET /health | 샌드박스 상태, 스캐너 인벤토리, EDR 에이전트 연결 가능 여부 — EDR 프로필 체크박스 구동 |
EDR Phase 2 폴링은 LitterBox의 적응형 주기를 사용합니다(기본 2초, 알림 수가 안정적이면 ×1.5 백오프로 최대 15초까지, 변화가 생기면 2초로 복귀). 각 폴링 틱마다 progress 이벤트가 클라이언트로 스트리밍되어 실시간 진행 표시줄에 알림 수가 실시간으로 증가하는 모습을 보여줍니다.
Cheshire/
├── README.md
├── setup_cheshire.sh deploy script
└── cheshire_service/
├── config.yaml service plugin manifest + litterbox_url
├── go.mod / go.sum
├── Makefile builds dist/service_cheshire.so
├── pl_main.go Go service plugin (HTTP client to LitterBox)
└── ax_config.axs AXScript UI (the dashboard dialog)
Go 플러그인은 Adaptix의 TsServiceSendDataClient와 LitterBox의 REST API 간 무상태 HTTP 릴레이입니다. AXScript 파일은 모든 렌더링(판정 배너, 탐지 요약, 스캐너별 하위 탭, 클릭하여 상세 정보를 볼 수 있는 EDR 알림 테이블)을 담당합니다.
Cheshire를 사용하려면 실행 중인 LitterBox 인스턴스가 필요합니다(설치 방법은 LitterBox 저장소 참조). 연결 가능 여부를 확인합니다:
curl http://<litterbox-host>:1337/health
cheshire_service/config.yaml을 편집하고 litterbox_url을 설정합니다:
extender_type: "service"
extender_file: "service_cheshire.so"
ax_file: "ax_config.axs"
service_name: "cheshire"
service_config: |
litterbox_url: "http://192.168.88.128:1337"
litterbox_url이 없으면 플러그인은 로드되지만 모든 운영자 명령은 "Cheshire is not configured: set litterbox_url in service_config"를 반환합니다. 대체 기본값은 없습니다.
bash setup_cheshire.sh --ax /path/to/AdaptixC2
이 스크립트는 다음을 수행합니다:
AdaptixC2/AdaptixServer/extenders/cheshire_service/에 복사합니다../extenders/cheshire_service를 추가합니다.service_cheshire.so를 빌드합니다..so + config.yaml + ax_config.axs를 AdaptixC2/dist/extenders/cheshire_service/에 복사합니다.AdaptixC2/dist/profile.yaml의 Teamserver.extenders 아래에 한 줄을 추가합니다:
extenders:
- "extenders/cheshire_service/config.yaml"
...
pkill -f adaptixserver
cd AdaptixC2/dist
./adaptixserver -profile profile.yaml
서버 로그에 [cheshire] Initialized — LitterBox at http://...가 표시되고, 이어서 [+] Service 'cheshire' loaded가 표시되어야 합니다.
Adaptix 클라이언트 메뉴 바에서 Cheshire → Test with Cheshire를 선택하면 대시보드가 열립니다.
┌─ Payload ───────────────────────────────────────────────────────────────┐
│ [Browse...] /home/op/payloads/beacon.exe │
├─ EDR Profiles ──────────────────────────────────────────────────────────┤
│ ☑ Elastic Defend ● reachable elastic · WIN-VM01 · nightcity │
│ ☐ Fibratus ● not reachable fibratus │
├─ Dynamic Analysis Args ─────────────────────────────────────────────────┤
│ --quiet -p 4444 │
├─────────────────────────────────────────────────────────────────────────┤
│ [Run All] | [Static] [Dynamic] [EDR] | [Cleanup] Uploaded: ... │
├─────────────────────────────────────────────────────────────────────────┤
│ 🚫 DETECTED — 5 hit(s) across 2 Static, 1 Dynamic [CRITICAL] │
│ ✓ Static ✓ Dynamic 🔄 elastic (2) │
├─ Detection Summary ─────────────────────────────────────────────────────┤
│ Severity | Scanner | Detection | Detail │
│ CRITICAL | Static · CheckPlz | Trojan:Win64/... | offset 0x20EF │
│ CRITICAL | Static · YARA | mimikatz_strings | matched $sek... │
│ HIGH | Dynamic · PE-Sieve | 3 modifications | 3 IAT hooks │
│ ... │
├─ Static | Dynamic | EDR ────────────────────────────────────────────────┤
│ per-scanner sub-tabs with stat strip + bordered finding cards │
└─────────────────────────────────────────────────────────────────────────┘
⏳ RUNNING — N hit(s) so far가 표시됩니다.🚫 DETECTED — N hit(s) across X Static, Y Dynamic, Z EDR [maxSev]가 표시됩니다.✓ CLEAN — 0 critical/high/medium detections가 표시됩니다. 정보성 신호(LOW/INFO)는 헤드라인이 아닌 별도로 표기됩니다.(Static only) / (Dynamic + EDR) 등이 추가됩니다 — 판정은 실제로 실행된 내용을 정확히 반영합니다.모든 스캐너의 모든 탐지를 하나의 정렬 가능한 테이블로 집계합니다. 행은 LitterBox가 반환하는 실제 JSON에서 추출됩니다(일반적인 요소 문자열이 아님):
initial_threat + scan_results.detection_offsettotal_suspicious + 지표별 개수total_* 변칙 개수(Private RWX → CRITICAL 등)level + type + details의 첫 120자category === 'threat'로 필터링된 RedEdr Defender 이벤트심각도 내림차순, 그다음 스캐너 이름순으로 정렬됩니다.
대화상자가 닫히면 현재 샘플의 md5가 DELETE /file/<md5>를 통해 LitterBox에서 삭제됩니다. 작업 사이에 오래된 샘플이 축적되지 않습니다.
Adaptix Client (Qt) ──┐
│ AXScript service_command("cheshire", "run_all", {...})
▼
Adaptix Server ──→ service_cheshire.so ──HTTP──→ LitterBox ──→ EDR VM
│ │ │
│ streams progress events Static / Dynamic │
│ + results back via scanners run on │
│ TsServiceSendDataClient the LitterBox host │
▼ │ │
Adaptix Client renders verdict, detection summary, │ EDR profile
progress strip, per-scanner detail panels. ▼ dispatches
/analyze/edr/<P>/<md5>
Phase 1: exec on EDR VM
Phase 2: poll Elastic
for alerts
Go 서비스 플러그인은 각 스캐너 디스패치를 자체 고루틴으로 실행하므로 Run All은 Static + Dynamic + (EDR 프로필당 하나의 POST)를 모두 병렬로 실행합니다. 각 고루틴이 progress 및 결과 이벤트를 다시 보내면 AXScript 대시보드가 실시간으로 업데이트됩니다.
Cheshire는 LitterBox / Adaptix 규칙을 따릅니다. 자세한 내용은 상위 프로젝트 라이선스를 참조하십시오.