CobaltStrike 流量分析与入侵检测

CobaltStrike 流量分析与入侵检测

前言

CobaltStrike 是一款用于团队协作的内网渗透工具,在攻防、测试中扮演着重要角色,其功能强大、使用人数众多,已被各大安全厂商列入重点”照顾”对象。常见的检测方式有基于内存和基于流量两种,本文从流量角度出发,通过抓包、解包来分析 c2 与 beacon 间的通信过程,并尝试从中提取流量特征转化为 ids 检测规则。

CobaltStrike 流量分析与入侵检测

流量分析

2.1 http-staging

(1)stage 下载

stager 可执行文件 artifact.exe 运行后会有一个 payload 下载过程,使用 http 协议从指定服务器下载 stage 。

CobaltStrike 流量分析与入侵检测

其中 http 请求路径不唯一,但都符合一个 checksum8 规则,即:路径的 ascii 之和与 256 取余计算值等于 92 。

#  /Yle2、/cKTZ、/wQPD

CobaltStrike 流量分析与入侵检测

而下载的文件约 211kb,解析后可以看到回连地址、加密字段、公钥等配置信息。

CobaltStrike 流量分析与入侵检测

(2)beacon 上线

随后 beacon 按设置的频率以 get 方法向 c2 服务器发起心跳请求,通过 cookie 携带靶机信息。

CobaltStrike 流量分析与入侵检测

此时 client 界面可以看见目标机器上线:

CobaltStrike 流量分析与入侵检测

(3)命令下发

c2 服务器如果有任务下发,则放入 http 心跳请求返回包中。

CobaltStrike 流量分析与入侵检测

当前下发的命令:whoami

CobaltStrike 流量分析与入侵检测

(4)结果回传

beacon 端处理完成后,通过 post 方法回传数据。

CobaltStrike 流量分析与入侵检测

注:https-beacon 在 http-beacon 的基础上加入了 tls 层对流量加密,其他过程相似。

CobaltStrike 流量分析与入侵检测

2.2 dns-stagless

CobaltStrike 流量分析与入侵检测

(1)beacon 上线

与 staging 阶段不同,stagless 不需要额外加载 stage,运行 dns-beacon.exe后,beacon 端发起一个A记录查询,查询内容为16进制字符串地址,表示靶机信标已上线,c2 服务器收到请求后回复 0.0.0.0 表示确认消息。

CobaltStrike 流量分析与入侵检测

此时,在客户端可以看见一个不同于 http(s)上线的黑框记录。

CobaltStrike 流量分析与入侵检测

(2)beacon 激活

客户端控制台输入 checkin 或其他指令激活窗口,dns-beacon服务器支持A、TXT、AAAA三种方式下发payload,激活后默认使用TXT记录,流量中表现为 0.0.0.243,除此之外还可以通过 mode 指令切换为A、AAAA 记录,流量中表现为 0.0.0.241、0.0.0.245,随后 beacon 端发起以 www 为首的A记录请求,向 c2 服务器传递靶机基础信息。

CobaltStrike 流量分析与入侵检测

(3)命令下发

beacon 准备接收 c2 任务,先发送以 api 开头的A记录请求告知 c2 服务器可以开始下发任务,即图中的 0.0.0.243-TXT 方式,随后发起以 api 开头的 TXT 记录请求等待 c2 服务器返回数据。

CobaltStrike 流量分析与入侵检测

(4)结果回传

beacon 端执行完命令后,再向 c2 服务器发起以 post 开头的A记录查询回传执行结果。

CobaltStrike 流量分析与入侵检测

特征提取

上一节对使用默认配置文件的 cobaltstrike 交互过程进行了分析,流量中存在很多特征,但在实际攻防、测试中红队常使用 Malleable-C2-Profiles 来修改 c2 配置实现应用层流量混淆,从而绕过部分安全设备监控,这里就以 profile 为界限将特征划分为基础特征和强特征两个方向,即:

① 基础特征:使用默认配置时存在的特征,可通过修改 profile 文件或证书将其隐藏;

② 强特征:需要修改 cobaltstrike 源码才能较好去除的这部分特征。

3.1 基础特征

(1)http 请求

http-beacon通信中,默认使用get方法向 /dpixel、/__utm.gif、/pixel.gif 等地址发起请求,同时请求头存在 cookie 字段并且值为 base64 编码后的非对算算法加密数据。


