利用Cloudflare 零信任进行C2通信及防护

本文来源自平安银河实验室

作者:fl4nker27


>>>0x01 概述


什么是ZeroTrust(零信任安全)?


零信任安全是一种IT安全模型,要求对尝试访问专用网络上的资源的每个人和设备进行严格的身份验证,无论他们是位于网络边界内部还是外部。ZTNA(ZeroTrust Network Access,零信任网络访问)是与零信任架构相关的主要技术,但零信任是一种全面的网络安全方法,它结合了几种不同的原则和技术。———Cloudflare

如其所定义一样,ZeroTrust(零信任安全)是一种IT安全模型,它结合了好几种不同的安全原则和技术。比如,Tunnel提供对私有网络的访问,应用策略对客户端进行访问控制,SSO提供对资源访问的统一认证,安全网关可进行病毒查杀、流量审计,还有日志服务对所有的请求进行记录、分析等。
利用Cloudflare 零信任进行C2通信及防护

Tunnel工作原理

使用Cloudflare隧道,无需将流量发送到外网IP,而是在主机上运行一个轻量级守护程序,该守护程序只与Cloudflare边缘网络创建出站连接,该主机可访问Cloudflare边缘网络即可。

Cloudflare Tunnel与用户帐户中的DNS记录一一对应,对特定域名的请求首先到达Cloudflare的边缘网络,然后Cloudflare边缘网络通过隧道将这些请求发送到源服务器

示意图如下:
利用Cloudflare 零信任进行C2通信及防护

>>>0x02 设置隧道


前置要求:
  • 将站点添加至Cloudflare

  • 域名服务器修改为Cloudflare


注:Cloudflare提供两种方式进行隧道设置,一种命令行模式,另一种图形化方式。图形化方式设置、管理都更为方便,推荐使用图形化方式。这里对两种配置方式都进行一次记录。

一、命令行模式


1. 安装Cloudflared
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && dpkg -i cloudflared-linux-amd64.deb

2.认证

执行命令
cloudflared tunnel login

运行此命令将生成一个链接,点击该链接,打开浏览器窗口并按提示登录Cloudflare帐户。

利用Cloudflare 零信任进行C2通信及防护
登录后,选择对应的域,点击“授权”

利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护
完成后,会在在默认的Cloudflare缓存目录中生成帐户证书/root/.cloudflared/cert.pem

利用Cloudflare 零信任进行C2通信及防护
3. 创建隧道
cloudflared tunnel create <隧道名>

运行此命令将以提供的名称创建一个隧道,同时会生成一个UUID与该隧道进行关联。记下隧道的 UUID 和隧道凭据文件的路径。

e.g

利用Cloudflare 零信任进行C2通信及防护

确认隧道是否创建成功
cloudflared tunnel list
利用Cloudflare 零信任进行C2通信及防护

4. 创建配置文件

在默认Cloudflared配置文件目录中创建对应的配置文件。该配置文件将配置隧道将指定源的流量路由至你指定的主机名上。

语法:
url: http://localhost:8000tunnel: <Tunnel-UUID>credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

e.g

利用Cloudflare 零信任进行C2通信及防护
5. 流量路由

配置一个CNAME记录,将对应子域名的流量定向到隧道。

路由单个应用
cloudflared tunnel route dns <UUID or NAME> <hostname>

e.g

利用Cloudflare 零信任进行C2通信及防护
验证路由配置是否生效,Cloudflare控制面板DNS配置处,确认是否正确配置对应的CNAME记录。

利用Cloudflare 零信任进行C2通信及防护

6. 运行隧道
cloudflared tunnel run <隧道名或UUID>或cloudflared tunnel --config /path/your-config-file.yaml run
⚠️注意:如果配置文件名进行了自定义,或者路径不是在默认的.cloudflare目录中,则需使用--config选项来指定对应的配置文件路径。
e.g
利用Cloudflare 零信任进行C2通信及防护
7.检查隧道
cloudflared tunnel info <隧道名或UUID>
利用Cloudflare 零信任进行C2通信及防护

8.测试

Web访问正常

利用Cloudflare 零信任进行C2通信及防护
Web访问测试正常,但CobaltStrike上线测试报错。原因是因为请求中的域名localhost与listener证书中的域名不匹配导致。

利用Cloudflare 零信任进行C2通信及防护
查看文档之后,发现cloudflared使用名为Ingress的规则进行配置。

修改其配置,设置配置项noTLSVerify=true,不进行SSL证书验证。

⚠️注意:Ingress是通过hostname与Path进行匹配的,匹配到即进行对应设置的路由转发。且需强制配置一个Catch-All条件,即访问请求不匹配任何Ingress规则时,所执行的转发动作,如这里的http_status:404,否则会报错。

e.g

利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护

二、图形化方式配置


登录Cloudflare,进入ZeroTrust主页

利用Cloudflare 零信任进行C2通信及防护
首次使用,会要求配置团队名

利用Cloudflare 零信任进行C2通信及防护
选择免费计划、付款方式,然后支付


利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护
进入Zero Trust主页面板后,访问菜单【Access】-> 【Tunnels】即可对所有隧道进行管理。
利用Cloudflare 零信任进行C2通信及防护
创建新的隧道
利用Cloudflare 零信任进行C2通信及防护
按安装指令进行安装
利用Cloudflare 零信任进行C2通信及防护
完成之后,进行相应的路由配置。可以配置只转发单个服务,也可以配置转发整个网络。
利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护
⚠️注意:通过Cloudflared控制面板对命令行方式创建的隧道进行管理,需要先对其进行配置迁移。Cloudflare提供了自动化迁移步骤,几乎一键迁移。
e.g
利用Cloudflare 零信任进行C2通信及防护
至此,我们即可将内网端口通过Cloudflare的隧道转发出来了。

