redis未授权访问批量验证脚本编写[python]

本文介绍了如何编写一个Python脚本来批量验证redis服务的未授权访问漏洞。通过截获并分析info命令,了解如何构造payload,并提供了一个简单的验证POC,最后展示了如何创建多线程进行批量验证及主程序的框架。修复此类漏洞的方法包括限制redis的绑定地址、设置密码验证和防火墙策略。
摘要由CSDN通过智能技术生成

漏洞简介

简单来说,redis是一个数据库。在默认的配置下,redis绑定在0.0.0.0:6379,也就是说,如果服务器有公网ip,可以通过访问其公网ip的6379端口来操作redis。最为致命的是,redis默认是没有密码验证的,可以免密码登录操作,攻击者可以通过操作redis进一步控制服务器。

漏洞的危害

  1. 无密码验证登录redis后,可读取、删除、更改数据
  2. 攻击者可以通过redis读写文件,植入后门
  3. 如果redis以root权限运行,攻击者可以写入ssh公钥文件,然后即可远程ssh登录服务器

漏洞修复

修复方案大概有以下几种:

  1. 把redis绑定在127.0.0.1即本地上
  2. 配置登录验证
  3. 防火墙设置白名单,拒绝不信任的连接

本文主要讲解验证脚本的编写,故不再过多阐述漏洞原理、利用等细节。

验证方式

登录redis后,执行info命令,可以获得类似下面的信息:

# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:68e47d9309ff01ae
redis_mode:standalone
...

如果登录失败,是不可以执行命令的,所以我们可以向目标ip的6379(redis默认端口)发起连接,发送info命令,只要得到的响应中存在上面信息中的某些独特的字符串,如redis_version,我们就认为目标存在redis未授权访问漏洞。

代码如下:

...
sock = socket.socket()  # 创建套接字
try:
    sock.connect((ip, 6379))  # 连接
    sock.send(payload)  # 发送info命令
    response = sock.recv(1024).decode()  # 接收响应数据
    if 'redis_version' in response:
        result = True  # 存在漏洞
    else:
        result = False  # 不存在漏洞
except (socket.error, socket.timeout)# 连接失败,可能端口6379未开放,或者被拦截,此时认为漏洞不存在
    result = False
...

好了,现在的关键就在:如何发送info命令?

python有操作redis的第三方库,可以很方便的操作redis。然而,我们并不使用这些第三方库,归根结底,发送info命令其实是发送了一个可以让redis服务识别的特定的数据而已,只要我们知道这个数据是什么,我们就可以使用info命令了。

下面我们就来分析,redis是如何发送info命令的。

截获info命令

我们需要搭建一个redis环境,使用抓包工具来截获使用info命令时redis发送的数据,为了方便,我使用了linux系统的命令netcat、tee来充当抓包工具,读者可以自己在linux系统下搭建redis环境尝试。

我们使用netcat连接到本地的redis服务,然后使用另一个netcat进程监听127.0.0.1:9000,将接受的连接发来的数据,重定向至连接到redis服务的netcat进程的输入,即可完成连接的转发,我们在这两个netcat经常之间,使用tee来截获数据,流程大致如下:

info命令
转发数据
转发数据
转发数据
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值