本系列将尝试开发一个现代化的C2框架
由于本人技术浅薄,开发经验基本为零,如有错误之处,敬请指正。
最早且广为人知的C2(command&control)框架可能是第一代的灰鸽子,采用客户端“主动连接”的方式,即客户端在主机A执行后,客户端监听,在服务端输入主机A的IP与端口后,才能进行通讯。
后来因为内网环境与防火墙的因素,发展出了“被动连接”方式的第二代C2框架,例如GHOST、大灰狼,与“主动连接”相反,即服务端监听,客户端主动连接服务端。此时出现了两种配置方式,一是FTP上线、二是域名解析上线。有效适应大多数网络环境,但易溯源、网络数据包易被提取特征、不易于现代红队协同使用。
为了解决这些问题,发展出了第三代C2框架例如cobalt strike,它支持HTTP、HTTPS、DNS等协议通讯,由TeamServer转发请求,隐秘性好、易于扩展、适合现代红队协同工作,如今被广泛使用。
本系列将尝试开发一个第三代C2框架
我们需要实现一个控制端发送命令,实现一个客户端执行命令,实现一个TeamServer服务,接收转发来自客户端与控制端的请求。
TeamServer服务
go实现控制端发送命令
go实现客户端执行命令
cpp实现由于之前没学过go,为了在实现C2的过程中顺便学习一下go语言,我决定用go实现一个http服务,将来自控制端与客户端的请求存储下来,客户端去读取、解析、执行,控制端读取并显示结果。
先实现一个上线功能,解析TeamServer转发的JSON。
package main
import (
"encoding/json"
"log"
"net/http"
)
func GetInf(w http.ResponseWriter, r *http.Request) {
formData := make(map[string]interface{})
// 调用json包的解析,解析请求body
json.NewDecoder(r.Body).Decode(&formData)
for key, value := range formData {
log.Println("上线啦! key:", key, " => value :", value)
}
}
func main() {
log.Println("控制端开始监听")
http.HandleFunc("/ControlServer", GetInf)
http.ListenAndServe(":8001", nil) //启动服务器并监听本地的 8001 端口。当有请求过来时,则根据路由执行对应的handler函数
}
未完待续。。。