这是cobalt strike 4.0官方教程的第二节观看笔记笔记。两年之前的课一直拖到现在才写。。。
配合视频食用效果更佳!
内容概要
- 监听器管理
- 不同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的特性
在菜单栏点击Cobalt Strike->Listeners
就可以看到监听器管理页面,在这里可以添加、编辑、删除监听器等操作。添加新的监听器需要输入监听器的名称并选择相应的payload。(作者建议:监听器名称最好有足够的描述性,这样可以方便队友了解其作用以及特性)
三、Payload Staging
什么是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示意图:
payload分为两种
stageless类型的:没有stager的payload,直接传送payload到目标。
stager类型的:将payload分阶段传送到目标中。相比stageless类型的payload而言,这种类型的不安全,容易出错,更容易被侦察到。但是在有些限制条件比较苛刻的环境中不得不用stager来分阶段传输payload。
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请求。
五、HTTP Beacon监听器配置
在菜单栏点击Cobalt Strike->Listeners->
点击下方的Add
就会弹出监听器配置对话框。
在设置完监听器的名称和payload类型后,这里对HTTP Beacon的监听器的相关配置进行说明。
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起作用。
六、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为三个重定向器。
作者在此推荐了三种方法:
- 重定向可以使用工具iptables、socat等工具将流量转发至团队服务。
socat工具使用:socat TCP-LISTEN:80,fork TCP4:[team server]:80
(实操演示详见视频27:50)
也可以使用Apache或者Nginx的反向代理来做重定向。
使用CDN来做HTTPS的流量转发。
对于CDN做重定向的建议:
- 使用有效的SSL证书。(很多CDN都会要求)使用Beacon的有效SSL证书:Malleable Command and Control - Cobalt Strike
- 确保CDN可以以POST和GET方式发送信息到团队服务器。
- HTTP-GET only C2(下节课介绍)
- 禁用所有的缓存(为了确保重定向的请求到达CDN后转发到cobalt strike服务器)
- 注意转换处理后的请求(有些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服务器。
利用CDN做代理的好处就是我们的C2服务器和其他CDN客户所使用的ip都是CDN服务商统一提供的,一般不会被认定为是恶意ip。
域前端的思想:客户端向域名T发送的请求到达CDN后,CDN并不会转发到T客户服务器,而是发给了C2服务器。(如下图所示)
这在外部看来就是客户端在跟“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的资源。
域前端技术的防范与突破
如果客户端与CDN之间存在代理服务器(下图中的P),那么客户端发送到CDN的请求数据在代理服务器那里是完全透明可见的,代理服务器会检测到客户端发出的HTTP请求中请求的是T,但是HOST的值却是C2,这时候代理服务器可能就会去修改HOST的值,将C2改为T。然后,当请求到达CDN后,CDN请求的就是源服务器T了。
当客户端以HTTPS的方式发出请求时,代理服务器一般只是作为中转的作用,因为客户端发出的请求包是加密的,代理服务器并不知道请求包的内容。这时候请求通过代理服务器后被发送到CDN,CDN检测到HOST的值是C2,所以会向C2进行请求(如下图)。
但是在有些设备会解密获取到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。
在cobalt strike4以后使用域前端时,在建立cobaltstrike监听器时可以为stager设置HTTP Host Header(下图中HTTP Host Header字段),这样设置后beacon跟C2发送的数据包中Host Header都会使用设置的值。下图为cobaltstrike4.0的监听器配置信息。
九、Cobalt Strike 的整合
在之前的cobalt strike版本中,建立的监听器只能有一种类型的,比如建立了一个普通的HTTP监听器,再建立一个另一种流量特征的监听器比如GET-only(beacon请求和返回数据只使用GET方式传送数据)则需要在一个新的C2服务器上建立,而在cobalt strike4中可以将不同类型的监听器全部整合在一个C2服务器上。
下图为cobalt strike3.x的http监听器建立
cobalt strike4之后可以建立多个不同特征和类型的监听器,可以在beacon和C2服务器直接做一个重定向的代理服务器,将流量转发到C2的指定端口,还可以使用cobalt strike4中新增的”variants”文件来为每个监听器定制不同的流量特征。(有关variants文件的相关介绍在第三节课)
Variants文件介绍:Cobalt Strike 4.0 - Variants (fortynorthsecurity.com)
下图为cobalt strike4.0的http监听器和tcp监听器建立
十、DNS Beacon
DNS beacon是使用DNS协议进行DNS查询来与C2在internet上通信的一种beacon。
原理:
如上图所示,目标主机中的beacon发出对域名1234.profiles.losenolove.com的DNS查询。
第一步:目标主机对Local DNS Server(本地DNS服务器)发起查询,询问是否知道1234.profiles.losenolove.com对应的ip,Local DNS Server并不知道,此时Local DNS Server会进行迭代查询。
第二步:当Local DNS Server本地缓存中没有1234.profiles.losenolove.com的DNS解析信息时他会请求Root Sever,询问Root Sever是否知道1234.profiles.losenolove.com对应的ip地址,而Root Sever并不不知道,但是他会返回.com域名服务器的地址,让Local DNS Server去在.com服务器进行查找。
第三步:Local DNS Server对.com服务器进行询问,同理,.com返回的是losenolove.com的地址。
第四步:Local DNS Server对losenolove.com进行查询,同理,losenolove.com返回了profiles.losenolove.com的地址,让Local DNS Server去找profiles.losenolove.com进行查询,而profiles.losenolove.com对应的IP正是C2的地址。
第五步: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监听器的配置
在之前版本的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 记录是默认的数据通道。
DNS beacon的配置
DNS beacon建立的目标是使C2服务器成为对应域名或子域名的权威域名服务器,让C2服务器去解析该子域名。即C2为域名解析服务器。
创建一个 DNS A记录然后指向你的Cobalt Strike团队服务器使用 DNS NS记录来将多个域名或子域名委派到你的Cobalt Strike团队服务器的A记录。
使用nslookup来检测是否设置成功,如果你得到了一个 0.0.0.0 (默认返回值,可修改)的 A 记录回复说明你的DNS配置是对的。如果你没有得到回复,那说明你的 DNS 配置不对。
十一、SMB Beacon
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之间的连接关系。
十二、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 团队服务器交互。
上图为External C2的数据流图,左上角和右下角黄色块的分别为cobalt strike的服务端和目标系统的SMB beacon,在这两者直接的两个绿色块就是第三方程序或者控制工具。也就是说,在cobalt strike的通信层使用第三方的工具或程序来实现。
不同于其他类型的监听器,外部C2监听器只是监听指定的端口,并与第三方程序服务端或接口进行通信。
官方介绍:External C2 (helpsystems.com)
案 例:
- “Tasking” Office 365 for Cobalt Strike C2 (f-secure.com)
- FSecureLABS/C3: Custom Command and Control (C3). A framework for rapid prototyping of custom C2 channels, while still providing integration with existing offensive toolkits. (github.com)
视频演示:External C2 (Cobalt Strike 4.0) - YouTube