C2框架解析
C2 框架的发展历史
1 | 最早且广为人知的C2(command&control)框架可能是第一代的灰鸽子,采用客户端“主动连接”的方式,即客户端在主机A执行后,客户端监听,在服务端输入主机A的IP与端口后,才能进行通讯。 |
什么是 C2
C2(Command and Control)是指在单个或一组目标受害者主机上建立和维持对植入工具的控制的过程。C2框架通常提供借助某个通信协议与植入工具进行通信的能力,向受害者系统发出命令,并且在C2服务器上接收这些命令的输出,使攻击者实现物理访问或直接的虚拟访问。
C2 协议依赖于每个受控植入工具和 C2 服务器之间的同步或异步通信信道
首先先介绍一些架构的基础知识
1 | C/S架构:Clinet/Server,主要指的是TCP,客户端和服务端,即便带个中转它也还是叫C/S架构 |
Cobalt Strike 采用的是 C/S 架构,由 GUI 客户端连接远程的 TeamServer 实现控制。被控端(Beacon)以异步方式通过 HTTP/HTTPS/DNS 等协议回连 TeamServer,形成 implant 与 C2 的通信通道。
- 控制端 → TeamServer:专用协议(非 HTTP)
- Beacon → TeamServer:HTTP/HTTPS/DNS 等协议
从本质上来说,Metasploit 也是一个 C2 框架,是一个标准的 C/S 架构,而 Meterpreter 是 Metasploit 的核心 implant。Meterpreter 是一个非常典型的 被控代理(agent),它默认是异步通信模型,通信协议支持:
- TCP(反弹)
- HTTP/HTTPS(绕过代理和防火墙)
- Staged 和 Stageless 模式
C2 的优势
众所周知 C2 是用在后渗透上的,那么我们为什么要用 C2 框架进行后渗透呢?
我们可以将 C2 的功能和 netcat 进行对比
相比于普通的Netcat侦听器,C2框架可能具有更多的功能、灵活性和隐蔽性;C2框架可以针对shell提供更好的会话管理功能,能够让我们很方便地管理和操作多个远程shell
C2 的基本结构
C2 Server
C2服务器能够充当代理回调的中心,C2代理将定期和C2服务器联系并等待操作员的命令
Agents / Payloads
C2代理出现在目标系统感染之后,它运行在目标系统上,并且能够接受C2服务器的控制命令并执行,起代理作用。
与标准的反向shell相比,C2代理在大多数情况下还能够支持一些特殊功能,大多数C2框架都实现了伪命令,这可以简化C2操作人员的工作
beacon的流量特征可通过Malleable-C2-Profiles定制,从而能在一定程度上规避安全性检测。
Listeners
侦听器是运行在C2服务器上的一种应用程序,它将会等待通过特定端口或协议进行的回调操作,相关的协议可以是DNS、HTTP和HTTPS 等
Beacons
Beacon(信标)是指 C2 代理回调在 C2 服务器上运行的侦听器的过程,它是一种恶意软件与 C2 服务器之间的定期通信方式(通信机制)
当恶意软件感染目标系统,需要与控制服务器(C2服务器)建立连接,但是C2服务器不会持续发出命令,所以恶意软件就需要采取一定机制定期与C2服务器通信,并确认连接状态和获取新命令,这个过程可以通过 Beacon 进行
Beacon通信的主要特征是:
- 定期性:保持定期的通信间隔,比如每隔30秒到5分钟不等;
- 短小报文:通常只传输少量信息,比如恶意软件ID、主机地址等;
- 加密传输:使用自定义加密算法对通信内容进行加密,避免被检测;
- 命令获取:在有新命令时获取命令,在没有新命令时只发送确认连接的报文。
Beacon通信的目的主要有两个:
- 确认连接:定期通信可以确认恶意软件与C2服务器的连接是否正常,如果长时间未通信可能代表连接出现问题;
- 获取命令:在有新命令或更新时可以通过Beacon通信将其下发到恶意软件,然后用于控制受害系统。
混淆代理回调
Jitter
众所周知,C2 的流量有一个特征就是beacon通信以及被控制的设备向C2服务器发送beacon报文的速率,简单来说,默认的 beacon 通信会使用一个时间固定的睡眠周期,这个周期默认为 60 秒
这时候可以用 Jitter 时序扰动,在使用 Jitter 之后,我们的 C2 beacon 通信将可能呈现出一种无规律的模式,显示出的活动会更接近于普通用户
在一些更高级的 C2 框架中,我们还可以更改一些参数来增加流量的隐蔽性,并且也可以在正在传输的文件添加垃圾数据,从而使得该文件的隐蔽性增加。
File Jitter
File Jitter 简单来说就是通过文件操作来实现恶意软件与 C2 服务器通信时间的随机变化
“File” Jitter的实现过程通常如下所示:
- 恶意软件首先会确定一个命令目录,C2服务器会在该目录下放置命令文件;
- 恶意软件设置一个基础等待时间,比如30秒,这会是检测新命令文件的默认时间间隔;
- 每次恶意软件醒来后,它首先检查命令目录下是否有新文件,如果有,则读取文件并删除,从而获取到新命令;
- 如果命令目录下没有新文件,那么恶意软件会在20到40秒(可自行设置)的随机时间范围内等待,此处需要引入Jitter;
- 在等待时间结束后,恶意软件将再次检查命令目录下是否有新文件 并将循环以上过程。
“File” Jitter将利用文件操作来触发通信和获取新命令;使用命令文件可以更好隐藏通信规律,从而避免直连型的恶意网络通信被检测到。
有效载荷
就像常规的反弹 shell 一样,你可以在 C2 框架中使用两种主要类型的有效载荷:无阶段有效载荷和分阶段有效载荷
无阶段有效载荷
无阶段有效载荷是两者中最简单的,他们将包含完整的 C2 代理,并将回调 C2 服务器时立即开始 beacon 通信过程
分阶段有效载荷
分阶段有效载荷需要回调到 C2 服务器以下载 C2 代理的其他部分,这个过程可以更容易的混淆代码以绕过反病毒程序
使用分阶段有效载荷建立C2 beacon(信标)的步骤如下:
- 受害者下载并执行Dropper(Dropper是用于在目标系统上安装其他恶意软件或工具的恶意程序,比如可以安装C2代理、远控工具等);
- Dropper回调到C2服务器以下载第二阶段的有效载荷;
- C2服务器将第二阶段的有效载荷发送回受害者工作站;
- 第二阶段的有效载荷被加载到受害者工作站的内存中;
- C2 beacon(信标)初始化,红队/威胁参与者可以在C2服务器上与受害者机器进行互动。
有效载荷格式
Windows PE文件(一种Windows可执行文件格式)并不是在系统上执行代码的唯一方式,一些C2框架也可支持其他格式的有效载荷,例如:
PowerShell脚本:它可能包含c#代码(这可以用Add-Type Commandlet来编译和执行);HTA文件; JScript文件; Visual Basic应用程序或Visual Basic脚本; Microsoft Office文档;
模块
模块是任何C2框架的核心组件,它们能够添加一些使C2代理和C2服务器更加灵活的功能
Post Exploitation Modules(后渗透模块)
Post Exploitation(后渗透)模块是C2框架的主要组件之一,该模块可用于处理获得目标机的初始访问权限之后的任何事情,使用后渗透模块可以像运行SharpHound工具一样简单,也可以像转储LSASS和解析内存中的凭证一样复杂,此外,我们还能用后渗透模块中的ps1(Powershell)脚本来查找横向移动路径。
Pivoting Modules(跳板模块)
pivoting(跳板)模块是C2框架的主要组件之一,当我们使用C2框架时,该模块能够让我们更加容易地去访问受限制的网段。如果你在目标网络中的某个系统A(A在非限制网段中)上具有管理员访问权限,那么你就可以打开“SMB Beacon”通信,它可以使计算机A通过SMB协议充当一个代理;这将可能允许受限制网段中的机器与你的C2服务器实现通信