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 ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <REMOTE-ADDRESS>:80
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -I FORWARD -j ACCEPT
iptables -P FORWARD ACCEPT
sysctl 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 apache2
a2enmod proxy proxy_ajp proxy_balancer proxy_connect proxy_http
systemctl restart apache2 -
修改配置文件/etc/apache2/sites-enabled/000-default.conf,在virtualhost标签中添加
ProxyPass "/" "http://<REMOTE-ADDRESS>/"
ProxyPassReverse "/" "http://<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 "/" "http://192.168.1.122/"
ProxyPassReverse "/" "http://192.168.1.122/"
</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 http://192.168.1.122;
# 一定要注释下面这行
# 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. 使用Let's 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:123456
# 生成Java keystone
keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore cs1.your-domain.com.store -srckeystore cs1.your-domain.com.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias cs1.your-domain.com -
部署证书并测试可用性
# 将keystore文件移动到cobalt strike目录下
mv cs1.your-domain.com.store /root/cobaltstrike/httpsProfile
cd /root/cobaltstrike
# 下载模板文件
wget https://raw.githubusercontent.com/rsmudge/Malleable-C2-Profiles/master/normal/amazon.profile --no-check-certificate -O /root/cobaltstrike/httpsProfile/https.profile
# 添加证书配置
cat >> /root/cobaltstrike/httpsProfile/https.profile << EOF
https-certificate {
set keystore "cs1.your-domain.com.store";
set password "123456";
}
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和域名进行转发。
长按二维码关注 【宽字节安全】公众号,获取更多好玩的安全知识
本文始发于微信公众号(宽字节安全):【入门篇】几种简单的方法隐藏Cobalt Strike C2 server
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论