现代C2框架中Beacon级联机制深度解析:TCP与SMB协议下的树状代理网络构建
字数 6377
更新时间 2026-03-07 10:46:57

现代C2框架中Beacon级联机制深度解析教学文档

摘要

本文档旨在系统性地阐述现代C2(Command and Control,命令与控制)框架中Beacon级联机制的核心原理、实现细节、工作流程与关键技术。该机制是构建树状代理网络,实现内网横向渗透与控制的关键技术。本文档将重点解析TCP与SMB两种主流协议下的级联实现,并结合具体数据结构、路由算法和实战场景进行详细教学。

一、基础概念

1.1 Beacon级联与核心协议

  • 定义:Beacon级联是一种在C2框架(如Cobalt Strike, Sliver, Havoc)中,允许在已控制主机(即边缘“网关”或“支点”)上建立代理节点,并以此为跳板,向内网纵深扩展,形成分层控制链的技术。它并非独立的服务(如SOCKS代理),而是深度集成到Beacon生命周期中的应用层路由器功能。
  • 核心目标:将内网不出网的主机通过多级代理连接起来,构成一个由C2服务器统一控制的树状网络。
  • 级联协议:在现代C2框架中,TCP和SMB是两种主要的级联协议。
    • TCP:凭借其全双工和无状态特性,可作为不同C2协议(如HTTP/DNS)的“通用胶合层”,将服务器流量转换为内部私有协议后,通过TCP socket在代理链中透传。其优点是通用性强,适用于不同操作系统。
    • SMB:利用Windows域环境中天然存在的SMB协议(端口445)流量进行隐蔽通信。其核心机制是基于命名管道的进程间通信。SMB级联的显著优势是支持无端口监听,子Beacon通过连接父Beacon暴露的命名管道实现反向连接,从而规避主机层面的端口扫描风险。SMB流量在AD域中(如文件共享、组策略)更为常见,因此隐蔽性更高。

1.2 树状拓扑结构与核心术语

为保证级联网络的可管理性,其设计遵循严格的树形拓扑结构,满足以下两条核心规则:

  1. 规则1:一个节点有且只有一个父节点。
  2. 规则2:一个节点可以有多个子节点。

基于此规则,定义了以下关键术语:

  • Gateway (网关节点):与C2服务器(Teamserver)建立直连连接的Agent,是整个代理树的根锚点。所有来自子树的数据必须经过Gateway上报。
  • Pivot (跳板节点):通过其父节点间接注册到C2服务器的Agent,位于代理链的中间层或末端。
  • 寻路算法(路由算法):基于源路由思想,从目标节点开始,自下而上逐跳寻找父节点,直至找到Gateway节点,从而构建出完整的转发路径。
  • 连接上游 (Upstream):每个节点维护与其父节点的唯一连接,作为控制指令和数据流出的通道。
  • 管理下游 (Children):每个节点维护到其所有子节点的连接池,实现代理链的纵向扩展,负责数据的上行封装与转发。

二、TCP级联机制详解

2.1 数据包协议定义

在实现中,通常定义一个简单的TLV(Type-Length-Value)自定义协议结构:

  • Length (4字节):整个数据包(含Type和Payload)的长度。
  • Type (1字节):命令类型。
  • Payload (变长):实际数据。

定义的命令常量(CMD_TYPE)示例如下:

  • CMD_EXEC (0x01): 执行系统命令。
  • CMD_CONNECT (0x02): 建立TCP级联连接。
  • CMD_FORWARD (0x03): 数据包转发(级联核心)。
  • CMD_REGISTER (0x04): Agent注册。
  • CMD_ACK (0x05): 确认。

2.2 关键数据结构设计

  1. Server端(Teamserver)视角

    • Agent结构体:代表一个被控节点。核心字段包括:
      • AgentID: 节点的全局唯一标识。
      • Info: 包含主机名、用户名、PID等元数据。
      • Pivots: 包含父节点指针 (Parent *Agent) 和子节点切片 (Links []*Agent),用于维护树形拓扑。
      • Conn: 与Gateway的物理连接(仅Gateway节点持有,Pivot节点此字段为空)。
    • Teamserver结构体:核心是一个以AgentID为键,Agent实例为值的Map,用于管理所有已知Agent。
  2. Agent端(节点)视角

    • Agent结构体:代表节点自身。核心字段包括:
      • AgentID:自身标识。
      • Upstream net.Conn:与父节点的连接。
      • Children sync.Map:管理子节点连接的Map,键为RouteID,值为与子节点的物理连接
    • RouteID的概念:由父节点在建立与子节点的TCP连接时随机生成,并存储在父节点的Children Map中。父节点不解析子节点的数据,仅通过RouteID进行数据转发。Server端负责维护RouteID与子节点真实AgentID的映射关系。这种设计避免了阻塞等待子节点发送AgentID的时序问题,实现了“连接即用”。

