
Repositório para busca de exposição do PHP2Shell e análises relacionadas
Caça de exposição no Defender XDR para PHP2Shell (CVE-2026-109618 / CVE-2026-109619).
v3.3 · 22 de out. de 2026
Objetivo: Encontrar dispositivos integrados que estejam executando PHP ativamente e que possam estar expostos ao PHP2Shell.
Escopo: Defender XDR Advanced Hunting · endpoints Windows e Linux integrados · janela de análise de 30 dias por padrão · apenas PHP ativo. Não coberto: instalações inativas e dispositivos não gerenciados. Não executável no Sentinel, pois a tabela de software instalado (TVM) só pode ser consultada no Defender XDR.
| Hunt | Windows | Linux | Pergunta |
|---|---|---|---|
| 1 | windows/01-any-php.kql | linux/01-any-php.kql | Algum PHP? Sim/não por dispositivo. |
| 2 | windows/02-evidence-breakout.kql | linux/02-evidence-breakout.kql | Detalhamento de evidências com versões. |
| 3 | windows/03-safety-net.kql | linux/03-safety-net.kql | Rede de segurança: dispositivos servindo em portas web, o processo em escuta e o status do PHP. |
Todas as verificações de eventos usam uma única janela de análise, let Lookback = 30d; no topo de cada hunt. Os endereços IP vêm do relatório mais recente por adaptador nos últimos 7 dias. O software instalado é o snapshot atual do TVM. Apenas endpoints integrados são verificados (OnboardingStatus == "Onboarded", DeviceCategory == "Endpoint").
Um dispositivo conta como PHP visto se qualquer uma destas condições corresponder.
Como os nomes são correspondidos:
^…$), portanto deve corresponder ao nome de arquivo inteiro, nunca a parte dele.startswith "php", além de frankenphp em ambos os SOs e lsphp no Linux. A regex então é executada apenas sobre o que resta.php9.dll) correspondem automaticamente.patterns.test.js executa cada regex contra esses exemplos. Se você alterar uma regex, atualize os exemplos lá.Windows
| Verificação | Tabela | Correspondências | Por que importa |
|---|---|---|---|
| Executáveis PHP iniciados | DeviceProcessEvents | Regex ^(php(-cgi|-win)?|frankenphp)\.exe$, que permite exatamente quatro nomes: php.exe (CLI), php-cgi.exe (worker FastCGI), php-win.exe (CLI, sem console), frankenphp.exe (PHP embutido em um servidor web). phpstorm64.exe e outras ferramentas php* não correspondem | Comprova que o PHP foi executado. O hunt 2 mostra a versão a partir das informações de versão do binário (ProcessVersionInfoProductVersion) |
| DLLs do motor PHP carregadas | DeviceImageLoadEvents | Regex ^php\d*(ts|isapi|apache[\w_]*)?\.dll$: php, qualquer número de versão, um sufixo opcional ts / isapi / apache…, e então .dll. Exemplos estão na tabela de DLLs abaixo. DLLs de extensão (php_curl.dll e outras php_*.dll) não correspondem, pois o sublinhado não é permitido logo após php | A única forma de ver o PHP em execução dentro de outro processo, como IIS ou Apache, onde nenhum php*.exe é iniciado. O hunt 2 mostra a DLL e o processo que a carregou |
| Software instalado | DeviceTvmSoftwareInventory | Não é regex: SoftwareName has "php" (php como palavra inteira no nome) ou SoftwareVendor =~ "php" (exato, sem diferenciar maiúsculas de minúsculas) | Captura instalações registradas. Instalações via zip (o método usual no Windows) normalmente não se registram |
Exemplos de DLLs do motor PHP que o padrão do Windows corresponde
| DLL | O que é | Processo host típico (mostrado na hunt 2) |
|---|---|---|
php8.dll, php7.dll | Engine, build não thread-safe | php-cgi.exe (FastCGI sob IIS, nginx ou Apache mod_fcgid), php.exe |
php8ts.dll, php7ts.dll, php5ts.dll | Engine, build thread-safe | httpd.exe (módulo Apache), php.exe |
php8apache2_4.dll, php7apache2_4.dll, php5apache2_2.dll | Carregador do módulo Apache | httpd.exe |
php5isapi.dll | Módulo ISAPI legado do IIS (PHP 5.2 e anteriores, sem suporte) | w3wp.exe |
A tabela lista nomes comuns, não uma allow-list: qualquer nome que corresponda ao padrão é correspondido. O nome da DLL fornece apenas a versão principal. A versão exata vem de uma linha de processo php-cgi.exe ou php.exe, ou de software instalado, no mesmo dispositivo.
Linux
| Verificação | Tabela | Correspondências | Por que importa |
|---|---|---|---|
| Binários PHP iniciados | DeviceProcessEvents | Regex ^(php[\d.]*|php-(fpm|cgi)[\d.]*|lsphp[\d.]*|frankenphp)$: php, php-fpm, php-cgi ou lsphp (LiteSpeed), cada um com uma versão opcional composta por dígitos e pontos, além de frankenphp. Exemplos: php, php8.3, php83, php-fpm8.3, php-cgi8.2, lsphp83. Ferramentas como phpunit, phpize e php-config não correspondem, pois apenas dígitos e pontos podem seguir o nome base | Comprova que o PHP foi executado. A hunt 2 mostra uma dica de major.minor, extraída do nome, caminho ou linha de comando por uma segunda regex, php-?(?:fpm|cgi)?/?(\d+\.\d+) (por exemplo, php-fpm8.3 ou /etc/php/8.3/ resulta em 8.3.x) |
| Pacotes instalados | DeviceTvmSoftwareInventory | Não é uma regex: SoftwareName contains "php" (substring, então nomes versionados como php8.3-fpm e libapache2-mod-php8.3 correspondem) ou SoftwareVendor =~ "php" | A única verificação para Apache mod_php e para php-fpm em execução desde antes da janela: o Linux não tem verificação de carregamento de biblioteca aqui, e workers php-fpm bifurcados não criam inícios de processo |
| Verificação | Tabela | Correspondências | Por que importa |
|---|---|---|---|
| Serviço web ativo | DeviceNetworkEvents | InboundConnectionAccepted em uma lista fixa de portas: 80, 443, 8080, 8443. Loopback é excluído (RemoteIPType != "Loopback"). Mostra fontes distintas e públicas, além do processo que aceita (via <process>) | Comprova que um dispositivo está servindo, mesmo que seu servidor web tenha iniciado antes da janela de lookback. ntoskrnl.exe = HTTP.sys (IIS, ADFS, RD Gateway, Windows Admin Center, SSTP) |
| Servidor web iniciado | DeviceProcessEvents | Não é uma regex: uma lista fixa de nomes exatos, sem distinção de maiúsculas/minúsculas (in~). Windows: w3wp.exe, httpd.exe, nginx.exe, caddy.exe, lighttpd.exe, frankenphp.exe. Linux: httpd, apache2, nginx, lshttpd, litespeed, openlitespeed, caddy, lighttpd, frankenphp | Um servidor web que iniciou na janela e não carregou PHP resulta em "Not seen" com alta confiança. O Windows também mostra nomes de pools de aplicativos do IIS, extraídos da linha de comando do w3wp.exe pela regex -ap\s+"?([^"\s]+) |
Valores da coluna PHP na hunt 3