【入门篇】几种简单的方法隐藏CobaltStrikeC2server

1. 简介

我们在使用 cobalt strike 进行渗透时,靶机上的木马需要与team server进行数据交互,这无疑会暴露我们的服务器地址,容易导致team server与被控端的通讯被识别和阻断。本文将会介绍几种基本的技巧和方式来隐藏team server,并且对比其中的优缺点。

2. Cobalt Strike Listener种类

Beacon DNS:将交互信息隐藏在DNS请求中,这些请求看起来像请求指定域名的权威应答,他的响应信息即为team server下发的指令

Beacon HTTP and HTTPS:通过HTTP GET请求接受指令,通过HTTP POST返回数据到team server

Beacon SMB:使用named pipe与parent beacon通信,这种对等通信与同一主机上的beacon一起使用。它也可以通过网络使用。Windows将named pipe通信封装在SMB协议中。

Beacon TCP:使用TCP套接字与team server通信

External C2:使用外部C2

Foreign HTTP and HTTPS:外部监听器,常用于和msf进行联动。

Notice:本文演示所用的listener类型为Beacon HTTP and HTTPS

3. 环境准备

PC 1: team server

OS: ubuntu 18.04

IP: 192.168.1.122

运行Cobalt Strike team server

PC 2: 靶机

OS: Windows 7

IP: 192.168.5.132

PC 3: 转发机

OS: ubuntu 18.04

IP: 192.168.5.133

4. 未设置转发的抓包测试

可以看到靶机(192.168.5.132)与team server(192.168.1.122)的通信可以被检测到,暴露了team server的IP

5. 使用端口转发隐藏IP

5.1. iptables

使用Linux防火墙iptables,我们可以将特定端口上的任何传入流量转发到给定端口上的远程主机IP。将<REMOTE-ADDRESS>替换为后端服务器的IP地址,并以root权限运行以下命令:

iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPTiptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <REMOTE-ADDRESS>:80iptables -t nat -A POSTROUTING -j MASQUERADEiptables -I FORWARD -j ACCEPTiptables -P FORWARD ACCEPTsysctl net.ipv4.ip_forward=1

将80端口换成443端口,就可以用来转发https流量

在转发机192.168.5.133中开启转发

生成listener时,在http hosts 和 http host处均填入转发机的ip

上线成功,使用wireshark抓包可以看到,靶机(192.168.5.132)只和转发机(192.168.5.133)通讯,team server(192.168.1.122)也只和转发机(192.168.5.133)通讯,隐藏了team server的IP

因为VMware共享同一网卡,所以在一个虚拟机中用wireshark就可以抓到所有包

5.2. socat

与上面一样,将<REMOTE-ADDRESS>替换为team server的IP即可转发,替换端口也可以转发443端口的数据

socat TCP4-LISTEN:443,fork TCP4:<REMOTE-ADDRESS>:80

小结

端口转发也适用于使用 TCP beacon 的木马

使用1024以下端口一般需要root权限,普通用户权限可以使用1024以上的端口号

6. web中间件反向代理

apache、nginx等主流web中间件均可用于反向代理,我们可以通过配置反向代理来转发 http/https beacon 这类使用http协议交互数据的木马流量。

另外需要注意的是,由于web中间件不同版本之间的配置文件格式略有不同,本文所提供的相关配置仅在本文所声明的版本中测试通过,在其他版本或其他平台可能无法运行。

6.1. Apache2

Version: Apache/2.4.29 (Ubuntu)

安装并启用相关模块

apt-get install apache2a2enmod proxy proxy_ajp proxy_balancer proxy_connect proxy_httpsystemctl restart apache2

修改配置文件/etc/apache2/sites-enabled/000-default.conf,在virtualhost标签中添加

ProxyPass "/"";REMOTE-ADDRESS>/"ProxyPassReverse "/"";REMOTE-ADDRESS>/"

注意url最后的斜杠不可省略,以下是完整配置文件

<VirtualHost *:80>      ServerAdmin webmaster@localhost      DocumentRoot /var/www/html      ErrorLog ${APACHE_LOG_DIR}/error.log      CustomLog ${APACHE_LOG_DIR}/access.log combined      ProxyPass "/"""      ProxyPassReverse "/"""</VirtualHost>