2.3 TCP级联建立流程分析(以三级网络为例)

假设目标网络拓扑为:Server <-> Gateway <-> Pivot1 <-> Pivot2

第一阶段:Gateway上线与Pivot1注册(二级网络)

  1. Gateway注册:Gateway主动连接Server,发送CMD_REGISTER包,包含自身元数据。Server将此Agent注册为Gateway,记录其连接。
  2. Server下发级联指令:管理员在Server控制台输入命令(如 connect [Pivot1_AgentID] [Pivot1_IP:Port])。Server通过SendCommand方法,为目标Pivot1计算到Gateway的路径([Pivot1, Gateway])。
  3. 任务包封装与下发
    • 原始任务包为:[CMD_CONNECT][Pivot1_IP:Port]
    • 由于Pivot1需要通过Gateway转发,Server会对其进行封装,生成:[CMD_FORWARD][Gateway_to_Pivot1_RouteID][原始_CONNECT包],然后发送给Gateway。
  4. Gateway执行连接:Gateway收到CMD_FORWARD包,解析出RouteID,从Children Map中找到对应Pivot1的连接,将内层的CMD_CONNECT包转发给Pivot1。
  5. Pivot1响应与反向注册
    • Pivot1收到CMD_CONNECT指令,与指定地址建立TCP连接,生成一个随机的RouteID1标识此连接,并启动handleChild协程监听此连接。
    • Pivot1立即通过新连接向Gateway发送CMD_REGISTER包。
    • Gateway收到后,将其封装为[CMD_FORWARD][Gateway_to_Pivot1_RouteID][Pivot1的REGISTER包],转发给Server。
    • Server收到后,剥离外层CMD_FORWARD,解析内层CMD_REGISTER包,调用RegisterPivot方法。此方法验证Pivot1的父节点(Gateway)存在,创建Pivot1的Agent对象,建立AgentIDRouteID1的映射,并将Pivot1加入Gateway的子节点列表。至此,Pivot1完成注册。

第二阶段:Pivot2级联注册(扩展为三级网络)

  1. Server向Pivot1下发级联指令:管理员输入connect [Pivot2_AgentID] [Pivot2_IP:Port]。Server计算路径[Pivot2, Pivot1, Gateway]
  2. 多层封装下发
    • 原始任务包:Packet1 = [CMD_CONNECT][Pivot2_IP:Port]
    • 第一层封装(Pivot1转发):Packet2 = [CMD_FORWARD][Pivot1_to_Pivot2_RouteID][Packet1]
    • 第二层封装(Gateway转发):Packet3 = [CMD_FORWARD][Gateway_to_Pivot1_RouteID][Packet2]
    • Server将Packet3发送给Gateway。
  3. 逐跳转发与连接建立
    • Gateway收到Packet3,根据Gateway_to_Pivot1_RouteID找到Pivot1的连接,转发Packet2
    • Pivot1收到Packet2,根据Pivot1_to_Pivot2_RouteID(此时是新生成的)找到(或建立与)Pivot2的连接,转发Packet1
    • Pivot2收到CMD_CONNECT指令,与指定地址建立连接,并立即发送CMD_REGISTER包给Pivot1。
  4. 反向注册与路径解封
    • Pivot2的注册包Reg_P1被Pivot1封装为[CMD_FORWARD][Pivot1_to_Pivot2_RouteID][Reg_P1],发送给Gateway。
    • Gateway收到后,再次封装为[CMD_FORWARD][Gateway_to_Pivot1_RouteID][[CMD_FORWARD][Pivot1_to_Pivot2_RouteID][Reg_P1]],发送给Server。
    • Server的processMessage方法递归解析CMD_FORWARD包。第一次解析,获取Gateway_to_Pivot1_RouteID,得知数据来自Pivot1。第二次解析,获取Pivot1_to_Pivot2_RouteID,得知数据来自Pivot2。最终解析出最内层的CMD_REGISTER包,为Pivot2完成注册,并建立Pivot2_AgentIDPivot1_to_Pivot2_RouteID的映射。Gateway生成的RouteID仅用于Gateway与Pivot1之间的路由,对Pivot2透明

2.4 命令执行与数据回传流程