e.g

CobaltStrike新建了一个Listener,监听8743端口,但是未开启防火墙,所以正常情况是无法访问的。但是,通过Cloudflare隧道转发出来的域名却可以访问。

e.g

利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护

现在内网的端口是转发出来了,但是还存在一个问题。比如这里如果域名被扫描器扫到了,那么我们的CS服务器就会被暴露,可能会被标记,这是我们不可接受的。这里就需要利用到Cloudflare ZeroTrust的另一功能。


>>>0x03 ZeroTrust授权配置


正如Cloudfalre对其ZeroTrust的描述一样零信任安全是一种 IT 安全模型,要求尝试访问专用网络上的资源的每个人和设备进行严格的身份验证,无论他们是位于网络边界内还是外部。Cloudflare ZeroTrust可以给服务添加强制认证。

1. 生成Service Token


隧道配置完成之后,第一步先生成Service Token。Cloudfalre ZeroTrust控制面板处,访问【Access】-【Service Auth】,创建Service Token

利用Cloudflare 零信任进行C2通信及防护

2. 配置应用


然后,Cloudfalre ZeroTrust控制面板,访问【Access】-【Application】,选择添加应用Add an application,选择Self-hosted


利用Cloudflare 零信任进行C2通信及防护
配置应用名、超时时间、子域名信息后,选择下一步。
利用Cloudflare 零信任进行C2通信及防护
接下来,需要配置策略。策略用于访问控制和认证等配置,控制谁可以访问该应用。
利用Cloudflare 零信任进行C2通信及防护
策略使用规则进行定义,规则用于配置基于哪种条件进行访问控制。比如,IP地址、IP地理位置、用户邮箱、客户端证书、Service Token等。这里我们使用Service Token,选择上一步生成的Service Token,继续下一步。
利用Cloudflare 零信任进行C2通信及防护
接下来是一些额外的配置,包括跨域、cookie属性等,按需设置,完成。这里保持默认。

3. 测试


完成之后,再次访问转发出来的域名,则需要进行访问控制校验。


利用Cloudflare 零信任进行C2通信及防护


Service Token后,再次访问,可以访问资源但是还需要进行二次认证。


利用Cloudflare 零信任进行C2通信及防护
这里使用OTP认证,使用邮箱接收OTP密码后,即可正常访问资源。
利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护
对于一般Web应用来说,我们的需求已经实现了。但是,对于CobaltStrike上线来说,该机制过于"安全"了,因为对于Beacon来说,是无法通过邮箱接收OTP密码或者进行二次认证的。
查阅文档后,Cloudflare ZeroTrust提供不使用第三方认证服务的选项,即只使用客户端证书、Service Token进行认证。
重新编辑应用策略,【Action】选项处选择Service Auth即可。
利用Cloudflare 零信任进行C2通信及防护
利用Cloudflare 零信任进行C2通信及防护
再次测试使用Service Token即可访问对应资源了。

4. CobaltStrike上线


修改CobaltStrike profile,在所有的Client HTTP请求(http-gethttp-posthttp-stager)配置块中加入对应的Service Token请求头。


e.g
利用Cloudflare 零信任进行C2通信及防护

成功上线。


利用Cloudflare 零信任进行C2通信及防护


>>>0x04 总结


本文介绍了Cloudflare ZeroTrust功能。Cloudfalre Tunnel可将内网服务,或公网服务但不开放防火墙的情况下开放至公网,同时利用Zero Trust功能对其进行访问控制及认证,可极大程度地保证对私有服务访问的安全性。


另外,还详细记录了利用ZeroTrust进行CobaltStrike上线,并为其Listener添加“认证机制”的配置过程。


最后,目前只对Cloudflare tunnel功能针对HTTP协议进行了研究实验,其他协议如SOCKS,甚至于对私有网络的转发还需进一步研究。


>>>0x05 参考


https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/local/local-management/ingress/#notlsverify

https://0xsp.com/offensive/red-ops-techniques/abuse-cloudflare-zerotrust-for-c2-channels/



银河实验室

利用Cloudflare 零信任进行C2通信及防护

银河实验室(GalaxyLab)是平安集团信息安全部下一个相对独立的安全实验室,主要从事安全技术研究和安全测试工作。团队内现在覆盖逆向、物联网、Web、Android、iOS、云平台区块链安全等多个安全方向。
官网:http://galaxylab.pingan.com.cn/



往期回顾


技术

使用GitHub Actions进行红队自动化构建

技术

Executor内存马实现的优化

技术

CVE-2022-38362:Apache Airflow Docker Provider RCE分析

技术

Spring Security RegexRequestMatcher 认证绕过及转发流程





点赞、分享,感谢你的阅读▼ 


▼ 点击阅读原文,进入官网

原文始发于微信公众号(平安集团安全应急响应中心):利用Cloudflare 零信任进行C2通信及防护

版权声明:admin 发表于 2022年11月11日 下午6:00。
转载请注明:利用Cloudflare 零信任进行C2通信及防护 | CTF导航

相关文章

暂无评论

暂无评论...