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的绝对路径。
最后用 nginx -s reload
将nginx重载一下,就完成nginx端的shell插入了。
接下来测试能否rce,首先在请求包中加入作者预定义的头 vtoken: whoami
,发送之后,服务端成功输出了当前用户。
另外,从测试也可以看出,虽然作者仅测试了1.80,但是我测试的1.61.1也是可以实现的。
实现全功能
修改代码
根据作者的README,作者说当前源码仅实现了whoami
的功能,所以需要我们自行修改一下代码实现任意命令。查看源码,会找到这样一行代码 FILE* pipe = popen("/bin/whoami", "r");
,其中的popen就是实现执行命令的函数,那么我们在这里下功夫就好了,看到这一句的所在函数,是有提供命令参数的,那么直接做好拼接就行了,这里我使用了 sprintf
函数,修改原处代码为如下。
1 | char command[256]; |
编译
编译新so文件的方法作者交代的很清楚了,需要注意的是,要将git下载下来的项目源码中的ngx_http_cre_module.c文件的 FILE* pipe = popen("/bin/whoami", "r");
替换一下成我们修改过那三行代码。
1 | wget https://nginx.org/download/nginx-1.18.0.tar.gz |
编译后的so文件位于 nginx-1.18.0/objs/ngx_http_cre_module.so。
接下来的工作就是和第一部分测试一样。