
Escáner no destructivo para CVE-2026-109618 / CVE-2026-109619 (RCE del núcleo de PHP). Reconocimiento de subdominios mediante crt.sh + subfinder, captura robusta de banners, detección basada en versiones.
Escáner no destructivo (con sonda opcional) para CVE-2026-109618 (RCE mediante
corrupción de OOM) y CVE-2026-109619 (RCE mediante estado global obsoleto) — errores
del núcleo de PHP corregidos en 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12.
✅ Verificado contra los avisos oficiales de php-src (2026-10-21, Crítico). Los ID de CVE y la tabla de versiones corregidas a continuación coinciden exactamente con los de upstream.
- CVE-2026-109618 — GHSA-w8hw-w9fx-j79w
- CVE-2026-109619 — GHSA-6wmf-4rv5-p3rp
| Rama | Afectadas | Corregidas |
|---|---|---|
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.5 | < 8.5.12 | 8.5.12 |
| < 8.2 | EOL — sin parche upstream | consultar backport de la distro/OSV |
| Modo | Qué hace |
|---|---|
LOCAL | php -r para obtener la versión exacta del runtime, SAPI, memory_limit, post_max_size |
REMOTE | Huella de versión mediante cabeceras X-Powered-By / Server y phpinfo() expuesto |
PRESENCE | Detección de PHP sin versión (PHPSESSID, referencias .php, redirecciones) |
BANNER | Captura robusta de banner por socket crudo — HEAD/GET/OPTIONS + sonda malformada, http/https, divulgación en páginas de error |
RECON | Enumeración de subdominios mediante crt.sh (Certificate Transparency) con fallback/merge de subfinder, luego escaneo en abanico resolviendo los hosts |
PROBE | (opcional) Solicitudes multipart grandes para observar la inestabilidad del worker — puede causar DoS |
git clone https://github.com/JoasASantos/php2shell-scanner.git
cd php2shell-scanner
# stdlib only — no pip deps.
# Optional recon fallback: ProjectDiscovery subfinder
# brew install subfinder (or: go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest)
# Local runtime check
python3 php2shell_scan.py --local
# Single remote target, look for exposed phpinfo()
python3 php2shell_scan.py https://example.com --phpinfo-paths
# Subdomain recon (crt.sh + subfinder) then scan, 10 threads, JSON out
python3 php2shell_scan.py example.com --recon --threads 10 -o out.json
# Recon only, no scanning
python3 php2shell_scan.py example.com --recon-only
# Target list + forced robust banner grab
python3 php2shell_scan.py -f targets.txt --banner
# OPT-IN load probe (authorized use only — DoS risk)
python3 php2shell_scan.py https://example.com --probe --probe-count 5
| Flag | Significado |
|---|---|
--local | Escaneo local mediante el binario php |
--recon | Expande cada dominio en subdominios (crt.sh + subfinder) y luego escanea los hosts que resuelven |
--recon-only | Solo enumera subdominios, sin escanear |
--banner | Fuerza la captura robusta de banner mediante socket crudo en cada objetivo |
--phpinfo-paths | Sondea rutas comunes de phpinfo() expuestas |
--deep-version | Técnicas adicionales de versión: easter eggs de PHP + archivos con fuga de versión (composer.json, .env, …) |
--origin-scan | Alcanza el origen PHP detrás de Cloudflare/WAF — petición directa a la IP con el encabezado Host real |
--shodan-key | Clave de API de Shodan para inteligencia del origen (o env SHODAN_API_KEY); implica --origin-scan |
--censys-id / --censys-secret | Credenciales de API de Censys (o env CENSYS_API_ID / CENSYS_API_SECRET); implican --origin-scan |
--probe | Sonda de carga multipart — riesgo de DoS, solo con autorización |
--probe-count N | Número de peticiones de sonda (por defecto 5) |
--threads N / --timeout N | Concurrencia / tiempo de espera por petición |
--insecure | No valida TLS |
-o FILE / --csv FILE | Guarda el informe en JSON / CSV |
Más allá de la comprobación de versión, cada objetivo se enriquece con señales pasivas (a partir de respuestas normales) que refinan el veredicto y reducen los falsos positivos:
fpm, mod_php) reutilizan el estado
de la petición → expuestos a CVE-2026-109619; cgi simple mucho menos.ubuntu, +deb, .el8…) — un backport puede corregirlo sin
cambiar la versión → confianza reducida, nota de "verificar el changelog".post_max_size /
max_input_vars (superficie de OOM para CVE-2026-109618), disable_functions.--deep-version)Cuando no hay versión en el banner: easter eggs de PHP (?=PHPE9568F34-... → GIF/credits
con expose_php=On) y archivos con fuga de versión (composer.json, .env, …;
PHP_VERSION en .env = exacta, una restricción "php": ">=8.2" solo acota la rama).
--origin-scan)Las CDN ocultan el origen, por lo que una lectura de encabezados solo muestra el edge. --origin-scan:
www, prefijos no proxificados (origin.*, cpanel.*, mail.*…)
y subdominios del reconocimiento;Host + SNI reales,
leyendo Server / X-Powered-By / páginas de error directamente desde el origen.Una petición directa a una IP ya expuesta. Solo objetivos autorizados.
La inteligencia con credenciales añade IPs que el DNS nunca expone, además de una versión de PHP a partir del banner indexado (inteligencia marcada — puede estar desactualizada):
--shodan-key / env SHODAN_API_KEY — hosts por hostname:<domain>.--censys-id + --censys-secret / env CENSYS_API_ID + CENSYS_API_SECRET
— hosts por certificado TLS / nombre DNS.--origin-scan.export SHODAN_API_KEY=xxx CENSYS_API_ID=xxx CENSYS_API_SECRET=xxx
python3 php2shell_scan.py hackersec.com --origin-scan
| Confianza | Significado |
|---|---|
HIGH | versión obtenida de un phpinfo() expuesto o de una página de error de PHP |
MEDIUM | versión obtenida de un banner HTTP (expose_php=On) |
LOW | solo inferencia, o detrás de un proxy, o puede aplicar un backport de la distro |
La salida consolidada agrupa los objetivos por severidad, ordena los VULNERABLE por confianza (HIGH primero) y marca los resultados LOW/MEDIUM para re-verificar antes de reportar.
Comparación de versiones por rama contra la tabla FIXED:
< fixed en una rama soportada → VULNERABLE>= fixed → PATCHED< 8.2 (EOL) → VULNERABLE_EOL (sin parche upstream; verificar backport de distro/OSV)Ejecutar solo contra activos que poseas o para los que tengas permiso explícito
de probar. El modo --probe puede interrumpir workers frágiles. Eres responsable de tu uso.
MIT