一个用Go编写的用于初始访问的C2框架
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/dobin/antnium
Antnium
Anti Tanium
一个使用Go语言编写的C2框架和远程访问工具(RAT)。
此源代码是我在演讲《开发你自己的RAT - AV & EDR 防御》(链接)中作为参考公开发布的。Antnium是为了满足我个人的需求而设计的,并不适用于其他人的需求。它适用于我所执行的任务,但并不一定适用于通用的C2框架。
该项目包括两个组件:
- client.exe:实际的RAT / beacon / agent / 植入物
- server.exe:C2服务器
功能
- 支持HTTP/S和Websocket通信通道
- 代理支持(手动配置、Windows代理、身份验证和Kerberos代理)
- 命令执行
- 直接使用LOLbins
- 首先复制文件
- 进程空洞注入
- 交互式cmd.exe/Powershell shell
- 远程管理和非托管代码
- 使用donut
- PE转换为shellcode
- 加密
- AMSI绕过
- 直接使用LOLbins
- 使用Reflexxion绕过EDR(ntdll.dll恢复)
- 加密通信
- 可塑性的C2
- 文件上传/下载
- 文件浏览器
快速使用指南
下载并安装Go(以及Git)。
我们在这里使用 127.0.0.1:8080 作为C2域(由于我们在同一主机上启动client.exe和server.exe,所以使用本地主机)。这也是默认设置,无需进行任何更改。
检查 campaign/campaign.go 中的任务设置:
serverUrl = "http://127.0.0.1:8080"
在Windows上构建:
markdownCopy code> .\makewin.bat deploy
在Linux上构建:
goCopy code$ make deploy
启动服务器和客户端:
arduinoCopy codecd build\
.\server.exe
.\static\client.exe
在启动 server.exe 后,在浏览器中打开以下URL以访问Web界面:
bashCopy codehttp://localhost:8080/webui/
目录
static/:工具的公共目录
将你想要在其他机器上下载的文件放在这里。比如 client.exe、wingman.exe。还有你的工具,比如 mimikatz.exe 或者 seatbelt.exe。但请使用更不显眼的文件名。
这些文件也可以通过使用加密的文件名请求 /secure API 来访问,并将加密+Base64编码的文件作为响应返回。
dotNet文件可以通过使用 remote 执行选项来执行(通过 /secure 访问)。
upload/:数据泄露的私有目录
客户端上传的文件将存储在这里。
详细的构建说明
Go安装:
- Windows: https://golang.org/doc/install
- Linux:
apt install golang gcc-mingw-w64
编译 client.exe 和 server.exe:
markdownCopy code
> .\makewin.bat deploy
这将创建以下文件:
- /build/server.exe
- /build/server.elf
- /build/static/client.exe
- /build/static/client.elf
- /build/static/wingman.exe
- /build/upload/
- /build/webui/
server.exe:
shellCopy code> cd build> .\server.exeAntnium 0.1从 db.packets.json 加载了 0 个数据包从 db.clients.json 加载了 0 个客户端启用周期性数据库转储在 127.0.0.1:8080 上启动Web服务器
启动 client.exe:
sqlCopy code> .\build\static\client.exeAntnium 0.1time="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=...
关于交叉编译的注意事项
在Linux上编译Windows客户端是可行的,但由于一些Windows依赖关系,需要一些手动的GO gcc命令行操作。如果不能立即成功,请在Windows上自行编译Windows客户端(makewin.bat client
pkg/campaign/campaign.go 文件连接了一个已编译的 client.exe 和一个特定的 server.exe,形成一个任务。每个任务都有独立的加密和认证密钥,这些密钥在服务器和客户端之间共享。
goCopy codetype Campaign struct { ApiKey string // 用于访问面向客户端的REST的密钥 EncKey []byte // 用于在服务器和客户端之间加密数据包的密钥 ServerUrl string // 服务器的URL,从客户端的视角看}
而在 pkt/server/config.go 文件中,还有管理员界面/操作员密钥:
goCopy codetype 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。您可以选择以下方式之一:
-
使用集成的 antniumui,可在浏览器中访问
http://localhost:8080/webui -
或者从 antniumui 目录运行
ng serve,然后在浏览器中打开http://localhost:4200
在浏览器中连接到UI时,您首先需要配置服务器的IP和密码:
-
AdminApiKey(默认值为 "Secret-AdminApi-Key",与默认配置文件中的相同)
-
ServerIP(默认值为 "")
-
User(可选,可以随机选择)
客户端
已在以下环境中测试通过:
-
Windows 10
-
Ubuntu 20.04 LTS
在Windows上进行编译:
markdownCopy code> .\makewin.bat client
已在以下环境中测试通过:
-
工作:Ubuntu 20.04 LTS,Go 1.13.8
-
工作:Windows 10,Go 1.16.6
-
编译失败:Ubuntu 16.04 LTS,Go 1.6.2
在Linux上:
shellCopy code$ make server$ mkdir -p static upload$ ./server --listenaddr 0.0.0.0:8080
执行结果是 server.exe。确保在具有以下目录或期望的目录中运行:
-
upload/
-
static/
-
db.*.json 作为工作目录。
它将在该端口上启动一个REST服务器,提供以下功能:
-
/:面向客户端的REST接口 -
/ws:面向客户端的Websocket接口 -
/admin:用于管理员界面的REST接口(添加数据包、获取客户端) -
/adminws:用于管理员界面的Websocket接口(推送数据包) -
/webui:用于管理员界面的HTML文件(Angular源码和HTML),访问REST和Websocket接口
对于手动代理,使用完整的HTTP URL:
arduinoCopy codeclient.exe -proxy http://proxy:8080
或者通过环境变量:
bashCopy codeexport PROXY=http://localhost:8080./client
Wingman
Wingman基本上是Client,但没有直接连接到C2。它可以连接到本地的现有客户端(如果Campaign.AutoStartDownstreams为false,请确保它已启动)。
连接到本地的端口50000:
Copy codewingman.exe
或者使用rundll32.exe加载dll(64位版本在system32中,而不是在C:\Windows\SysWOW64\rundll32.exe中的32位版本):
makefileCopy codeC:\Windows\System32\rundll32.exe .\wingman.dll,Start
它将显示为下游 net#0。
测试
bashCopy codego test ./...