重启apache2使配置生效

service apache2 restart

然后和前面一样,创建listener时将地址填写为转发机地址

成功上线,效果同上

6.2. Nginx

Version: nginx/1.14.0 (Ubuntu)

nginx转发原理和操作与上文所述相同,在此只提供安装和配置文件

安装nginx

apt-get install nginx

修改/etc/nginx/sites-enabled/default 文件中的 location / 为如下内容

location / {              # 此处url后面没有斜杠              proxy_pass ;# 一定要注释下面这行              # try_files $uri $uri/ =404;      }

重启nginx是配置生效

service nginx reload

6.3. 使用CDN转发并使用https加密流量

CDN的本质可以看做 反向代理+动态DNS 这样的架构,那么同样CDN也可以转发流量。https可以加密传输,防止被流量监控设备识别

在这一节我们使用了一台搭建在公网的Cobalt Strike服务器

6.3.1. 开启cloudflare CDN

以cloudflare为例,将域名解析到team server并开启cloudflare CDN服务

此外还要注意修改cloudflare 的SSL/TLS策略为Full/Full(strict)

6.3.2. 使用Lets Encrypt签发https证书

如果你已经有了证书或者使用Cobalt Strike默认的自签名证书,可以跳过这一步

安装certbot

sudo apt-get install certbot

签发证书

certbot certonly --standalone -d your-domain.com -d cs1.your-domain.com

打包生成Java Keystore

# 切换到证书生成目录cd /etc/letsencrypt/live/your-domain.com# 打包证书openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out your-domain.com.p12 -name your-domain.com -passout pass:# 生成Java keystonekeytool -importkeystore -deststorepass-destkeypass-destkeystore cs1.your-domain.com.store -srckeystore cs1.your-domain.com.p12 -srcstoretype PKCS12 -srcstorepass-alias cs1.your-domain.com

部署证书并测试可用性

# 将keystore文件移动到cobalt strike目录下mv cs1.your-domain.com.store /root/cobaltstrike/httpsProfilecd /root/cobaltstrike# 下载模板文件wget--no-check-certificate -O /root/cobaltstrike/httpsProfile/https.profile# 添加证书配置cat >> /root/cobaltstrike/httpsProfile/https.profile << EOFhttps-certificate { set keystore "cs1.your-domain.com.store"; set password "";}EOF# 测试profile文件可用性./c2lint httpsProfile/https.profile

输出为

文件可用

启动cobalt strike并引入配置文件

./teamserver <ip_address> < password > < profile_path>6.3.3. 创建listener

创建listener时,选择HTTPS beacon,填入域名

成功上线,交互IP所属为cloudflare CDN,并非team server,协议为TLS,交互过程加密

小结

Apache和nginx反向代理也可用于转发HTTPS beacon 生成的木马流量,需要手动配置证书相关内容

cloudflare CDN IP 可视为高信誉IP,隐藏team server同时也避免了因为高风险IP导致被安全设备封锁

关于Cobalt Strike Malleable C2 Profile:更多信息可以参阅官方文档,以及⭕Alexander Rymdeko-Harvey在GitHub上的项目CobaltStrike-ToolKit。特别提示,本文为测试使用所以仅在模板中添加了证书相关信息,未做其他修改。在实际使用时,务必修改profile模板的相关参数,防止被嗅探攻击

7. Cobalt Strike HTTP/HTTPS proxy

创建listener时,可以选择为payload设定使用http代理,填入相关信息即可使用

8. 方案对比

方式优点缺点端口转发隐藏IP不能解决信誉IP和信誉域名问题反向代理隐藏IP不能解决信誉IP和信誉域名问题http/https proxy隐藏IP不能解决信誉IP和信誉域名问题CloudFlare+https隐藏IP、通信加密非信誉域名

可以看到,上述方式均可以达到隐藏IP的效果,但是在一些限制较为严格的环境中,使用一个陌生的低信誉IP和域名仍有可能导致行为被发现,流量被识别。

使用高信誉IP和域名进行加密转发可以有效避免被识别,下一篇文章我们将介绍几种方式使用高信誉IP和域名进行转发。

长按二维码关注 【宽字节安全】,获取更多好玩的安全知识