Detección y Caza de Amenazas PHP2Shell: Firmas Suricata, Reglas en Tiempo de Ejecución Falco y Guía Auditd
Detección y Caza de Amenazas PHP2Shell: Firmas Suricata, Reglas en Tiempo de Ejecución Falco y Guía Auditd
<time datetime="2026-10-23">Verificado: 23 de octubre de 2026</time> · Estándar de Operaciones Defensivas: Suricata 7.x, Falco 0.38+, Linux Auditd
La neutralización eficaz de una amenaza con capacidad de ejecución remota de código no autenticada como PHP2Shell (CVE-2026-109618 y CVE-2026-109619) requiere abandonar la ilusión de una única barrera infranqueable. En su lugar, los equipos de seguridad deben establecer un modelo de Defensa en Profundidad (Defense-in-Depth) que combine inspección de paquetes en el perímetro, supervisión de comportamiento de procesos en el host y registro forense inmutable a nivel de kernel.
En este manual técnico compilamos un conjunto exhaustivo de reglas y configuraciones verificadas, diseñadas para ser incorporadas de inmediato en sistemas de monitorización corporativos (SOC/SIEM/MDR).
1. Detección Perimetral de Red: Firmas Suricata 7.x
Suricata ofrece un motor de inspección profunda de paquetes con soporte nativo para el reensamblado de flujos HTTP y el análisis sintáctico de formularios multipart.
Archivo de Reglas Suricata (/etc/suricata/rules/php2shell.rules):
# Regla 1: Detección del vector de explotación principal de Use-After-Free (SID: 10261092)
alert http any any -> $HTTP_SERVERS any ( \
msg:"INCIBE-IDS PHP2Shell Unauthenticated Multipart Session Exploit Attempt (CVE-2026-109619)"; \
flow:established,to_server; \
content:"POST"; http_method; \
content:"multipart/form-data"; http_header; nocase; \
content:"PHP_SESSION_UPLOAD_PROGRESS"; http_client_body; nocase; \
pcre:"/name=[\"']?PHP_SESSION_UPLOAD_PROGRESS[\"']?[^\r\n]*\r?\n\r?\n[^\r\n]{1,64}/i"; \
reference:cve,2026-109619; \
reference:url,https://php2shell.run/; \
classtype:web-application-attack; \
sid:10261092; rev:1; \
)
# Regla 2: Detección de ráfagas anómalas de manipulación de heap (Heap Spraying)
alert http any any -> $HTTP_SERVERS any ( \
msg:"INCIBE-IDS PHP2Shell High-Frequency Progress Parameter Burst Detected"; \
flow:established,to_server; \
content:"POST"; http_method; \
content:"PHP_SESSION_UPLOAD_PROGRESS"; http_client_body; nocase; \
threshold:type both, track by_src, count 25, seconds 10; \
classtype:attempted-recon; \
sid:10261093; rev:1; \
)
Para validar y activar las reglas sin interrumpir la captura de tráfico:
sudo suricata -T -c /etc/suricata/suricata.yaml
sudo suricatasc -c reload-rules
2. Monitorización en Tiempo de Ejecución del Host: Falco
Cuando el atacante utiliza conexiones TLS cifradas donde el IDS perimetral no tiene visibilidad, o cuando el paquete ha sido fragmentado para evadir firmas de red, el punto de detección determinante se traslada al host de cómputo.
La herramienta de código abierto Falco intercepta las llamadas al sistema operativo en tiempo real mediante un controlador de kernel o eBPF.
Regla Falco (/etc/falco/rules.d/php2shell_execution.yaml):
- rule: Spawn Ilegal de Shell desde Proceso PHP-FPM (Explotación PHP2Shell)
desc: Detecta la invocación no autorizada de intérpretes de comandos por parte de trabajadores de PHP
condition: >
spawned_process and
proc.pname in (php-fpm, php-fpm8.2, php-fpm8.3, php-fpm8.4, php-fpm8.5, apache2, httpd) and
(proc.name in (sh, bash, dash, zsh, csh, tcsh, python, python3, perl, nc, netcat, ncat, curl, wget) or
proc.cmdline contains "bash -i" or
proc.cmdline contains "/dev/tcp/" or
proc.cmdline contains "base64 -d")
output: >
ALERTA CRÍTICA: Intento de RCE detectado en PHP! Un proceso web ha generado una shell interactiva
(usuario=%user.name comando=%proc.cmdline padre=%proc.pname pid=%proc.pid descriptor=%fd.name)
priority: CRITICAL
tags: [mitre_execution, cve_2026_109619, php2shell]
Reinicio y seguimiento de registros en vivo:
sudo systemctl restart falco
sudo journalctl -u falco -f | grep -i "PHP2Shell"
3. Registro Forense Inmutable: Auditoría Linux con Auditd
Para investigaciones posteriores a un incidente (Post-Mortem Forensics), es mandatorio contar con un rastro no repudiable de todas las invocaciones a la llamada al sistema execve realizadas bajo las cuentas de usuario del servidor web (www-data, nginx o apache).
Configuración de Reglas Auditd (/etc/audit/rules.d/php2shell-audit.rules):
## Monitorizar todas las ejecuciones de binarios por usuarios web (UID 33: www-data)
-a always,exit -F arch=b64 -S execve -F euid=33 -k php_compromise_exec
-a always,exit -F arch=b32 -S execve -F euid=33 -k php_compromise_exec
## Alertar sobre creación de binarios o scripts en directorios temporales de memoria
-w /dev/shm -p wa -k php_shm_write
-w /tmp -p wa -k php_tmp_write
Cargue las reglas y verifique su operatividad:
sudo augenrules --load
sudo auditctl -l | grep "php_compromise"
Para consultar eventos de ejecución sospechosos capturados en las últimas 24 horas:
sudo ausearch -k php_compromise_exec --start today -m EXECVE
4. Runbook de Respuesta a Incidentes para Analistas del SOC
Si se dispara una alerta de Suricata o Falco confirmando la ejecución de una shell desde un proceso de PHP-FPM, ejecute de forma inmediata el siguiente protocolo de contención:
- Aislamiento Inmediato del Proceso Comprometido:
Termine inmediatamente la piscina de procesos trabajadores afectados para cortar cualquier túnel o sesión de reverse shell activa:
sudo systemctl kill -s SIGKILL php8.3-fpm - Contención de Red por Proceso (Egress Blocking):
Bloquee el tráfico saliente para el usuario del servidor web a nivel de cortafuegos local para impedir la descarga de etapas secundarias de malware o mineros de criptomonedas:
sudo iptables -I OUTPUT 1 -m owner --uid-owner www-data -j DROP - Inspección de Persistencia en Cron y Directorios Temporales:
Compruebe si el atacante ha logrado registrar tareas programadas o bibliotecas maliciosas:
crontab -u www-data -l ls -lat /tmp /dev/shm /var/tmp | head -n 20 - Remediación Rápida y Reactivación Segura:
Aplique la directiva
session.upload_progress.enabled = Offen el archivophp.ini, verifique la integridad de los archivos de la aplicación con Git (git status) y reinicie el servicio de forma controlada.
5. Regla Genérica Sigma para Integración en SIEM Corporativos (Splunk, Elastic, Sentinel)
Para organizaciones que gestionan sus eventos de seguridad a través de plataformas SIEM centralizadas, la regla en formato estándar Sigma permite convertir la lógica de detección a dialectos de Splunk SPL, Elasticsearch KQL o Microsoft Sentinel Kusto:
title: Ejecución Anómala de Intérprete de Comandos desde Proceso PHP-FPM
id: 9a78b412-2026-1096-1901-abcdef123456
status: experimental
description: Detecta la creación de shells del sistema (sh, bash, python) originadas por procesos del motor PHP, indicando un posible compromiso exitoso de PHP2Shell
author: INCIBE Threat Research Team
date: 2026-10-23
references:
- https://php2shell.run/
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-109619
logsource:
category: process_creation
product: linux
detection:
parent_process:
Image|endswith:
- '/php-fpm'
- '/php-fpm8.2'
- '/php-fpm8.3'
- '/php-fpm8.4'
- '/php-fpm8.5'
- '/apache2'
- '/httpd'
child_process:
Image|endswith:
- '/bin/sh'
- '/bin/bash'
- '/bin/dash'
- '/usr/bin/python'
- '/usr/bin/python3'
- '/usr/bin/perl'
- '/usr/bin/curl'
- '/usr/bin/wget'
- '/bin/nc'
condition: parent_process and child_process
fields:
- Image
- CommandLine
- ParentImage
- User
falsepositives:
- Scripts de mantenimiento administrativo extremadamente atípicos programados para ejecutarse bajo el usuario web
level: critical
tags:
- attack.execution
- attack.t1059.004
6. Consultas de Caza Proactiva con OSQuery
Si su equipo emplea OSQuery para la exploración activa de la flota de servidores Linux, ejecute las siguientes consultas SQL para identificar procesos en ejecución sospechosos o sockets de red establecidos por el usuario www-data:
-- Buscar procesos interactivos derivados de trabajadores web
SELECT p.pid, p.name, p.path, p.cmdline, p.parent, parent.name AS parent_name
FROM processes p
JOIN processes parent ON p.parent = parent.pid
WHERE parent.name IN ('php-fpm', 'apache2', 'httpd')
AND p.name IN ('sh', 'bash', 'dash', 'python', 'perl', 'curl', 'wget', 'nc');
-- Buscar conexiones de red salientes sospechosas abiertas por procesos de PHP
SELECT pos.pid, p.name, pos.remote_address, pos.remote_port, pos.state
FROM process_open_sockets pos
JOIN processes p ON pos.pid = p.pid
WHERE p.name LIKE 'php%' AND pos.remote_port NOT IN (80, 443, 3306, 5432, 6379);
Estas consultas ofrecen visibilidad instantánea sobre sockets no estándar (como conexiones a puertos de reverse shell típicos: 4444, 1337, 8080) establecidos por el entorno de ejecución de PHP.
7. Respuesta Activa Automatizada con Wazuh EDR
Para equipos de seguridad que utilizan Wazuh, configure una respuesta activa (Active Response) que bloquee la IP de origen en el cortafuegos perimetral cuando se detecte una alerta de nivel 12 o superior relacionada con PHP2Shell:
<!-- /var/ossec/etc/ossec.conf -->
<active-response>
<command>firewall-drop</command>
<location>local</location>
<rules_id>102619,102618</rules_id>
<timeout>1800</timeout>
</active-response>
Esta acción bloquea temporalmente al atacante durante 30 minutos a nivel de nftables/iptables, sofocando de raíz los escaneos automatizados.