以Server向三级网络末端的Pivot2发送exec ipconfig命令为例:

  1. Server端封装:计算路径[Pivot2, Pivot1, Gateway]。构造执行包Exec_P = [CMD_EXEC][ipconfig],然后自下而上封装:
    • 对Pivot1:Fwd_P1 = [CMD_FORWARD][Pivot1_to_Pivot2_RouteID][Exec_P]
    • 对Gateway:Fwd_G = [CMD_FORWARD][Gateway_to_Pivot1_RouteID][Fwd_P1]
    • Server将Fwd_G发送给Gateway。
  2. 逐跳转发
    • Gateway解析Fwd_G,根据RouteID转发Fwd_P1给Pivot1。
    • Pivot1解析Fwd_P1,根据RouteID转发Exec_P给Pivot2。
  3. 命令执行与结果回传
    • Pivot2执行ipconfig,生成结果包Res_P = [CMD_EXEC][命令结果],发送给其父节点Pivot1。
    • Pivot1将结果封装为[CMD_FORWARD][Pivot1_to_Pivot2_RouteID][Res_P],发送给Gateway。
    • Gateway再次封装为[CMD_FORWARD][Gateway_to_Pivot1_RouteID][[CMD_FORWARD][Pivot1_to_Pivot2_RouteID][Res_P]],发送给Server。
  4. Server端递归解析:Server的processMessage方法同样通过递归剥离CMD_FORWARD层,并根据RouteID反向查找数据包的原始发送者AgentID,最终解析出CMD_EXEC结果并呈现。

三、SMB级联机制详解

3.1 SMB级联的核心:命名管道

SMB级联基于Windows的命名管道机制实现进程间通信。

  • 命名格式\\.\pipe\[管道名称] (本地) 或 \\[主机名]\pipe\[管道名称] (远程)。
  • 工作模式:父Beacon作为服务端,使用CreateNamedPipe创建命名管道并ConnectNamedPipe等待连接。子Beacon作为客户端,使用CreateFile连接到远程父主机的命名管道。
  • 编程实现:在Go、Rust等语言中,可使用封装好的库(如Go的github.com/Microsoft/go-winio)来像操作普通网络连接一样操作命名管道,因其实现了net.Conn接口。

3.2 SMB级联的设计特点

  1. 协议混合:在实际攻击中,常见场景是:C2服务器通过HTTP/HTTPS与边缘Gateway通信,而Gateway与内网Pivot之间、以及Pivot与Pivot之间,则通过SMB命名管道进行级联。这体现了现代C2框架“协议无关的级联”设计思想。
  2. 缓冲区队列的必要性:由于Beacon普遍采用“睡眠(Sleep)”混淆技术,父节点和子节点的活跃周期可能错开。为避免子节点在父节点睡眠时发送的数据丢失,需要在父节点(特别是Gateway)设计输出缓冲区队列。当父节点苏醒进行“回连(CheckIn)”时,一次性从队列中读取所有缓存的下行数据并上报,从而解决因时间差导致的数据丢失或阻塞问题。

3.3 SMB级联流程

SMB级联的控制流和数据流与TCP级联完全一致,区别仅在于传输层:

  • 连接载体:从TCP Socket变为SMB命名管道。
  • 连接命令:从CMD_CONNECT变为CMD_SMB,其Payload是待连接的命名管道路径(如\\.\pipe\pivot1)。
  • 建立方向:通常由子Beacon作为客户端,主动连接父Beacon创建的命名管道(反向连接),这与TCP级联中父连接子的“正向”模式形成互补。

四、总结与核心思想

  1. 树形拓扑与单父多子:严格的树形结构简化了路由,奠定了整个级联网络的管理基础。
  2. 源路由与逐跳封装:控制指令从Server下发时,自目标节点向Gateway逐层封装CMD_FORWARD;数据回传时,则自下而上逐层封装。每个中间节点只关心下一跳,实现了路由的层次化。
  3. 连接与标识分离:使用由父节点生成的RouteID来标识子连接,而非子节点的AgentID。这使得连接建立后即可转发数据,注册过程异步化,提升了效率和健壮性。Server维护RouteIDAgentID的全局映射。
  4. 协议适配层:Gateway作为协议转换枢纽,对外(与Server)使用一种协议(如HTTP),对内(与子节点)使用另一种协议(如TCP/SMB),实现了不同协议Beacon间的无缝级联。
  5. 状态集中管理:Server持有整个网络的完整拓扑(通过每个Agent的Pivots结构),是唯一知道所有节点关系和状态的中心,负责所有路由计算和任务分发。

通过深入理解上述机制,可以更好地掌握现代C2框架的横向移动原理,并为安全防护(检测异常树状网络连接、命名管道活动)和攻防对抗研究提供理论基础。

相似文章
相似文章
 全屏