AI练习生之C2开发日记(一)

admin 2025-12-29 00:52:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录利用ClaudeAI开发C2框架的过程。作者通过定义B/S架构规范,采用Vue3、.NET8及Golang技术栈,实现了监听器策略(含流量伪装与CDN支持)及主机管理等核心功能。文章表明AI显著提升了开发效率,限制已由技术转为人的创意与设计能力。 综合评分: 85 文章分类: 红队,安全工具,AI安全,实战经验


cover_image

AI练习生之C2开发日记(一)

原创

黑晶

黑晶

2025年12月1日 20:57 浙江

AI练习生之C2开发日记(一)

说实话自从染上AI瘾后,人是越来越懒了,能videcoding的,自己绝不动手写了,以前都是手搓C2,正好试试让AI来梭一个c2看看,而且以前写的c2都是c/s这种架构的,因为对前端不是很会,搞出来的ui太丑,所以这次正好让ai来实现。

本次秉持着自己尽量不写一行代码的原则,去让ai完成所有的工作,我们只给出整体的需求以及架构规划设计

给AI提需求

我主要用claude code sonnect4.5进行开发,其实大部分模型基本都用过,速度快的效果差,效果好的速度太慢,要么就是又慢又差,综合看下来cc是最好的选择。

每个用claude开发的项目,我建议你都应该写一个claude.md,这个东西可以理解为在当前项目上下文中,你给claude制定的执行框架和标准,同时也可以作为claude在这个项目的记忆载体。

这个文件其实挺重要的,尤其是你的项目比较复杂的时候,不仅能提高ai的效率,避免每次都去分析一个项目,而且还能保证后续项目开发的一致性。

我这里的claude.md是这样写的:

# CLAUDE.md

## 项目概览
本项目是一个基于B/S架构的主机远程运维系统,可供管理员通过统一管理界面对远程主机进行运维管理。

## 技术选型
- 前端:使用Vue3作为主要框架,以及Ant Design Vue UI 组件库。
- 后段:使用asp.net core webapi,语言版本为.net8,支持跨平台部署
- agent: 使用golang为编程语言,支持跨平台部署

## 编码规范
- 避免亢长的代码文件,注意功能代码解耦和模块化,合理运用设计模式,保证整体框架的可扩展性。
- 清晰简洁的注释。
- 仅在调试模式下输出debug信息。
- 良好的异常处理机制,杜绝因程序异常无接管导致的灾难性崩溃。
- 编写的代码要考虑性能问题,以及并发环境下的安全问题。

## 行动红线
- 禁止删除文件,删除目录等危险操作
- 禁止对已有功能进行大范围更改,如必要情况需要通知用户做决定。
- 禁止私自修改UI样式代码
-

## 技术细节

- 具体的项目细节以及代码编写具体要求参考 @README.md

README.md里面你就可以定义一些具体的技术细节了,例如:

### 通信协议
- server与agent应该支持http(s),websocket通信协议。
- 通信过程应该使用xxxxx算法进行加解密。
- 支持自定义请求,如添加请求头,支持响应数据嵌入自定义模板。
......

### 命令控制
- 远程agent可以支持通过简单的命令输入输出和交互式终端执行命令两种方式。
- 命令执行应支持跨平台,主要是windows,linux,darwin
......

### 前端用户界面
- UI风格以现代化,扁平化,清爽美观为主。
- VUE组件应注意解耦,避免出现前端大文件影响加载效率。
......

但是这里也不至于写的太细,比如具体到用什么API啊之类的。

然后AI给了一个大概的架构:

┌─────────────────────────────────────────────────────────────┐
│                         用户浏览器                            │
│                  (Vue3 + Ant Design Vue)                     │
└──────────────────────┬──────────────────────────────────────┘
                       │ HTTPS/WSS
                       │ (JWT认证)
┌──────────────────────▼──────────────────────────────────────┐
│                      Server后端                              │
│            (.NET 8 Web API + SignalR)                       │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌─────────────────┐  │
│  │ 认证服务      │  │ 监听策略管理  │  │  Agent管理服务  │  │
│  │ (JWT Token)  │  │ (动态监听器)  │  │  (心跳/状态)    │  │
│  └──────────────┘  └──────────────┘  └─────────────────┘  │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌─────────────────┐  │
│  │ 命令队列      │  │ 数据伪装中间件 │  │  Shell代理服务  │  │
│  │ (异步下发)    │  │ (流量混淆)    │  │  (WebSocket桥)  │  │
│  └──────────────┘  └──────────────┘  └─────────────────┘  │
│                                                              │
│              SQLite数据库(Agent信息/监听策略)              │
└──────────────────────┬──────────────────────────────────────┘
                       │ HTTP/HTTPS/WebSocket/WSS
                       │ (加密+伪装通信)
