前言
本文将介绍CobaltStrike配置CDN域前置,并搭建Nginx前置代理来隐藏自身。
CDN域前置介绍
CDN域前置,也就是Domain fronting,简单点讲,就是伪造HOST,让CDN根据HOST转发到你真正的C2上面去,从流量上看,目的都是CDN的IP,这样做到了隐藏C2的目的:
配置CDN域前置
因为X云未校验域名归属人,可导致在X云控制台任意添加CDN域名:
然后配置CDN回溯地址:
嘴周使用如下命令测试是否配置成功,这样就会给你转发到你的回溯地址:
curl https://www.cdn.com/ -H "Host: host.com" -vv -k
其中www.cdn.com为任意配置了X云CDN的域名、IP即可。
CobaltStrike识别绕过
配置CobaltStrike证书+修改默认端口
首先为防止默认SSL证书被ips等设置流量监测到,首先得生成SSL证书并加载:
命令来源:
https://www.codenong.com/cs105286327/
openssl req -newkey rsa:2048 -nodes -out hongshu.csr -keyout hongshu_com.key
openssl x509 -req -days 365 -in hongshu.csr -signkey hongshu_com.key -out hongshu_com.crt
openssl pkcs12 -export -in hongshu_com.crt -inkey hongshu_com.key -out hongshu_com.p12
keytool -importkeystore -v -srckeystore hongshu_com.p12 -srcstoretype pkcs12 -destkeystore hongshu_com.jks -deststoretype jks
上述生成完证书以后,修改teamserver文件加载新的证书和证书密码:
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=3306 -Dcobaltstrike.server_bindto=0.0.0.0 -Djavax.net.ssl.keyStore=./your.jks -Djavax.net.ssl.keyStorePassword=yourpassword -server -XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar:. -Duser.language=en server.TeamServer $*
当然,上述命令把CobaltStrike的默认监听端口也改成了3306。
stager url绕过
CobaltStrike stager有个固定特征,其url是根据checksum8算法生成的,而CobaltStrike默认开启监听后会启用stager url,因此如果不做相应的配置,会导致CobaltStrike的stager url被外部扫描到,比如我CobaltStrike开启如下监听:
CobaltStrike默认会一起开启stager:
根据算法扫描到stager url,获取stage文件,即可获取CobaltStrike配置信息:
因此使用Nginx前置代理来规避此类风险。
搭建Nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name yourdomain.com;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location ~ ^(/jquery-3.3.1.slim.min.js.*)$ {
if ($http_user_agent != "Mozilla/5.0") {
return 302 http://domain.com;
}
proxy_pass http://127.0.0.1:180;
expires off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
上面的Nginx配置作用是监听80、443端口;然后只有符合jquery开头的url才会转发到180和1443端口,180和1443也就是CobaltStrike listen上面配置的的bind端口。
也配置了获取X-Forwarded-For ,目的是把真实上线IP传给CobaltStrike,不然的话,CobaltStrike看到的上线IP也是Nginx服务器,因为是Nginx服务器把符合路由的流量转了过来。
接下来需要配置profile文件,注意几点:
1.把证书和密码加进去,让上线走的是自定义的修改过的ssl证书
2.配置上线的url,即和nginx里面配置的路由一致
3.设置trust_x_forwarded_for,解析x_forwarded_for的值来获取传过来的真实受害者IP。
4.profile文件里不要写死host字段,因为他会替换掉listen里面的host信息,比如笔者走的是cdn域前置,80和443走的是不同的host,如果profile写死了host信息,那所有的流量都会带上这个host头,如果写死www.baidu.com,就会导致笔者非www.baidu.com的cdn域前置就会失效。host写死也行,比如写成www.baidu.com, 这样上线看起来就是看起来是往www.baidu.com请求数据,文章参考地址:Payload多种隐藏方法
5.后来测试发现,域前置的时候,"https host(stager)"里写cdn域名的话,stager、生成的shellcode不会上线成功,因为他直接往cdn请求了,而如果写真实ip的话,会上线成功,那就会暴露真实IP,因此在"https host(stager)"里写接入了cdn的域名,还要在profile里设置http-stager的host为注册的白cdn的域名即可。这个时候就要使用profile中的header "Host"了。
最后得使用iptables,设置180和1443,即CobaltStrike的bind port只允许本地访问,反正这两个端口是从nginx的80和443转发过来的,外面人也确实不需要访问:
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 180 -j ACCEPT
iptables -A INPUT -p tcp --dport 180 -j DROP
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 1443 -j ACCEPT
iptables -A INPUT -p tcp --dport 1443 -j DROP
上面的搞定后,就不会存在cs被人恶意扫导致每次连接服务端都会同步很长时间,因为比如你的CobaltStrike监听了80端口,外面一堆扫描器在天天全网扫,扫描日志太多了,就会导致CobaltStrike的同步也得很长时间,也解决了Stager被扫问题。
拒绝某些IP
为了防止各种扫描和沙箱拉CobaltStrike数据,可以把一些厂商的沙盒IP给ban掉,在Nginx中配置如下信息即可:
#拒绝访问IP
deny 192.168.66.88;
总结
本文介绍了CobaltStrike使用CDN域前置的技术和针对CobaltStrike被扫描和被发现的一些保护措施。