利⽤Cloudflare ZeroTrust进⾏C2通信及防护

渗透技巧 2个月前 admin
189 0 0

作者:李炯

0x01 概述

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

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

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

Tunnel工作原理

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

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

 

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

0x02 设置隧道

前置要求:

  • 将站点添加至Cloudflare
  • 域名服务器修改为Cloudflare

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

一、命令行模式

1. 安装Cloudflared

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

2.认证

执行命令

  1. cloudflared tunnel login

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

登录后,选择对应的域,点击“授权”

利⽤Cloudflare ZeroTrust进⾏C2通信及防护 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

完成后,会在在默认的Cloudflare缓存目录中生成帐户证书(/root/.cloudflared/cert.pem

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

3. 创建隧道

  1. cloudflared tunnel create <隧道名>

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

确认隧道是否创建成功

cloudflared tunnel list 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

4. 创建配置文件

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

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

e.g

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

5. 流量路由

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

路由单个应用

  1. cloudflared tunnel route dns <UUID or NAME> <hostname>

e.g

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

验证路由配置是否生效,Cloudflare控制面板DNS配置处,确认是否正确配置对应的CNAME记录。

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

6.运行隧道

  1. cloudflared tunnel run <隧道名或UUID>
  2. cloudflared tunnel --config /path/your-config-file.yaml run

注意:如果配置文件名进行了自定义,或者路径不是在默认的`.cloudflare`目录中,则需使用`--config`选项来指定对应的配置文件路径

e.g

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

7. 检查隧道是否运行

  1. cloudflared tunnel info <隧道名或UUID>
利⽤Cloudflare ZeroTrust进⾏C2通信及防护

8.测试

Web访问正常

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

Web访问测试正常,但CobaltStrike上线测试报错。原因是因为请求中的域名`localhost`与listener证书中的域名不匹配导致。

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

查看文档之后,发现cloudflared使用名为[Ingress](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/local/local-management/ingress/#notlsverify)的规则进行配置。

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

e.g

利⽤Cloudflare ZeroTrust进⾏C2通信及防护 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

二、图形化方式配置

登录Cloudflare,进入ZeroTrust主页

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

首次使用,会要求配置团队名

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

选择免费计划、付款方式,然后支付

利⽤Cloudflare ZeroTrust进⾏C2通信及防护 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

进入Zero Trust主页面板后,访问菜单【Access】-> 【Tunnels】即可对所有隧道进行管理

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

创建新的隧道

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

按安装指令进行安装

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

完成之后,进行相应的路由配置。可以配置只转发单个服务,也可以配置转发整个网络

利⽤Cloudflare ZeroTrust进⾏C2通信及防护 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

注意:通过Cloudflared控制面板对命令行方式创建的隧道进行管理,需要先对其进行配置迁移。Cloudflare提供了自动化迁移步骤,几乎一键迁移。

e.g

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

至此,我们即可将内网端口通过Cloudflare的隧道转发出来了。

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

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

0x03 ZeroTrust授权配置

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

1. 生成Service Token

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

2. 配置应用

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

配置应用名、超时时间、子域名信息后,选择下一步

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

接下来,需要配置策略。策略用于访问控制和认证等配置,控制谁可以访问该应用。

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

策略使用规则进行定义,规则用于配置基于哪种条件进行访问控制。比如,IP地址、IP地理位置、用户邮箱、客户端证书、Service Token等。这里我们使用Service Token,选择上一步生成的Service Token,继续下一步。

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

接下来是一些额外的配置,包括跨域、cookie属性等,按需设置,完成。这里保持默认。

3. 测试

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

这里使用OTP认证,使用邮箱接收OTP密码后,即可正常访问资源。

利⽤Cloudflare ZeroTrust进⾏C2通信及防护 利⽤Cloudflare ZeroTrust进⾏C2通信及防护

对于一般Web应用来说,我们的需求已经实现了。但是,对于CobaltStrike上线来说,该机制过于"安全"了,因为对于Beacon来说,是无法通过邮箱接收OTP密码或者进行二次认证的。

查阅文档后,发现Cloudflare ZeroTrust提供不使用第三方认证服务的选项,即只使用客户端证书、Service Token进行认证。

重新编辑应用策略,【Action】选项处选择Service Auth即可。

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

再次测试,使用Service Token即可访问对应资源了

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

4. CobaltStrike上线

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

利⽤Cloudflare ZeroTrust进⾏C2通信及防护

成功上线

利⽤Cloudflare ZeroTrust进⾏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://0xsp.com/offensive/red-ops-techniques/abuse-cloudflare-zerotrust-for-c2-channels/

 

原文始发于Galaxy利⽤Cloudflare ZeroTrust进⾏C2通信及防护

版权声明:admin 发表于 2023年4月11日 下午4:58。
转载请注明:利⽤Cloudflare ZeroTrust进⾏C2通信及防护 | CTF导航

相关文章

暂无评论

暂无评论...