# default c2-http profile
# define indicators for an HTTP GET
http-get {
    # Beacon will randomly choose from this pool of URIs
    set uri "/ca /dpixel /__utm.gif /pixel.gif /g.pixel /dot.gif /updates.rss /fwlink /cm /cx /pixel /match /visit.js /load /push /ptj /j.ad /ga.js /en_US/all.js /activity /IE9CompatViewList.xml";

    client {
        # base64 encode session metadata and store it in the Cookie header.
        metadata {
            base64;
            header "Cookie";
        }
    }

    server {
        # server should send output with no changes
        header "Content-Type" "application/octet-stream";

        output {
            print;
        }
    }
}
CobaltStrike 流量分析与入侵检测

(2)https 证书

https-beacon 通信中,默认使用空证书建立加密通道,流量中可以看见这一过程。

CobaltStrike 流量分析与入侵检测

(3)dns 异常返回值

dns-beacon 通信中,默认使用 “cdn.”、“www6.”、“api.”、“www.”、“post.”  为开头发起 dns 请求,并且查询结果伴随 0.0.0.0、0.0.0.80、0.0.0.241 等非常规 IP 。

CobaltStrike 流量分析与入侵检测

3.2 强特征

(1)chechsum8

运行 staging 模式的pe文件,会向指定服务器的checksum8 路径发起请求来下载 stage 。

CobaltStrike 流量分析与入侵检测

即使通过 profile 文件改变下载地址,但c2服务器依然会对checksum8 地址请求作出响应。


# https://github.com/threatexpress/malleable-c2/blob/master/jquery-c2.4.6.profile
http-stager {  
    set uri_x86 "/jquery-3.3.1.slim.min.js";
    set uri_x64 "/jquery-3.3.2.slim.min.js";
    ...
}
CobaltStrike 流量分析与入侵检测

(2)ja3/ja3s

ja3 和 ja3s 分别代表 tls 握手阶段的 client-hello、server-hello 的数据集合计算出的哈希值(md5),相同版本相同系统下指纹相同,该特征与操作系统、cobaltstrike 版本有关,profile 文件无法对其修改。

# win10-https-beacon-ja3 指纹:72a589da586844d7f0818ce684948eea
CobaltStrike 流量分析与入侵检测
# centos-cs4.4-ja3s 指纹:fd4bc6cea4877646ccd62f0792ec0b62
CobaltStrike 流量分析与入侵检测

3.3 小结

CobaltStrike 流量分析与入侵检测

规则编写

根据前面提取的特征,共整理出 17 条 ids 规则。这一节对其中的 5 条进行讲解,其余规则和过程文件已上传至 github 。

https://github.com/ainrm/cobaltstrike-suricata-rules

4.1 checksum8 检查

同时命中以下三条规则则触发告警:

① 由客户端发起并与目标服务器建立连接:flow: established, to_server;

② 请求路径长度为5:urilen:4<>6;

③ 调用lua计算路径的ascii之和并与256做取余操作,结果为92:luajit:checksum8_check.lua 。

CobaltStrike 流量分析与入侵检测

完整规则:


# suricata规则
# http-beacon-staging,向c2服务器发起get请求,下载大小约210kb的stager,请求地址符合checksum8规则
# 调用lua检查uri是否符合checksum8规则:计算uri的ascii之和并与256做取余计算,余数为92则符合规则
alert http any any -> any any (gid:3333; sid:30001; rev:1; \
    msg:"http-beacon-checksum8-path-parse"; \
    classtype: http-beacon; \
    flow: established, to_server; \
    urilen:4<>6; \
    luajit:checksum8_check.lua; \
)


# checksum8_check.lua
function init (args)
    local needs = {}
    needs["http.uri"] = tostring(true)
    return needs
end

function match(args)
    local uri_raw = tostring(args["http.uri"])
    local uri = string.sub(uri_raw, 2, -1) -- 去除uri中的"/"
    local sum = 0

    for i=1,#uri do
        local x = string.sub(uri,i,i)
        sum = sum + string.byte(x)
    end

    if (sum % 256) == 92 then
        return 1 -- 符合checksum8规则,匹配成功
    else 
        return 0 -- 不符合checksum8规则,匹配失败
    end
end

4.2 ja3/ja3s 检查

满足其中之一则命中规则触发告警:

① 采用黑名单机制,正则匹配由 beacon 端发起请求的 ja3 指纹;

