
Plugin di servizio Adaptix C2 che gestisce l'analisi dei payload di LitterBox dalla UI dell'operatore.

QA pre-volo del payload per Adaptix, basato su LitterBox.
Cheshire è un plugin di servizio C2 per Adaptix che collega il client Adaptix a una sandbox LitterBox. Dall'interno dell'interfaccia Adaptix, un operatore può selezionare un qualsiasi binario, inviarlo attraverso la catena completa di analisi di LitterBox (statica + dinamica + ogni profilo EDR raggiungibile) e vedere il verdetto materializzarsi senza mai uscire da Adaptix.
Il nome segue la linea delle mascotte del progetto:
| Azione | Endpoint LitterBox | Risultato |
|---|
| Carica payload | POST /upload | md5 + metadati del file |
| Esegui tutto | POST /analyze/static/<md5> + /analyze/dynamic/<md5> + /analyze/edr/<profile>/<md5> (×N profili) in goroutine parallele | Static, Dynamic, ogni profilo EDR popolato al completamento di ciascuno |
| Solo statica | /analyze/static/<md5> | Risultati YARA / CheckPlz / Stringnalyzer |
| Solo dinamica | /analyze/dynamic/<md5> | Risultati YARA-mem / PE-Sieve / Moneta / Patriot / HSB / RedEdr |
| EDR (multi) | /analyze/edr/<profile>/<md5> per profilo + polling di Fase 2 su /api/results/edr/<profile>/<md5> | Tabella alert per profilo + dettaglio completo dell'alert (motivo, MITRE, API, regione di memoria, stack di chiamate, modulo utente finale, processo, padre, risposte EDR) |
| Pulizia | DELETE /file/<md5> | Rimuove upload + cartelle dei risultati + directory di analisi per campione da LitterBox |
| Sonda della flotta | GET /health | Stato della sandbox, inventario scanner, raggiungibilità dell'agente EDR — guida le checkbox dei Profili EDR |
Il polling di Fase 2 EDR usa la cadenza adattiva di LitterBox (base 2s, backoff ×1.5
fino a 15s quando il conteggio degli alert è stabile, ritorno immediato a 2s al movimento).
Ogni tick di polling trasmette un evento progress al client, così la striscia di
avanzamento live può mostrare i conteggi degli alert crescere in tempo reale.
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)
Il plugin Go è un relay HTTP senza stato tra TsServiceSendDataClient di Adaptix e
l'API REST di LitterBox. Il file AXScript gestisce tutto il rendering — banner del
verdetto, riepilogo delle rilevazioni, sotto-schede per scanner, tabella degli alert
EDR con clic per il dettaglio.
Cheshire richiede un'istanza LitterBox in esecuzione (vedi il repo LitterBox per l'installazione). Verifica la raggiungibilità:
curl http://<litterbox-host>:1337/health
Modifica cheshire_service/config.yaml e imposta 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"
Se litterbox_url manca, il plugin si carica ma ogni comando dell'operatore
restituisce "Cheshire is not configured: set litterbox_url in service_config".
Non esiste un default di riserva.
bash setup_cheshire.sh --ax /path/to/AdaptixC2
Questo:
AdaptixC2/AdaptixServer/extenders/cheshire_service/../extenders/cheshire_service al workspace Go.service_cheshire.so tramite il Makefile..so compilato + config.yaml + ax_config.axs in
AdaptixC2/dist/extenders/cheshire_service/.Aggiungi una riga a AdaptixC2/dist/profile.yaml sotto
Teamserver.extenders:
extenders:
- "extenders/cheshire_service/config.yaml"
...
pkill -f adaptixserver
cd AdaptixC2/dist
./adaptixserver -profile profile.yaml
Dovresti vedere [cheshire] Initialized — LitterBox at http://... nel
log del server, seguito da [+] Service 'cheshire' loaded.
Nella barra dei menu del client Adaptix, Cheshire → Test with Cheshire apre la dashboard.
┌─ 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 mentre uno qualsiasi degli scanner pianificati è in esecuzione.🚫 DETECTED — N hit(s) across X Static, Y Dynamic, Z EDR [maxSev] quando ogni scanner pianificato raggiunge uno stato terminale.✓ CLEAN — 0 critical/high/medium detections solo se non ci sono hit reali in nessuno scanner. I segnali informativi (LOW/INFO) sono annotati separatamente, non nel titolo.(Static only) / (Dynamic + EDR) ecc. viene aggiunto quando l'operatore esegue un singolo scanner invece di Run All — il verdetto riflette onestamente ciò che è stato effettivamente eseguito.Aggrega ogni rilevazione di ogni scanner in un'unica tabella ordinabile. Le righe sono estratte dal JSON effettivo che LitterBox restituisce (non stringhe di fattori generiche):
initial_threat + scan_results.detection_offsettotal_suspicious + conteggi per indicatoretotal_* non zero di Moneta (Private RWX → CRITICAL, ecc.)level + type + primi 120 caratteri di detailscategory === 'threat'Ordinati per severità decrescente, poi per nome dello scanner.
Quando la finestra di dialogo si chiude, l'md5 del campione corrente viene rimosso
da LitterBox tramite DELETE /file/<md5>. Nessun campione obsoleto si accumula
tra un'operazione e l'altra.
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
Il plugin di servizio Go esegue ogni invio allo scanner nella propria goroutine,
quindi Run All emette Static + Dynamic + (un POST per profilo EDR) tutto in
parallelo. La dashboard AXScript si aggiorna in tempo reale mentre ogni goroutine
trasmette eventi progress e di risultato.
Cheshire segue le convenzioni di LitterBox / Adaptix. Consulta le licenze del progetto principale per i dettagli.