Vulnerabilidade em balanceadores mod_jk - [CVE-2018-11759]

É o apocalipse

O uso de balanceadores (ou load balancer) passou a ser bem maior pela série de benefícios que nos trás, e um dos principais benefícios dele é a segurança, tendo um balanceador em uma rede controlará todos os acessos para que sejam centralizados e distribuidos, além de que o servdor mod_jk (módulo do apache) receberá toda a requisição e processará como entende, ou seja: Mesmo que seu outro servidor interno possua falhas de segurança possibilitando um bypass ou até mesmo um arquivo e PHP sem que tenha o interpretador instalado (o mod_jk, impede de que ele seja exibido).

Já um mês atrás o especialista em segurança da informação Alphan YAVAS publicou um bug encontrado no código do mod_jk, no qual ele possibilitava ter acesso a rota/jkstatus, onde nela possui todas as informações das instâncias balanceadas, dando a possibilidade de realizar até mesmo algumas configurações relacionadas a ela!

Descoberta

O erro era no próprio código fonte do mod_jk especificamente no arquivo tomcat/jk/trunk/native/apache-2.0/mod_jk.c, esse trecho contém a instrução de bloquear com que a entrada ../ seja interpretada como instrução (pois seria possível navegar através dos diretórios), e foi justamente aí que ele encontrou a falha, essa instrução não anularia nenhuma forma de concatenação de requisição, foi realizado o teste injetando justamente essas instruções, reportado como CVE o atuante acrescentou apenas ;

Ponto-e-virgula da morte

Acontece que sinais como: &, ; e = são instruções aceitas para envio e recebimento e recebimento de dados HTTP, então tanto o browser entenderá aquilo como uma rota atuante quanto o servidor também compreenderá da mesma forma, uma forma de ver isso em um ambiente real já foi projetada pelo grupo immunIT e está disponível um docker-compose em https://github.com/immunIT/CVE-2018-11759.

O ataque em sua prática é apenas seguir o diretório inicial com /jkstatus&, veja a saída em um teste:

Requisição normal

E agora, após alterar a url apenas o ultimo caracter, temos:

Ele retorna todo o conteúdo sem ao menos pedir senha

Atingidos

Verifique se sua aplicação está vulnerável a essa exploração, usando esse projeto escrito em shellscript, para usar precisa apenas clonar o repositório e em seguida abrir o arquivo, então já poderá verificar seus ambientes. Para ser mais produtivo você pode usar todos os ambientes com um here-document no script, dessa forma:

Uso do script de verificação de vulnerabilidade da CVE 2018-11759
Dessa forma, caso você tenha todos os ambientes em uma anotação pode apenas copiar colar e ver o resultado de seus ambientes vulneraveis

O projeto está disponível em https://github.com/Jul10l1r4/Identificador-CVE-2018-11759 (o projeto principal está em notabug.org/Jul10l1r4/Identificador-CVE-2018-11759)

Caso queira de forma mais interativa é possível apenas executando o arquivo main.

A versão na qual é possível fazer essa exploração dessa forma é da 1.2.0 a 1.2.44, você está usando essa versão afetada? Uma das formas urgentes de solucionar esse problema é alterar a permissão de leitura do arquivo para que bloqueie aquele acesso, ou que ele requeira um determinado ip para que seja acessado.

Dessa forma você pode ter um alívio
the fuck server is down!
Corre lá e corrige isso antes que aconteça algo pior!