② 采用黑名单机制,正则匹配由 c2 端返回的 ja3s 指纹。

CobaltStrike 流量分析与入侵检测

完整规则:

# https-beacon-ja3指纹,client-hello
alert tls any any -> any any (gid:6666; sid:30005; rev:1; \
    msg:"https-beacon-ja3-hash"; \
    classtype: https-beacon; \
    ja3.hash; pcre:"/652358a663590cfc624787f06b82d9ae|4d93395b1c1b9ad28122fb4d09f28c5e|72a589da586844d7f0818ce684948eea|a0e9f5d64349fb13191bc781f81f42e1/"; \
)


# https-beacon-ja3s指纹,server-hello
alert tls any any -> any any (gid:6666; sid:30006; rev:1; \
    msg:"https-beacon-ja3s-hash"; \
    classtype: https-beacon; \
    ja3s.hash; pcre:"/fd4bc6cea4877646ccd62f0792ec0b62|15af977ce25de452b96affa2addb1036|b742b407517bac9536a77a7b0fee28e9/"; \
)

4.3 异常dns检查

(1)A记录异常返回

同时命中以下两条规则则触发告警:

① dns 流量内容包含二进制数 00 01 00 01 00 00 00:content:”|00 01 00 01 00 00 00|”;

② dns 返回包以 0.0.0.241结尾:content:”|00 00 00 f1|”; nocase; endswith 。

CobaltStrike 流量分析与入侵检测

完整规则:

# dns-beacon,匹配dns-beacon发起上线/心跳请求后,c2服务器的返回包,选择后续使用A记录
# Type: A, Class: IN, 0.0.0.241
alert dns any any -> any any (gid:9999; sid:30011; rev:1; \
    msg:"dns-beacon-live-response"; \
    classtype: dns-beacon; \
    content:"|00 01 00 01 00 00 00|"; \
    content:"|00 00 00 f1|"; nocase; endswith; \
)

(2)txt记录异常返回

同时命中以下四条规则则触发告警:

① 由 c2 端发起请求:flow:to_client;

② dns 流量内容包含api字符:pcre:”/api/”;

③ dns 流量内容包含二进制数 00 01 00 01 00 00 00:content:”|00 01 00 01 00 00 00|”;

dns 返回包以 0.0.0.50结尾:content:”|00 00 00 50|”;endswith 。

CobaltStrike 流量分析与入侵检测

完整规则:


# dns-beacon,匹配dns-beacon使用TXT方式向c2服务器发起payload下载请求后,c2服务器的返回包
# api ==> TXT 
# Type: A, Class: IN, 0.0.0.80
alert udp any any -> any any (gid:9999; sid:30015; rev:1; \
    msg:"dns-beacon-getpayload-response"; \
    classtype: dns-beacon; \
    flow:to_client; \
    pcre:"/api/"; \
    content:"|00 01 00 01 00 00 00|"; \
    content:"|00 00 00 50|"; endswith; \

4.4 测试

(1)白流量

hexdump 抓取访问 baidu 站点流量,测试结果没有产生误报。

CobaltStrike 流量分析与入侵检测

(2)http-beacon

识别出 stage 下载、心跳请求、执行结果回传三种流量。

CobaltStrike 流量分析与入侵检测

(3)https-beacon

识别出 ja3、ja3s、cert 三种 cs 流量。

CobaltStrike 流量分析与入侵检测

(4)dns-beacon

识别出心跳请求、结果回传、元数据提交、payload 下载四种 cs 流量。

CobaltStrike 流量分析与入侵检测

总结

CobaltStrike 默认配置文件具有较为明显的流量特征,容易被监管设备查杀,使用 malleable-c2、证书等手法能够在一定程度上混淆流量,但在整个 tcp/ip 模型中依然存在蛛丝马迹,无法脱离 CobaltStrike 框架。对攻击方来说想要究极隐藏,笔者认为还得要从源头入手,在魔改 cs 或自研网络通信模型上想想办法,同时这对防守方来说提出了更高的要求,能否应对来自高级攻击者发起的挑战。

参考链接:

1.https://www.52pojie.cn/thread-1426936-1-1.html

2.https://www.52pojie.cn/thread-1607839-1-1.html

3.https://suricata.readthedocs.io/en/latest/rules/index.html

4.https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/cs-mu-biao-shang-xian-guo-cheng

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。