python3 Redis未授权检测脚本怎么写

1. 简介

Redis是一个开源的高性能键值对数据库,使用C语言编写。它支持多种数据结构,如字符串、哈希、列表、集合等,并提供了丰富的命令接口,可以进行数据的增删改查和相关操作。它还具备强大的缓存功能,可以提升应用性能和可靠性。

然而,Redis也存在一些安全问题,比如未授权访问,如果管理员没有设置访问密码或未正确配置防火墙等安全措施,会给攻击者留下入侵的机会。因此,本文将介绍如何使用Python3编写一款Redis未授权检测脚本。

2. 环境配置

2.1 Python3

我们首先需要安装Python3开发环境。可以通过以下命令在Linux系统中安装:

sudo apt-get update

sudo apt-get install python3

2.2 Redis-py

Redis-py是Redis官方推荐的Python客户端,我们可以通过pip安装:

pip install redis

3. 检测流程

Redis未授权访问检测通常有以下两种方式:

尝试直接连接Redis服务器,使用空密码或者默认密码进行访问。

利用Redis的信息泄漏漏洞,获取Redis配置信息,包括访问密码等。

3.1 直接连接检测

我们先尝试直接连接Redis服务器,使用空密码或者默认密码进行访问。代码如下:

import redis

def redis_unauth(ip, port):

try:

r = redis.Redis(host=ip, port=port, db=0, socket_timeout=5)

if r:

print("[OK] "+ip+":"+str(port)+" is unauthed!")

return True

else:

print("[FAIL] "+ip+":"+str(port)+" is not unauthed!")

return False

except:

return False

在该代码中,我们使用redis.Redis方法连接Redis服务器,传入服务器的ip和端口号。由于我们并没有设置密码,因此Redis服务器会允许我们进行未授权访问。当访问成功时,我们将输出[OK] ip:port is unauthed!,否则输出[FAIL] ip:port is not unauthed!。该方法的返回值为True或False,表示检测是否成功。

3.2 信息泄漏检测

在Redis服务器中,可以通过config命令获取Redis服务的所有配置信息。但是,需要注意的是config命令的返回值是一个字典形式的数据结构,其中保存了Redis服务器的配置信息。如果Redis服务器设置了访问密码,我们通过该方式无法获取密码信息,只能检测是否存在密码保护。

代码如下:

import redis

def redis_config(ip, port):

try:

conn = redis.Redis(host=ip, port=port, db=0, socket_timeout=5)

config = conn.config_get()

if 'requirepass' in config and config['requirepass']:

print("[OK] " + ip + ":" + str(port) + " is authed, password is "+ config['requirepass'])

return True

else:

print("[INFO] " + ip + ":" + str(port) + " is unauthed, password is null.")

return False

except:

return False

在该代码中,我们同样使用redis.Redis方法连接Redis服务器,并通过config_get方法获取Redis服务器的配置信息。如果Redis服务器设置了访问密码,则config字典中包含键值为requirepass的项。如果存在该项,则表示Redis服务器设置了访问密码,我们将输出[OK] ip:port is authed, password is password,并返回True。否则,我们将输出[INFO] ip:port is unauthed, password is null.,并返回False。

4. 使用方法

在检测脚本中,我们可以将上述两种检测方式进行组合,以增加检测的准确性,代码如下:

import sys

import redis

def redis_check(ip, port):

try:

r_auth = redis.Redis(host=ip, port=port, db=0, socket_timeout=5)

if r_auth.ping():

print("[OK] " + ip + ":" + str(port) + " is reachable!")

else:

print("[FAIL] " + ip + ":" + str(port) + " is not reachable!")

return False

if redis_unauth(ip, port) or redis_config(ip, port):

return True

else:

return False

except:

return False

if __name__ == '__main__':

if len(sys.argv) != 3:

print("Usage: python3 redis_unauth.py ip port")

sys.exit()

ip = sys.argv[1]

port = sys.argv[2]

redis_check(ip, int(port))

在该代码中,我们定义了redis_check函数,其中先使用redis.Redis的ping方法测试是否能够连接Redis服务器,当断开连接时,将输出[FAIL] ip:port is not reachable!,并返回False。当连接成功时,将输出[OK] ip:port is reachable!。

接着,我们组合使用直接连接检测和信息泄漏检测。当其中任意一项检测成功时,我们将返回True,否则返回False。最后,在全局中通过sys.argv获取命令行参数,即Redis服务器的ip和端口号,以进行测试。

5. 总结

Redis未授权访问是很常见的安全问题之一,攻击者可以通过此方式进入服务器,获取敏感信息,修改数据等操作。因此,我们需要采取一些措施来防范此类攻击。本文介绍了如何使用Python3编写Redis未授权检测脚本,通过该脚本,我们可以有效地检测服务器是否设置了访问密码。在使用该脚本时,需要特别注意检测对象是否为授权范围内的服务器,避免对非法服务器进行攻击。

数据库标签