cluren's Studio.

Cobalt Strike 4.0第二节Infrastructure笔记

字数统计: 5k阅读时长: 18 min
2021/12/04

这是cobalt strike 4.0官方教程的第二节观看笔记笔记。两年之前的课一直拖到现在才写。。。

配合视频食用效果更佳!

内容概要

  1. 监听器管理
  2. 不同Beacon Payload介绍
    • HTTP/HTTPS Beacon
    • DNS beacon
    • SMB Beacon 和 TCP Beacon
    • 外置C2 (C2就是 Command & Control Server 的简称,也就是命令与控制服务器)

一、什么是监听器?

监听器是cobalt strike payload的一项配置

一个监听器既是一个 payload 的配置信息,同时又是 Cobalt Strike 起一个服务器来接收来自这个
payload 的连接的指示。一个监听器由用户定义的名称、payload 类型和几个特定于 payload 的选项组
成。

二、cobalt strike中的监听器类型

  • egress:beacon通过网络作为出口的payload

  • peer to peer:该种监听器通过父payload进行通信,主要用于pivoting(“跳板攻击”)

  • alias:有关其他工具payload控制器的参考

    下表为各种类型payload的特性

    image-20210127151744938

在菜单栏点击Cobalt Strike->Listeners就可以看到监听器管理页面,在这里可以添加、编辑、删除监听器等操作。添加新的监听器需要输入监听器的名称并选择相应的payload。(作者建议:监听器名称最好有足够的描述性,这样可以方便队友了解其作用以及特性)

image-20210127151044309

三、Payload Staging

  1. 什么是stager?

    stager 是一个小程序,通常是手工优化的汇编指令,用于下载一个payload stage,把它注入内存,然后对其传达执行命令。这个过程被称为 staging。

    staging过程:C2将stager发送到目标,目标会以get的方式请求C2,然后C2会返回相关payload的相应给目标。

    ​ Metasploit与Cobalt Strike的staging协议是相同的,Metasploit的攻击可以无 缝衔接给Cobalt Strike,同样Cobalt Strike的session也可以传递给Metasploit,也可以传递给并不是自己连接到的Cobalt Strike实例中去。

    staging示意图:

    image-20210127174655870

  2. payload分为两种

    stageless类型的:没有stager的payload,直接传送payload到目标。

    stager类型的:将payload分阶段传送到目标中。相比stageless类型的payload而言,这种类型的不安全,容易出错,更容易被侦察到。但是在有些限制条件比较苛刻的环境中不得不用stager来分阶段传输payload。

    image-20211009125650488

cobalt strike3中的payload都默认使用了stager,cobalt strike4中可供选择。

四、HTTP Beacon的工作原理

如下图所示:左边的绿色框代表C2服务器,右边紫色框中的红点代表Beacon payload,紫色的框代表Beacon payload所在的进程。

HTTP Beacon设置有一个心跳时间,默认为60秒,sleep命令可以设置睡眠时间,每次心跳时间过后目标就会跟C2服务器进行通信。

每次“心跳”HTTP Beacon就会以GET请求的方式向C2服务器发送数据,询问C2是否有需要执行的任务(图中红色线段表示),如果没有则Beacon进入休眠,直到心跳时间过后再次请求询问,如果有需要执行的任务则C2会返回响应,返回一组加密的数据(图中未表示),其中包含payload要执行的任务。

如果payload在目标中产生输出则会以POST的请求方式传回给C2(图中黄色线段表示),同样会以一组加密的数据进行返回(图中黄色方块表示)。只有产生输出时才会发送POST请求。

image-20210127182154841

五、HTTP Beacon监听器配置

在菜单栏点击Cobalt Strike->Listeners->点击下方的Add就会弹出监听器配置对话框。

在设置完监听器的名称和payload类型后,这里对HTTP Beacon的监听器的相关配置进行说明。

image-20210131105051344

