Daffodil

红队武器研发:尝试实现一个现代C2框架-DaffodilC2

2022-02-14 · 3 min read
红队武器开发 redteam

本系列将尝试开发一个现代化的C2框架
由于本人技术浅薄,开发经验基本为零,如有错误之处,敬请指正。

浅谈C2框架的发展历史

  最早且广为人知的C2(command&control)框架可能是第一代的灰鸽子,采用客户端“主动连接”的方式,即客户端在主机A执行后,客户端监听,在服务端输入主机A的IP与端口后,才能进行通讯。
  后来因为内网环境与防火墙的因素,发展出了“被动连接”方式的第二代C2框架,例如GHOST、大灰狼,与“主动连接”相反,即服务端监听,客户端主动连接服务端。此时出现了两种配置方式,一是FTP上线、二是域名解析上线。有效适应大多数网络环境,但易溯源、网络数据包易被提取特征、不易于现代红队协同使用。
  为了解决这些问题,发展出了第三代C2框架例如cobalt strike,它支持HTTP、HTTPS、DNS等协议通讯,由TeamServer转发请求,隐秘性好、易于扩展、适合现代红队协同工作,如今被广泛使用。
  本系列将尝试开发一个第三代C2框架

设计 C2 基础架构

  我们需要实现一个控制端发送命令,实现一个客户端执行命令,实现一个TeamServer服务,接收转发来自客户端与控制端的请求。

DaffodilC2项目分为三个组件

  • DaffodilServer: TeamServer服务 go实现
  • ControlServer: 控制端发送命令 go实现
  • client:客户端执行命令 cpp实现

实现TeamServer服务

  由于之前没学过go,为了在实现C2的过程中顺便学习一下go语言,我决定用go实现一个http服务,将来自控制端与客户端的请求存储下来,客户端去读取、解析、执行,控制端读取并显示结果。

实现ControlServer服务

  先实现一个上线功能,解析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函数
}

未完待续。。。