External C2

这东西其实依靠的就是SMB Beacon payload

介绍

首先什么是ExternalC2?

ExternalC2是由Cobalt Strike提出的一套规范/框架,它允许黑客根据需要对框架提供的默认HTTP(S)/DNS/SMB C2 通信通道进行扩展,简单说就是用户可以开发自己的控制器(服务端)和客户端(被控端)而不是直接使用CS自己的那套,控制器与客户端怎么来都是自己说了算。

  1. 第三方控制器(Third-party Controller)——负责与Cobalt Strike TeamServer(CS服务端)进行连接(通信方式使用TCP连接),并使用自定义C2通道与目标主机上的第三方客户端进行通信(通信方式自定义)

  2. 第三方客户端(Third-party Client)——负责使用自定义的C2通道与第三方控制器进行通信,最终将命令中转到SMB Beacon(通信方式使用命名管道)

  3. SMB Beacon——受害者机器上运行的Beacon

通信过程

要使用External C2需要先启动External C2监听器好等待连接,根据CS版本分为两种方法,使用脚本或者直接新建External C2监听器

在3.x时需要使用脚本来启动,脚本内容如下,然后在脚本管理器里加载此脚本 externalc2_start函数的作用就是接收两个参数,监听地址和监听端口

在4.x后不在需要使用这种方法作者进行了包装可以直接新建一个External C2监听器更加方便

ExternalC2启动后就会开始监听指定端口等待我们的第三方控制端连接进行通信

先来说一下整体的通信过程

最开始通信时,第三方控制器与External C2通过socket建立连接,然后发送一些选项,数据发送格式如下

4字节的数据块长度(低字节序)加一个数据块所组成

首先要发送以下的一些选项:

  1. arch:指定beacon stage的架构(x86或x64)

  2. pipename:命名管道(pipe)名称(用来与SMB beacon通信的)

  3. block:sleep选项(以毫秒为单位睡眠时间)

所有选项发送完毕后,第三方控制器在发送一条go指令。这条指令表示一切ok,CS生成并发送beacon stage。第三方控制器随后会将这个beacon stage转发给第三方客户端,然后第三方客户端接收beacon stage并执行。

在一切完成后会产生一个如下的循环,不断转发CS的命令和客户端执行的结果

发送命令:CS服务端——>第三方控制器——>第三方客户端——>SMB beacon 返回结果:SMB beacon——>第三方控制器——>第三方客户端——>CS服务端

需要注意以上的数据传输格除了第三方控制器与第三方客户端的通信格式可以自定义,其他过程通信全是按照4字节的数据块长度+数据块组成

经典案例

先说一个经典案例然后在说一个别的。在这个经典案例中我们使用Python编写第三方服务端C++编写第三方客户端。

首先先在Cobalt Strike里起一个External C2监听器

第三方服务端

https://gist.github.com/xpn/bb82f2ca4c8e9866c12c54baeb64d771

第三方客户端编写

https://gist.github.com/xpn/08cf7001780020bb60c5c773cec5f839

https://blog.xpnsec.com/exploring-cobalt-strikes-externalc2-framework/

代码相关的东西就自己多读一下吧都不难

另一个ExternalC2框架

https://github.com/SpiderLabs/DoHC2 这个感兴趣的可以看看

最后更新于

这有帮助吗?