跳转至

C2云函数防御

云函数返回包特征

Text Only
X-Request-Id: 请求的id
X-Api-FuncName: 函数名,比如我在云函数里面设置的就是 test,这个是会被看出来的,所以建议红队伪装一个业务名字 
X-Api-AppId: 对应账号但是不是账号,后面说明
X-Api-ServiceId: 服务id
X-Api-HttpHost: 就是把appid 账号id 还有腾讯云函数的域名放一起
X-Api-Status: 200 返回值
X-Api-UpstreamStatus: 200  返回值

但凡看到有这个格式,基本可以判断是云函数了(但具体是不是业务需要和甲方业务组沟通)

profile文件分析

红队对cs魔改大部分是profile文件,这是一个比较常见的云函数的profile文件

Bash
set sample_name "t";
set sleeptime "3000";
set jitter    "0";
set maxdns    "255";
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";

http-get {
    set uri "/api/x";

    client {
        header "Accept" "*/*";
        metadata {
            base64;
            prepend "SESSIONID=";
            header "Cookie";
        }
    }
    server {
        header "Content-Type" "application/ocsp-response";
        header "content-transfer-encoding" "binary";
        header "Server" "Nodejs";
        output {
            base64;
            print;
        }
    }
}
http-stager {  
    set uri_x86 "/vue.min.js";
    set uri_x64 "/bootstrap-2.min.js";
}
http-post {
    set uri "/api/y";
    client {
        header "Accept" "*/*";
        id {
            base64;
            prepend "JSESSION=";
            header "Cookie";
        }
        output {
            base64;
            print;
        }
    }
    server {
        header "Content-Type" "application/ocsp-response";
        header "content-transfer-encoding" "binary";
        header "Connection" "keep-alive";
        output {
            base64;
            print;
        }
    }
}

您可以通过配置文件配置 Beacon 的默认值。有两种类型的选项:全局选项和局部选项。全局选项更改全局的信标设置。

本地选项是特定于事务的 (这句话的翻译自cs的官方手册,原文是 Local options are transaction specific 在我看来,在这里的意思是专注于方式的配置,比如对于http协议应该如何配置,对于https又应该选择如何配置)

全局选项

1 set sleeptime

Text Only
set sleeptime "3000";

是设置默认的睡眠时间,注意此处是以毫秒为单位的

2 set jitter

Text Only
set jitter "0";

这个是设置数据抖动

官方给出的解释是

Text Only
Append random-length string (up to data_jitter value) to http-get and http-post server output.

就是让返回包的大小在一定范围内随机抖动,单位是百分比

在一些文章中,会通过它cs流量包的默认大小来溯源,建议修改

3 set maxdns

Text Only
set maxdns

通过 DNS 上传数据时主机名的最大长度 (0-255)

详情见于

https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/malleable-c2_dns-beacons.htm?Highlight=maxdns

4 set useragent

Text Only
set useragent 

这个显而易见 设置UA

如果你对这个感兴趣,可以参考

Text Only
https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/malleable-c2_profile-language.htm#_Toc65482842

局部选项

首先它会有一个模板

Bash
# this is a comment
http-get {
    set uri "/api/x";

    client {
        header "Accept" "*/*";
        metadata {
            base64;
            prepend "SESSIONID=";
            header "Cookie";
        }
    }
    server {
        header "Content-Type" "application/ocsp-response";
        header "content-transfer-encoding" "binary";
        header "Server" "Nodejs";
        output {
            base64;
            print;
        }
    }
}

这是一个对get请求方式的局部选项配置

set uri

set uri 分配客户端和服务器在此事务期间将引用的 URI, set 语句需要出现在客户端和服务器代码块之外,因为它适用于它们两者。

client

header 添加header

Bash
metadata {
    base64;
    prepend "SESSIONID=";
    header "Cookie";
}

是代表metadata先经过一次base64编码,再在编码后的数据前面添加"SESSIONID=",最后在修改过的数据后添加 header头 "Cookie";

server

Bash
output {
    base64;
    print;
}

输出的metadata进行base64编码,再打印

CS流量解密

可以参考:https://github.com/WBGlIl/CS_Decrypt

分析与反制思路

所以 综上所述 有几个分析与反制的思路

  • 判断流量特征
  • 如果是stage,会有一个payload下载阶段,大小约为210kb,payload未解密之前间隔有大批量重复字符串(cs本身特征)
  • 未经魔改的云函数配置在stage下载阶段访问/bootstrap-2.min.js (配置文件特征),同时返回包有很大一串加密数据,且路径的ascii之和与256取余计算值等于92(cs本身特征)
  • 未经魔改的云函数会访问/api/getit这样类似api的模式,可以重点关注(配置文件特征)
  • 云函数的host是service-173y3w0z-xxxxxxxxxx.sh.apigw.tencentcs.com这样的格式,有点类似域前置,host为白域名,可以着重注意host为apigw.tencentcs.com格式的流量,如果业务部门没有这样的业务,特殊时期,可以直接封禁这个域名apigw.tencentcs.com(云函数特征)
  • 请求头中会有云函数的特有特征,如
    • X-Request-Id: 请求的id X-Api-FuncName: 函数名 X-Api-AppId: 对应账号但是不是账号 X-Api-ServiceId: 服务id X-Api-HttpHost: 就是把appid 账号id 还有腾讯云函数的域名放一起 X-Api-Status: 200 返回值 X-Api-UpstreamStatus: 200 返回值
  • 抓包看流量,通信的IP是腾讯云的CDN服务器IP
  • 反制手段
  • 批量上线钓鱼马
    • 从cs客户端可以看出,上线后的ip过一会就会自动变一次(云函数特性),一次性上线大量ip会让红队直接无法分辨(直接放同一个虚拟机都行,因为每次云函数的特性,所以每个心跳包都是一个新的请求,都会分配一个新ip)
  • 消耗云函数额度
    • 云函数隐藏C2 和 cdn很像,都有同一个弱点,就是访问是需要计费的,所以可以使用脚本把红队的额度跑掉就好,这样红队的所有马都无法上线
    • 工具 https://github.com/a1phaboy/MenoyGone
  • 虚假上线
    • 重放心跳包进行上线,但是红队无法执行任何命令
  • 截图举报
    • 收集好证据,主要是 host名 X-Api-FuncName X-Api-AppId 这些带有明显云函数的特征的证据,(X-Api-AppId这个很重要)说明该人正在使用云函数对我司进行恶意攻击,请求对其暂时封禁.