HTTP Host需要填的就是Beacon的回连主机,回连主机可以填ipv4、ipv6的地址或者域名,一次填入多个地址可以用逗号进行分隔,ipv6的地址需要用方括号(’[]’)扩起来。按 [+] 来为 HTTP Beacon 增加一个或多个回连的主机,按 [-] 来移除一个或多个主机,按 [X] 来清除当前的主机。

HTTP Host(Stager)填的是stager的主机,也可以设置默认不使用stager。

HTTP port(c2)就是Beacon回连c2的端口,默认为80。

HTTP Proxy是Beacon Payload的代理设置。如下图所示,在对话框的最下方有个打勾选项,打勾后会忽略代理配置,使用直接连接。这里的设置只对Beacon Payload起作用,不对stager起作用。image-20210201144216053

六、HTTPS Beacon

HTTPS Beacon除了使用SSL外,其他跟HTTP Beacon都是类似的,SSL证书可以通过Malleable C配置文件来导入,关于详细内容作者建议去看Mealleable C2的文档(https://www.cobaltstrike.com/help-malleable-c2#validssl)。

七、重定向(代理)

重定向器是位于目标网络与你的Cobalt Strike实例之间的服务,将目标网络流量转发到你的Cobalt Strike实例。重定向是Beacon回连到你的团队服务器所在位置的一种方法,同时也可以在渗透测试中隐藏自己的真实ip,多个重定向可以为你提供多个ip地址。

下图所示r1,r2,r3为三个重定向器。

image-20210201155937248

作者在此推荐了三种方法:

  1. 重定向可以使用工具iptables、socat等工具将流量转发至团队服务。

​ socat工具使用:socat TCP-LISTEN:80,fork TCP4:[team server]:80

(实操演示详见视频27:50)

  1. 也可以使用Apache或者Nginx的反向代理来做重定向。

  2. 使用CDN来做HTTPS的流量转发。

对于CDN做重定向的建议:

  1. 使用有效的SSL证书。(很多CDN都会要求)使用Beacon的有效SSL证书:Malleable Command and Control - Cobalt Strike
  2. 确保CDN可以以POST和GET方式发送信息到团队服务器。
  3. HTTP-GET only C2(下节课介绍)
  4. 禁用所有的缓存(为了确保重定向的请求到达CDN后转发到cobalt strike服务器)
  5. 注意转换处理后的请求(有些CDN会对你的请求做一些处理,这会导致cs服务器与beacon之间的通信数据与你预先在Malleable C2设置的不同从而打乱cs服务器与beacon的通信,假如你使用cookie数据来进行传递任务,而亚马逊的 CloudFront(CDN)会重新排列cookie。)

为了避免出错可以设置Mealleable C2配置文件使得HTTP GET既可以下载任务,也可以将数据发送回Cobalt Strike。

八、域前端技术

Domain Fronting翻译作域前端或者域前置,是一种隐藏C2真实地址的技术,可用来绕过安全设备的检测。首先要了解CDN的原理:客户端向发出的请求首先经过CDN服务器,CDN服务器检查自己本地是否有客户端的请求内容,如果有直接从CDN服务器返回给客户,如果没有则向客户源服务器进行请求,并将请求的返回结果添加到自己的缓存中。将CDN作为代理最好关闭CDN的缓存功能,使得每次请求都能到达源服务器。

先来谈谈普通的CDN做代理技术

CDN服务商为自己的客户提供服务,这其中就有很多比较知名的、信誉良好的一些客户,或者说信誉良好的一些域名。我们的C2服务器也是CDN的客户服务器之一。正常情况下,客户的请求先发送到CDN服务器,CDN服务器本地没有缓存的时候就转发给对应的客户源服务器。下图所示的三个请求中,请求域名“O”的请求被转发到“O”的源服务器,请求域名“T”的请求被转发到“T”的源服务器,请求C2的请求被转发到C2服务器。

image-20210615151308141

利用CDN做代理的好处就是我们的C2服务器和其他CDN客户所使用的ip都是CDN服务商统一提供的,一般不会被认定为是恶意ip。

域前端的思想:客户端向域名T发送的请求到达CDN后,CDN并不会转发到T客户服务器,而是发给了C2服务器。(如下图所示)

image-20210615152656940

这在外部看来就是客户端在跟“T”进行正常通信,但实际上,是在和C2服务器通信,但使用的却是一个良好信誉的域名“T”,“T”在这里的作用就像是你的重定向服务器。

原理:域前端的核心思想是在不同的通信层使用不同的域名。客户端发出一个请求,请求X域名,首先做DNS解析,得到的是CDN的IP地址,然后客户端根据解析到的IP访问到CDN,当请求到达CDN后,CDN并不关心你在访问到他之前请求DNS解析的是哪个域名,他只知道他收到了一个请求,你与他建立了TCP连接,这个连接经过CDN解析后才会知道他(CDN服务器)需要返回哪些缓存或者去请求哪个源服务器。所以问题的关键就在于CDN是如何从请求中进行解析获取客户要访问的源服务器呢?HTTP/HTTPS请求头中都会有HOST字段,CDN收到请求后就根据HOST的值来确定要返回的资源来自哪个源服务器。而Beacon的请求就可以自定义指定HOST的值,这样就可以将看似走向其他域名的请求转最终到达C2服务器。如下图,客户端请求的是T,但是HOST的值为C2,CDN收到后请求的是C2的资源。

image-20210615160920955

域前端技术的防范与突破

如果客户端与CDN之间存在代理服务器(下图中的P),那么客户端发送到CDN的请求数据在代理服务器那里是完全透明可见的,代理服务器会检测到客户端发出的HTTP请求中请求的是T,但是HOST的值却是C2,这时候代理服务器可能就会去修改HOST的值,将C2改为T。然后,当请求到达CDN后,CDN请求的就是源服务器T了。

image-20210615161617303

当客户端以HTTPS的方式发出请求时,代理服务器一般只是作为中转的作用,因为客户端发出的请求包是加密的,代理服务器并不知道请求包的内容。这时候请求通过代理服务器后被发送到CDN,CDN检测到HOST的值是C2,所以会向C2进行请求(如下图)。

image-20210615162538664

但是在有些设备会解密获取到HTTPS包的内容,这样就会跟上面所说的HTTP的情况相同。但是一般不会对所有的目标都进行数据包的检测,比如一些值得信赖的域名,像金融或者医疗保健行业的请求数据包,此类数据包中可能包含金融账户密码或者医疗保健信息。所以对于一些特定的域名可能会被放行,这点就可以作为突破口。

CDN对域前端防范

对于域前端技术,CDN提供商也做了相应的措施,有些CDN会检测HTTPS请求包的SNI的值。

先来了解一下SNI,SNI的全称是Server Name Indication,他是用来改善服务器与客户端 SSL (Secure Socket Layer)和 TLS (Transport Layer Security) 的一个扩展。他的作用是支持一台服务器上可以为多个域名提供服,也就是允许多个DNS主机名由同一IP地址上的单个服务器(通常为Web服务器)托管。
SNI介绍:SNI协议分析 - 简书 (jianshu.com)

SNI(Server Name Indication)_浴血重生-学习空间-CSDN博客

在客户端连接CDN之前,客户端在DNS请求中使用的是无害的值得信赖的域名来进行访问,在HTTPS包中SNI的值也是使用该域名,虽然可能代理服务器只知道SNI的值而不知道HOST的值,在他看来这个请求是正常的,但是CDN会检测SNI的值以此作为确定寻找源服务器的依据,当CDN服务器检测到SNI的值与HOST的值不同时,他会修改HOST的值。如下图,原本的数据包SNI的值为T,HOST的值为c2,CDN将其改为T。

image-20210617111027011

在cobalt strike4以后使用域前端时,在建立cobaltstrike监听器时可以为stager设置HTTP Host Header(下图中HTTP Host Header字段),这样设置后beacon跟C2发送的数据包中Host Header都会使用设置的值。下图为cobaltstrike4.0的监听器配置信息。

image-20211202203857807

九、Cobalt Strike 的整合

在之前的cobalt strike版本中,建立的监听器只能有一种类型的,比如建立了一个普通的HTTP监听器,再建立一个另一种流量特征的监听器比如GET-only(beacon请求和返回数据只使用GET方式传送数据)则需要在一个新的C2服务器上建立,而在cobalt strike4中可以将不同类型的监听器全部整合在一个C2服务器上。

下图为cobalt strike3.x的http监听器建立

image-20211202210054583

cobalt strike4之后可以建立多个不同特征和类型的监听器,可以在beacon和C2服务器直接做一个重定向的代理服务器,将流量转发到C2的指定端口,还可以使用cobalt strike4中新增的”variants”文件来为每个监听器定制不同的流量特征。(有关variants文件的相关介绍在第三节课)

Variants文件介绍:Cobalt Strike 4.0 - Variants (fortynorthsecurity.com)

下图为cobalt strike4.0的http监听器和tcp监听器建立

image-20211202200618192

十、DNS Beacon

DNS beacon是使用DNS协议进行DNS查询来与C2在internet上通信的一种beacon。

image-20211202210131458

原理:

如上图所示,目标主机中的beacon发出对域名1234.profiles.losenolove.com的DNS查询。

  1. 第一步:目标主机对Local DNS Server(本地DNS服务器)发起查询,询问是否知道1234.profiles.losenolove.com对应的ip,Local DNS Server并不知道,此时Local DNS Server会进行迭代查询。

  2. 第二步:当Local DNS Server本地缓存中没有1234.profiles.losenolove.com的DNS解析信息时他会请求Root Sever,询问Root Sever是否知道1234.profiles.losenolove.com对应的ip地址,而Root Sever并不不知道,但是他会返回.com域名服务器的地址,让Local DNS Server去在.com服务器进行查找。

  3. 第三步:Local DNS Server对.com服务器进行询问,同理,.com返回的是losenolove.com的地址。

  4. 第四步:Local DNS Server对losenolove.com进行查询,同理,losenolove.com返回了profiles.losenolove.com的地址,让Local DNS Server去找profiles.losenolove.com进行查询,而profiles.losenolove.com对应的IP正是C2的地址。

  5. 第五步:Local DNS Server对profiles.losenolove.com(即C2服务器)进行查询,C2服务器收到查询的域名1234.profiles.losenolove.com解析1234的含义,如果有任务进行执行,则返回相应的数据给Local DNS Server,Local DNS Server收到响应后将对应的查询结果数据返回给目标主机,DNS beacon将解析返回的数据并执行相应的任务。如果没有需要执行的任务,则profiles.losenolove.com(即C2服务器)会返回一个提前设定好的值,如0.0.0.0。

下图为DNS监听器的配置

image-20211202212900757

在之前版本的DNS beacon的通信中,每隔心跳时间后DNS beacon会以DNS查询的方式与C2进行通信,询问是否有任务执行,如果有会返回相应的数据,如ip地址,此时beacon会发出HTTP请求去下载执行任务,作者说这样做的原因是在没有任务要执行的时候减少不必要的http通信来隐藏beacon。但是如果防火墙设置了DNS可以通过HTTP无法通过时就会遇到虽然有beacon,但是却无法下发任务去执行的处境。因此在Cobalt Strike4.0之后添加了DNS协议数据的通信,而不再使用DNS和HTTP混合的模式,默认使用dns-txt。

可以使用mode命令来更改通信信道:

  • mode dns 是 DNS A 记录数据通道;

  • mode dns6 是 DNS AAAA 记录数据通道;

  • mode dns-txt 是 DNS TXT 记录数据通道。DNS TXT 记录是默认的数据通道。

image-20211202215031890

DNS beacon的配置

DNS beacon建立的目标是使C2服务器成为对应域名或子域名的权威域名服务器,让C2服务器去解析该子域名。即C2为域名解析服务器。

创建一个 DNS A记录然后指向你的Cobalt Strike团队服务器使用 DNS NS记录来将多个域名或子域名委派到你的Cobalt Strike团队服务器的A记录。

image-20211202220604011

使用nslookup来检测是否设置成功,如果你得到了一个 0.0.0.0 (默认返回值,可修改)的 A 记录回复说明你的DNS配置是对的。如果你没有得到回复,那说明你的 DNS 配置不对。

十一、SMB Beacon

image-20211203131817635

SMB beacon是使用windows命名管道(Named Pipes)进行通信的一种payload,通过父beacon来跟C2通信。因为命名管道使用SMB协议来传输流量因此称为SMB beacon。

断开与重连

SMB beacon可以在不必要通信的时候断开连接状态,即SMB beacon与他的父beacon断开连接进入待连接状态,在需要使用的时候再次恢复连接即可。

连接到一个SMB beacon:link [host] [pipe] #第二个参数管道名称可以使用Tab键补齐。

断开一个SMB beacon:unink [host] [pid]

连接时候错误代码:

  • 2 :文件未找到,即没有找到要连接的这个beacon。
  • 5: 没有权限连接到这个beacon,即没有权限访问该命名管道。
  • 53: 与目标系统没有建立信任关系,无法与目标主机进行通信。

Cobalt Strike的Pivo Graph视图模式可以清楚的看到当前SMB beacon与父benacon之间的连接关系。

image-20211203134213706

十二、TCP Beacon

TCP beacon与SMB beacon类似,都是通过父beacon来与C2服务器进行通信。TCP beacon使用TCP socket来通信。

同样可以断开来连接和重新连接:

  • 连接到TCP beacon:connect [host] [port] # 也可以使用Tab键补齐

  • 断开连接:unlink [host] [pid]

十三、外置C2(External C2)

外置 C2 是一种规范,允许第三方程序充当Cobalt Strike的Beacon payload 的通信层。这些第三方程序连接到Cobalt Strike来阅读预定使用的帧,并使用以此种方式控制的payload的输出写帧。这些第三方程序使用外置C2服务器来与你的 Cobalt Strike 团队服务器交互。

image-20211204133859954

上图为External C2的数据流图,左上角和右下角黄色块的分别为cobalt strike的服务端和目标系统的SMB beacon,在这两者直接的两个绿色块就是第三方程序或者控制工具。也就是说,在cobalt strike的通信层使用第三方的工具或程序来实现。

不同于其他类型的监听器,外部C2监听器只是监听指定的端口,并与第三方程序服务端或接口进行通信。

image-20211204140635240

官方介绍:External C2 (helpsystems.com)

案 例:

视频演示:External C2 (Cobalt Strike 4.0) - YouTube

相关参考

  1. Red Team Ops with Cobalt Strike (2 of 9): Infrastructure - YouTube

  2. Welcome to Cobalt Strike (helpsystems.com)

  3. SNI(Server Name Indication)_浴血重生-学习空间-CSDN博客

  4. Cobalt Strike的高使用率重定向器和域前端 - 码农教程 (manongjc.com)

  5. Blocking-resistant communication through domain fronting (bamsoftware.com)

  6. Cloud-based Redirectors for Distributed Hacking - Cobalt Strike Research and Development

  7. Cobalt Strike 4.0 - Variants (fortynorthsecurity.com)

  8. Windows 命名管道研究初探 - 安全客,安全资讯平台 (anquanke.com)

  9. Cobalt Strike 4.0 手册(奇安信A-Team翻译版)

CATALOG
  1. 1. 内容概要
  2. 2. 一、什么是监听器?
  3. 3. 二、cobalt strike中的监听器类型
  4. 4. 三、Payload Staging
  5. 5. 四、HTTP Beacon的工作原理
  6. 6. 五、HTTP Beacon监听器配置
  7. 7. 六、HTTPS Beacon
  8. 8. 七、重定向(代理)
  9. 9. 八、域前端技术
  10. 10. 九、Cobalt Strike 的整合
  11. 11. 十、DNS Beacon
  12. 12. 十一、SMB Beacon
  13. 13. 十二、TCP Beacon
  14. 14. 十三、外置C2(External C2)
  15. 15. 相关参考