- CTF實戰:技術、解題與進階
- ChaMd5安全團隊
- 1855字
- 2023-08-28 18:13:24
1.4.3 SSRF進階
1.無回顯SSRF
無回顯SSRF即我們無法看到通過SSRF請求的結果,這樣就極大減少了SSRF的攻擊面。下面介紹當碰到無回顯SSRF時,我們如何利用。
先看看如何判斷SSRF漏洞是否存在。我們可以先在自己的服務器上用Netcat工具監聽某個端口,然后通過SSRF去請求。如果我們的服務器收到請求了,說明存在SSRF。如果未收到,也不能判斷其不存在,還需要考慮目標機器不出網的情況,如圖1-108所示。
也可以通過DNSLOG去探測SSRF。
雖然沒有回顯,但是我們還是能夠通過一些別的信息去判斷探測的結果,比如狀態碼、響應時間或者頁面上的某一個特征。

圖1-108 Netcat接收請求
在沒有回顯的情況下攻擊內網的某些服務,如Redis,盲打內網的應用和服務。因為沒有回顯,所以很難判斷我們構造的Payload是否攻擊成功了。
2.攻擊有認證的Redis服務
前面說到SSRF可以攻擊內網無認證的Redis服務。如果碰到有認證的Redis服務,還能通過SSRF去利用嗎?答案是可以。雖然SSRF每次只能發送一個數據包,無法保持登錄狀態,但是Redis使用的是RESP(Redis序列化協議),Redis客戶端支持管道操作,可以通過單個寫入操作發送多個命令,而無須在發出下一條命令之前讀取上一條命令的服務器回復,所有的回復都可以在最后閱讀。這樣我們就可以通過SSRF發送一個數據包,完成認證和寫入文件的操作。
我們來看Redis是如何進行認證的。先設置一個密碼root@123,如圖1-109所示。

圖1-109 Redis認證
使用Wireshark抓包看一下認證過程,如圖1-110、圖1-111所示。

圖1-110 抓取Redis認證包

圖1-111 Redis認證數據包詳情
解釋一下這些指令的含義。
● *number:代表每一行命令,number代表每行命令中數組中的元素個數。
● $number:代表每個元素的長度。
● *2:*代表數組,這里*2代表本次指令的數組大小為2。
● $4:代表指令的長度,這里是4。
● auth:指令為auth。
再來看一下如何通過SSRF去利用Redis的流量,代碼如下。

● dir:指定Redis的工作路徑,之后生成的RDB和AOF文件都會存儲在這里。
● dbfilename:RDB文件名,默認為dump.rdb。
上述代碼先設置工作路徑為我們要寫入文件的路徑,然后設置dbfilename為我們要寫入的文件名,就實現了任意文件寫入。
我們抓一下流量看看,如圖1-112、圖1-113所示。

圖1-112 Redis寫文件數據包

圖1-113 Redis寫文件數據包詳情
通過SSRF方式發送Redis寫文件的數據包,就是利用Gopher協議把圖1-113中的指令發送給Redis服務。把Payload解碼后可以看到,其實就是寫文件數據包中的指令,如圖1-114所示。

圖1-114 解碼Payload
我們只需要在這些指令前面加上認證的指令,即可利用有認證的Redis服務寫入任意文件。我們來試著構造一個包含認證部分的Payload,通過SSRF寫一個ssrf_success.txt到tmp目錄下,需要構造的指令如下。


將這些指令構造為Gopher協議格式。
首先進行URL編碼,代碼如下。

將%0A替換為%0D%0A,代碼如下。

可以看到成功寫入了文件,如圖1-115所示。

圖1-115 成功用Gopher協議寫入文件
在實際應用的時候我們可能并不知道Redis的密碼,既然能夠進行認證,當然也可以去爆破Redis的密碼。
3.網鼎杯-2020-玄武組-SSRFMe
首先訪問題目,給出源碼,代碼如下。


簡單審計發現,對輸入的地址做了限制,限制協議為http、https、gopher、dict,限制了127、172、192.168、10這些內網網段,限制了跳轉。
直接通過http://0.0.0.0即可繞過,這個IP表示本機IPv4的所有地址。根據提示,訪問url=http://0.0.0.0/hint.php。得到hint.php源碼,代碼如下。

代碼中有一個file_put_contents文件寫入,但是會在文件的開頭添加<?php echo 'redispass is root';exit();來強制退出代碼執行。我們可以通過php偽協議繞過,但是這里限制了協議,所以此處繞不過去。請讀者留意redispass is root這段代碼,它表示存在Redis而且密碼為root。
我們可以利用dict協議探測一下端口,訪問url=dict://0.0.0.0:6379,發現Redis服務就在默認端口6379上。通過Redis寫文件,發現寫入不成功,題目的考點其實是Redis基于主從復制的RCE。當Redis讀寫量很大時,Redis會提供一種模式,即主從模式。主從模式指的是使用一個Redis實例作為主機,其余的作為備份機。主機和備份機的數據完全一致,主機支持數據寫入和讀取等操作,而備份機只支持與主機數據的同步和讀取。也就是說,客戶端可以將數據寫入主機,由主機自動將寫入操作同步到備份機。
主從模式很好地解決了數據備份問題,并且由于主從服務數據幾乎是一致的,因此可以將寫入數據的命令發送給主機執行,而將讀取數據的命令發送給不同的備份機執行,從而達到讀寫分離的目的。在Redis 4.x之后,我們可以通過外部拓展的方式,自己編譯一個.so文件來構造Redis命令。
在2018年的ZeroNights會議上,Pavel Toporkov提出了一種利用主從模式RCE的思路[1]:首先通過Redis的主機實例同步文件到備份機上,然后在備份機上加載構造好的惡意.so文件,從而執行任意命令。
首先構造一個master Server[2],代碼如下。


exp.so文件代碼地址為https://github.com/vulhub/redis-rogue-getshell。
通過Gopher協議發送Redis指令和目標建立主從關系,這樣我們構造的exp.so文件也會被復制過去,接著通過exp.so文件構造一個Redis命令system.exec,調用我們構造的system.exec指令就可以執行任意命令了,代碼如下。

將上述代碼轉換成Gopher協議格式,代碼如下。


通過SSRF發送Payload,即可執行任意命令。
- Node Security
- 數字身份與元宇宙信任治理
- Practical Network Scanning
- 黑客攻防技巧
- 等級保護測評理論及應用
- 黑客攻防入門秘笈
- 黑客攻防與無線安全從新手到高手(超值版)
- Kali Linux Wireless Penetration Testing Cookbook
- 零信任網絡:在不可信網絡中構建安全系統(第2版)
- 網絡空間安全實驗
- INSTANT Kali Linux
- 網絡空間安全實戰基礎
- 黑客攻防從入門到精通:黑客與反黑客工具篇(第2版)
- INSTANT Microsoft Forefront UAG Mobile Configuration Starter
- CCNA Security 210-260 Certification Guide