0x00 Cloudflare Tunnel
Cloudflare Tunnel是Cloudflare 提供的一项免费的加密隧道服务,可以用于内网穿透,将本地/内网中的服务安全地暴露在公共互联网上。相比较于其他内网穿透工具如 frp、ngrok 等,Cloudflare Tunnel可以获得更好的安全性和性能。无需考虑电信、移动等ISP不提供固定IP地址、不能开放端口等问题,并且解决了备案问题。
Cloudflare Tunnel在Cloudflare云与内网设备之间打通一条加密隧道,使Cloudflare的CDN可以通过这条加密隧道访问到部署在内网的服务,而外部用户也可以通过Cloudflare从互联网访问这些服务。
0x01 Cloudflare Tunnel进行C2隐藏
目前网上有一些使用Cloudflare Tunnel进行内网穿透的教程文章,可以自行搜索。不过既然Cloudflare Tunnel能把访问Cloudflare CDN的流量转发到内网服务,那是不是也可以把Cloudflare CDN域名作为上线监听,然后将上线请求转发到真正的C2服务器上?
经过测试,是可以的。而且这种方法跟直接使用Cloudflare加速域名隐藏C2不同,后者依然会暴露攻击者托管在Cloudflare的域名,只是隐藏了IP,而Cloudflare Tunnel中既不会暴露域名,也不会暴露IP,某些APT组织也使用这种方法来隐藏C2。而且目前国内能用的CDN、域前置服务越来越少,有的企业内网甚至直接封禁了对云函数的解析,在这种情况下,使用Cloudflare Tunnel隐藏C2或许是个不错的选择。
-
域名配置
首先需要有一个域名和一个公网IP(作为C2),配置域名解析到C2服务器上:
去freessl给这个域名申请SSL证书:
具体步骤可以去网上搜一下,最终申请成功的话会生成四个文件:
证书文件(kxx.com.cer): 网站或服务的公开SSL证书,包含了网站的公钥和证书的其它元数据,比如颁发者的信息、有效期等。
私钥文件 (kxx.com.key): 与公开证书相对应的私钥。用于服务器对传输的数据进行加密,只有相应的公钥能解密。
中间CA证书(ca.cer): 中间证书颁发机构(CA)的证书,用于建立一个信任链,从证书到根CA。一些SSL配置要求单独的中间CA证书。
完整链证书(fullchain.cer): 此文件包括网站证书和中间CA证书。在大多数服务器软件配置中,使用完整链证书是比较推荐的,因为它提供了从证书到根CA的完整路径,确保了兼容性。
-
CS配置
生成这些文件后,需要将其转换Java KeyStore文件供CS使用。
首先使用OpenSSL将证书和私钥转换成PKCS12(p12)格式。这是一个包含了证书和私钥的二进制格式。
openssl pkcs12 -export -out kkk.com.p12 -inkey kkk.com.key -in fullchain.cer
然后将PKCS12文件导入到Java KeyStore:
keytool -importkeystore -deststorepass [your-keystore-password] -destkeypass [your-key-password] -destkeystore [newname].store -srckeystore kkk.p12 -srcstoretype PKCS12 -srcstorepass [your-p12-password] -alias [your-alias]
keytool -importkeystore -deststorepass k123456 -destkeypass k123456 -destkeystore kkk.com.store -srckeystore kkk.com.p12 -srcstoretype PKCS12 -srcstorepass k123456 -alias kkk.com
https-certificate {
set keystore "kkk.com.store";
set password "k123456";
}
然后加载Profiles文件启动CS teamserver。
-
安装cloudflared tunel
去官方下载对应架构的安装包:
https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
然后安装:
dpkg-i cloudflared-linux-amd64.deb
安装完成后,执行如下指令,--url后面跟https://域名(kkk.com)
cloudflared tunnel --url https://kkk.com
执行成功后,会生成一个随机的trycloudflare子域名,这意味着所有对xxx.trycloudflare.com的访问流量都将被转发到https://kkk.com,而kkk.com就会解析到我们的C2服务器。
然后进行CS监听器的配置,将监听地址设置为上面cloudflared tunel生成的域名,端口填443:
生成一个exe执行,成功上线:
exe外联IP和安全日志中的DNS解析情况如下,可以看到域名和IP都是cloudflared的,并未暴露攻击者的kkk.com和193.xx.xx.xx的IP:
有几个地方需要注意:
-
默认C2的上线端口应该就只能是443,因为cloudflared tunel默认生成的地址就是443:https://caring-syndication-pants-outreach.trycloudflare.com,而这个是需要配在CS监听器里的。 -
不能直接在C2服务器上cloudflared tunnel --url https://localhost:443,需要通过一个域名。 -
用localhost会在有机器尝试上线时报证书不匹配的错误而且无法上线:tls: failed to verify certificate: x509: certificate is valid for kxxx.com, not localhost。
这个错误表明肉鸡尝试通过加密的HTTPS协议访问C2服务时,服务器呈现的SSL/TLS证书无法被验证。SSL证书是为特定域名颁发的,我们在CS里用的证书是为 kxx.com 颁发的,而不是 localhost。因此当cloudflared尝试通过云隧道连接到 localhost 时,由于证书与请求的域名不匹配,无法接受该证书。
所以说这里我们要有一个可以自己控制的域名,而且不能是那种用baidu.com随便生成的自签名证书,因为--url指定的域名必须与CS证书里的一致,访问xxx.trycloudflare.com的流量最终都会被转发至--url指定的域名,转发到baidu又解析不到我们的C2服务器上,没法控制。
cloudflaredtunnel还有很多其他用法和更为复杂的配置,可以自行研究。如果上面有哪里理解的不对的,欢迎指正~
注:本文内容仅用于研究学习,不可用于网络攻击等非法行为,否则造成的后果均与本文作者和本公众号无关,维护网络安全人人有责~
原文始发于微信公众号(红蓝攻防研究实验室):Cloudflare Tunnel+Cobalt Strike隐藏C2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论