┌──────────────────────▼──────────────────────────────────────┐
│                       Agent客户端                            │
│                    (Golang 跨平台)                           │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌─────────────────┐  │
│  │ 通信模块      │  │ 命令执行框架  │  │  会话管理器      │  │
│  │ (多协议)      │  │ (Shell/File)  │  │  (PTY终端)      │  │
│  └──────────────┘  └──────────────┘  └─────────────────┘  │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌─────────────────┐  │
│  │ TLV编码       │  │ 加密/解密     │  │  文件管理        │  │
│  │ (数据格式)    │  │ (AES/Base64) │  │  (上传/下载)     │  │
│  └──────────────┘  └──────────────┘  └─────────────────┘  │
│                                                              │
│              目标主机(Windows/Linux/macOS)                 │
└─────────────────────────────────────────────────────────────┘

接下来就开始让AI手搓代码了:

登录界面

登录界面还是要有的,我这里让AI去设计了一个左右布局的样式,左边是用户的登录信息区域,右边是一个图片区域:

风格还是蛮符合的,因为我给的项目名是blackcat。

至于密码的验证也很简单,后端提供了一个config.json配置文件,里面会有用户名密码字段,认证的时候去读取校验就行,认证通过,会生成对应的jwttoken返回前端,因为后续的操作都需要鉴权。

系统主界面

主界面的布局采用了菜单加功能区的布局方式,也就是左边是操作菜单,右边根据不同的菜单项展示不同的功能区,这个地方你让AI实现的话直接告诉他个大概就好了,基本现代很多管理后台都是这个布局,实现的效果也是大差不差的。

前期实现的功能比较简单,一个仪表盘后续可以规划用来查看整体的情况,比如一共上线了多少机器等等,我这里还没做,因为很多指标可能需要你把其他功能做的差不多,才好指定。

监听器实现

因为之前引导AI的缘故,所以这里AI生成的时候,理解是监听策略,说白了就是对agent的一些管控方式,其实在C2里面就是listener。

可以看看这里的一些配置:

  1. 1. 这里AI首先配置了一个基本的策略名和策略备注功能,主要供创建人写一些额外信息,比如使用者可以备注,这个监听器是用来做什么的,或者备注只用于哪个项目等等。
  2. 2. 然后是高级配置里面的一些通信相关的东西了。
  • • 监听端口。
  • • 心跳时间:用来控制agent的心跳间隔。
  • • 请求地址:这个就是agent实际请求的地方,这里AI创建的是可以支持多个IP:PORT这种格式的,比如你是云服务器或者用了什么CDN之类的,这里可以填很多个,这样agent可以去轮询请求,起到一定的防封效果。
  • • 加密key以及magic字符串都是对流量进行校验,只获取agent来的流量。
  • • 请求URL:这个主要是用在http协议下,支持多个url,比如第一次请求http://xxxxx/1.php,第二次可能就是http://xxxxx/2.jsp,完全自定义请求地址。
  • • 自定义host头:为了支持CDN,域前置。
  • • 自定义请求头:这个都是通过用户的自定义,来实现对流量的伪装。
  • • 自定义响应头也是类似,这个地方可以后面的数据伪装模板配合。
  • • 数据伪装模板:这个主要用于server给agent返回响应的时候,比如下发命令,通过这个数据伪装模板,可以把响应嵌入到模板中特定的位置,这里通过{***content***}字符串进行定位,比如你可以随便扒一个网站的html代码,然后把标记放在你想让数据嵌入的地方,再配合前面的响应头,可以实现一个很好的伪装。
  • • 404页面,前面不是说会通过加密和magicstring匹配特定的流量么,假如没匹配到的情况下,就会返回一个你给定的404页面,和前面的配合,你可以几乎完整的模拟一个网站的流量。
  • • 初始化脚本:这个就是用于agent初始运行后需要执行的功能,可以执行bash或者python脚本。

