天天看點

利用Cloudflare 零信任進行C2通信及防護

作者:區塊軟體開發

什麼是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:8000
tunnel: <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. 測試

完成之後,再次通路轉發出來的域名,則需要進行通路控制校驗。

添加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-get、http-post、http-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/

from https://mp.weixin.qq.com/s?__biz=MzIzODAwMTYxNQ==&mid=2652143041&idx=1&sn=41a4831164eabffb17beda16a3d4d67a