上面的这些内容其实不是写死在agent或者通过类似CS那种patch来实现的,AI这里的给的方案是,给每个listener创建一个配置下发的URL和临时的加密key,然后agent里面只有这个url和key,然后会这个配置下发的url请求配置以及后续加解密用的新key,这个还是蛮有意思的,也是借鉴了现在的EDR等系统的思想,运行后初始化会有一个请求配置的过程。

listener管理界面的UI:

关于心跳的设计,其实这里的实现其实都差不多,利用TLV实现数据封装,实现定义好统一字段,服务端接收到agent数据后进行解析即可。

// tlv.go

// OpCode定义(与服务端保持一致)
const (
    OpCodeHostname         byte = 0  // 主机名
    OpCodeUsername         byte = 1  // 用户名
    OpCodeHostIP           byte = 2  // 主机IP
    OpCodeSystemVersion    byte = 3  // 系统版本
    OpCodePlatform         byte = 4  // 操作系统平台
    OpCodeArchitecture     byte = 5  // 进程架构
    OpCodeProcessName      byte = 6  // 进程名
    OpCodeUserPrivilege    byte = 7  // 用户权限
    OpCodeNetworkIPs       byte = 8  // 网卡IP列表
    OpCodeAgentID          byte = 9  // Agent UUID
    OpCodeTimestamp        byte = 10 // 时间戳
)

// 编码单个TLV字段
func EncodeTLV(opcode byte, value []byte) []byte {
    buf := bytes.NewBuffer(nil)

    // Type (1 byte)
    buf.WriteByte(opcode)

    // Length (2 bytes, Big Endian)
    binary.Write(buf, binary.BigEndian, uint16(len(value)))

    // Value
    buf.Write(value)

    return buf.Bytes()
}

// 编码完整的Agent信息
func EncodeAgentInfo(info *types.SystemInfo, agentID string, timestamp int64) []byte {
    buf := bytes.NewBuffer(nil)

    // 按顺序编码各个字段
    buf.Write(EncodeStringTLV(OpCodeAgentID, agentID))
    buf.Write(EncodeStringTLV(OpCodeHostname, info.Hostname))
    buf.Write(EncodeStringTLV(OpCodeUsername, info.Username))
    // ... 更多字段

    // 编码时间戳(8字节int64)
    timestampBuf := new(bytes.Buffer)
    binary.Write(timestampBuf, binary.BigEndian, timestamp)
    buf.Write(EncodeTLV(OpCodeTimestamp, timestampBuf.Bytes()))

    return buf.Bytes()
}
[Type][Length][Value][Type][Length][Value]...
  1B    2B      nB     1B    2B      nB

示例:编码 Hostname="WIN10-PC"
09 00 08 57 49 4E 31 30 2D 50 43
│  │  │  └─────────┬────────────┘
│  │  │          Value (8 bytes)
│  │  └─ Length = 8
│  └─ OpCode = 0 (Hostname)

主机管理

这个界面的话,AI也是基于datagrid数据表格来实现的,列头作为数据标识,然后也支持分页,同时可以对每个机器进行备注标识,这里其实还可以扩展一下分组功能,用来区分不同的项目。

之前跟AI说过要支持并发,所以这里AI说理论上可以支持5w+的主机,也用了表格虚拟化等一些技术,反正我也没测过具体能不能扛这么多的机器,但是日常使用肯定是没问题的。

总结

至少截止到监听器创建,心跳设计以及机器上线,都是没啥问题的,然后AI设计的UI其实也是可以的,如我让我来搞,我肯定短时间搞不出来,因为我也不是很会前端,当前的这些功能和AI配合一共大概一天左右时间搞定,总体是比较满意的。

最终实际的效果,还是取决于你给AI的引导,有了AI之后技术不在是限制,限制的反而是人的创意和想象。

推荐阅读

  • • 假如让AI来设计C2会怎么样
  • • 还在手搓免杀?时代变了
  • • 红队研发:C2的心跳设计

这是一个纯粹,开放,前沿的技术交流社区,成员主要有互联网大厂安全部门任职的成员,乙方红队专家,以及正在学习入门的小白等,目前主题主要以红队研发为主(有经验的都知道是什么意思),以及其他涉及到红队进攻侵入性技术,如果你想学习技术,认识不同的人或者寻求一个机会之类的,可以来看看👇👇👇****

欢迎加入交流圈

扫码获取更多精彩


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:黑晶 黑晶《AI练习生之C2开发日记(一)》

评论:0   参与:  0