
Kit de detección a nivel de organización de AWS para CVE-2025-55182 y CVE-2025-66478 (vulnerabilidades RCE de React Server Components / Next.js)
Kit de detección en toda la organización de AWS para CVE-2025-55182 y CVE-2025-66478
⚠️ DESCARGO DE RESPONSABILIDAD IMPORTANTE: LEA ANTES DE USAR
Este kit NO ha sido probado en un entorno AWS de producción.
Debido a limitaciones de infraestructura, este proyecto se desarrolló y validó únicamente mediante revisión de código, análisis estático y verificación de documentación. No se ha desplegado ni probado en un entorno AWS real con servicios activos de GuardDuty, WAF, EventBridge o CloudTrail.
Qué significa esto para usted:
Componente Estado Lógica del escáner Python ✅ Código revisado, validado con Snyk Sintaxis de Terraform ✅ Validada, no aplicada Políticas de IAM ⚠️ Pueden requerir ajustes para su entorno Reglas de EventBridge ⚠️ Patrones de hallazgos basados en la documentación de AWS Reglas de WAF ⚠️ Patrones regex no probados contra tráfico real Consultas de Athena ⚠️ Los supuestos de esquema pueden requerir modificaciones Recomendaciones:
- Despliegue primero en una cuenta que no sea de producción - Pruebe todos los componentes en un entorno sandbox
- Revise cuidadosamente las políticas de IAM - Ajuste los permisos para que coincidan con los requisitos de su organización
- Valide los planes de Terraform - Ejecute
terraform plany revíselo antes de aplicarlo- Pruebe los patrones de EventBridge - Verifique que las cadenas de tipo de hallazgo coincidan con la salida de su GuardDuty
- Supervise los registros de CloudWatch - Compruebe si hay errores después del despliegue
Responsabilidad:
Este software se proporciona "TAL CUAL", sin garantía de ningún tipo. Los autores no asumen ninguna responsabilidad por daños, incidentes de seguridad o costos de AWS derivados del uso de este kit. Úselo bajo su propio riesgo.
Si logra desplegar y probar este kit, considere aportar sus hallazgos para mejorarlo para la comunidad.
Un kit de seguridad integral para detectar intentos de explotación de React2Shell en entornos AWS. Este kit proporciona detección en tiempo real, capacidades de búsqueda de amenazas y respuesta automatizada para la vulnerabilidad crítica de ejecución remota de código (RCE) en React Server Components.
__proto__:then permite la ejecución arbitraria de código a través de process.mainModule.require('child_process').execSync()---
## Requisitos previos
### Permisos requeridos```
# Minimum IAM permissions for the detection script
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudtrail:LookupEvents",
"logs:StartQuery",
"logs:GetQueryResults",
"guardduty:ListDetectors",
"guardduty:ListFindings",
"guardduty:GetFindings",
"guardduty:CreateThreatIntelSet",
"guardduty:UpdateThreatIntelSet",
"guardduty:ListThreatIntelSets",
"guardduty:GetThreatIntelSet",
"s3:PutObject",
"s3:GetObject",
"sts:GetCallerIdentity",
"sts:AssumeRole"
],
"Resource": "*"
}
]
}
# For Security Hub integration, add:
"securityhub:BatchImportFindings"
# For SNS alerting, add:
"sns:Publish"
# For organization-wide scanning, add:
"organizations:ListAccounts"
cd React2Shell_Hunter
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
### Paso 2: Configurar las credenciales de AWS```bash
# Option A: Use AWS CLI profile
aws configure --profile security-scanner
# Option B: Export environment variables
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_DEFAULT_REGION="us-east-1"
# Option C: Use IAM role (recommended for EC2/Lambda)
# Attach appropriate IAM role to your compute resource
aws sts get-caller-identity
python -c "import boto3, yaml; print('Dependencies OK')"
python -c " import yaml with open('config/iocs.yaml') as f: iocs = yaml.safe_load(f) print(f'Loaded {len(iocs["network_iocs"]["malicious_ips"])} malicious IPs') "
---
## Inicio Rápido
### Escanear Cuenta Actual (Últimas 24 Horas)```bash
python src/react2shell_detector.py --hours 24
Salida esperada:``` 2025-12-06 10:00:00 - React2ShellDetector - INFO - ============================================================ 2025-12-06 10:00:00 - React2ShellDetector - INFO - React2Shell IOC Detection Script 2025-12-06 10:00:00 - React2ShellDetector - INFO - CVE-2025-55182 & CVE-2025-66478 2025-12-06 10:00:00 - React2ShellDetector - INFO - ============================================================ 2025-12-06 10:00:00 - React2ShellDetector - INFO - Starting single account scan... 2025-12-06 10:00:00 - React2ShellDetector - INFO - Analyzing CloudTrail logs... 2025-12-06 10:00:05 - React2ShellDetector - INFO - Checking GuardDuty findings...
Total findings: 0 CRITICAL: 0 HIGH: 0 MEDIUM: 0
### Escaneo completo de producción```bash
python src/react2shell_detector.py \
--organization \
--role-name SecurityAuditRole \
--security-hub \
--guardduty-bucket my-threat-intel-bucket-12345 \
--vpc-log-group /aws/vpc/flowlogs \
--waf-log-group aws-waf-logs-react2shell \
--sns-topic arn:aws:sns:us-east-1:123456789012:security-alerts \
--output json \
--output-file findings-$(date +%Y%m%d).json \
--hours 72
NO PUEDES CREAR REGLAS DE DETECCIÓN PERSONALIZADAS EN GUARDDUTY.
GuardDuty utiliza modelos de ML e inteligencia de amenazas para generar hallazgos. Para detectar React2Shell:
MaliciousIPCaller.Custom### Patrones de Reglas de EventBridge
Terraform crea 7 reglas específicas de EventBridge:
| Regla | Patrón de Tipo de Hallazgo | Severidad |
|------|---------------------|----------|
| `react2shell-malicious-ip-caller` | `MaliciousIPCaller.Custom` | CRITICAL |
| `react2shell-credential-exfiltration` | `InstanceCredentialExfiltration.*` | CRITICAL |
| `react2shell-dns-exfiltration` | `DNSDataExfiltration` | HIGH |
| `react2shell-cryptocurrency-mining` | `CryptoCurrency:*` | HIGH |
| `react2shell-unusual-network-ports` | `NetworkPortUnusual` | MEDIUM |
| `react2shell-malicious-domain` | `MaliciousDomainRequest.*` | HIGH |
| `react2shell-high-severity-catchall` | Severity >= 7 | VARIES |
### Capas de Protección WAF
El WebACL de WAF implementa 9 reglas en orden de prioridad:
| Prioridad | Regla | Acción | Qué Detecta |
|----------|------|--------|-----------------|
| 1 | Bloquear IPs Maliciosas | BLOCK | Conexiones desde 9 IPs C2 conocidas |
| 2 | Valores del Encabezado Next-Action | BLOCK | Encabezado `next-action` que contiene patrones `$ACTION` o `__proto__` |
| 3 | Valores del Encabezado RSC-Action-ID | BLOCK | Encabezado `rsc-action-id` que contiene patrones `$ACTION` o `__proto__` |
| 4 | Contaminación de Prototipos | BLOCK | `__proto__` o `constructor.prototype` en el cuerpo |
| 5 | Patrones RCE | BLOCK | `process.mainModule.require`, `child_process`, `execSync` |
| 6 | Parámetro ACTION | BLOCK | `$ACTION_0:0` o `$ACTION_REF` en el cuerpo POST |
| 7 | User-Agents Sospechosos | COUNT | `Go-http-client`, `Assetnote`, `python-requests` |
| 8 | Entradas Maliciosas Conocidas de AWS | INHERIT | Grupo de reglas administrado por AWS |
| 9 | Conjunto de Reglas Común de AWS | INHERIT | Grupo de reglas administrado por AWS |
> **Nota**: Las reglas 2 y 3 usan `or_statement` con múltiples comprobaciones `byte_match_statement` para detectar VALORES de encabezado maliciosos (no solo la presencia del encabezado). AWS WAF no admite expresiones regulares en la coincidencia de encabezados, por lo que cada patrón requiere una declaración separada. Los nombres de encabezados están en minúsculas, como lo requiere WAF.
---
## Referencia de Componentes
### Estructura del Proyecto```
React2Shell_Hunter/
├── config/
│ └── iocs.yaml # IOC database (IPs, domains, patterns) - 452 lines
├── src/
│ └── react2shell_detector.py # Main detection script - 1141 lines
├── terraform/
│ ├── guardduty.tf # GuardDuty + ThreatIntelSet + S3 - 405 lines
│ ├── eventbridge_rules.tf # 7 EventBridge rules - 533 lines
│ └── waf_rules.tf # WAF WebACL with 9 rules - 681 lines
├── lambda/
│ └── ioc_scanner/
│ └── handler.py # Real-time Lambda scanner - 381 lines
├── athena_queries/
│ └── detection_queries.sql # 18 threat hunting queries - 483 lines
├── tests/
│ ├── __init__.py # Test package init
│ ├── conftest.py # Pytest fixtures (project_root, ioc_config, etc.)
│ ├── test_ioc_matching.py # IOC pattern validation tests
│ ├── test_terraform.py # Terraform configuration validation
│ └── test_waf_patterns.py # WAF regex pattern tests
├── docs/
│ ├── THREAT_INTELLIGENCE_REPORT.md
│ └── GUARDDUTY_EVENTBRIDGE_SETUP_GUIDE.md
├── requirements.txt # Python dependencies (boto3, pyyaml, pytest, python-hcl2)
├── README.md
└── CLAUDE.md
cd terraform
terraform init
terraform plan
-var="threat_intel_bucket=react2shell-threat-intel-$(aws sts get-caller-identity --query Account --output text)"
-var="enable_guardduty=true"
-var="enable_waf=true"
-var="waf_scope=REGIONAL"
terraform apply
-var="threat_intel_bucket=react2shell-threat-intel-$(aws sts get-caller-identity --query Account --output text)"
**Variables de Terraform:**
| Variable | Obligatorio | Valor por defecto | Descripción |
|----------|----------|---------|-------------|
| `threat_intel_bucket` | Sí | - | Nombre del bucket S3 para archivos de inteligencia de amenazas |
| `enable_guardduty` | no | true | Habilitar el detector de GuardDuty |
| `enable_waf` | no | true | Crear WebACL de WAF |
| `waf_scope` | no | REGIONAL | `REGIONAL` o `CLOUDFRONT` |
| `block_mode` | no | BLOCK | `BLOCK` o `COUNT` |
| `enable_lambda_automation` | no | false | Habilitar Lambda para respuesta automatizada |
### Paso 2: Asociar el WAF con los recursos
La WebACL de WAF debe asociarse a sus recursos:```bash
# Associate with ALB
aws wafv2 associate-web-acl \
--web-acl-arn $(terraform output -raw web_acl_arn) \
--resource-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/my-alb/1234567890
# Associate with API Gateway
aws wafv2 associate-web-acl \
--web-acl-arn $(terraform output -raw web_acl_arn) \
--resource-arn arn:aws:apigateway:us-east-1::/restapis/abc123/stages/prod
SNS_TOPIC=$(terraform output -raw sns_topic_arn)
aws sns subscribe
--topic-arn $SNS_TOPIC
--protocol email
--notification-endpoint [email protected]
aws sns subscribe
--topic-arn $SNS_TOPIC
--protocol lambda
--notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:slack-notifier
### Paso 4: Crear tablas de Athena```bash
# Open Athena console or use AWS CLI
# Run the CREATE TABLE statements from athena_queries/detection_queries.sql
# CloudTrail table
aws athena start-query-execution \
--query-string "CREATE EXTERNAL TABLE cloudtrail_logs ..." \
--work-group primary \
--query-execution-context Database=default
| Puerto | Uso |
|---|---|
| 652 | Stager de PowerShell |
| 2045 | C2 personalizado |
| 8000, 8080 | C2 HTTP alternativo |
| 12000, 45178 |
aws guardduty list-detectors
aws guardduty create-detector --enable
terraform apply -var="enable_guardduty=true"
#### "No se pudo asumir el rol en la cuenta miembro"```bash
# Verify role exists in target account
aws iam get-role --role-name SecurityAuditRole
# Verify trust policy allows your account
aws iam get-role --role-name SecurityAuditRole --query 'Role.AssumeRolePolicyDocument'
# Test role assumption
aws sts assume-role \
--role-arn arn:aws:iam::TARGET_ACCOUNT:role/SecurityAuditRole \
--role-session-name test
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) aws guardduty list-threat-intel-sets --detector-id $DETECTOR_ID
aws s3api get-bucket-policy --bucket your-threat-intel-bucket
aws s3 cp s3://your-bucket/threat-intel/react2shell-ips.txt -
#### "La regla WAF no bloquea"```bash
# Check if WebACL is associated
aws wafv2 list-resources-for-web-acl \
--web-acl-arn $(terraform output -raw web_acl_arn)
# Check sampled requests
aws wafv2 get-sampled-requests \
--web-acl-arn $(terraform output -raw web_acl_arn) \
--rule-metric-name React2Shell-Malicious-IP-Blocked \
--scope REGIONAL \
--time-window StartTime=2025-12-06T00:00:00Z,EndTime=2025-12-06T23:59:59Z \
--max-items 10
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty create-sample-findings
--detector-id $DETECTOR_ID
--finding-types "UnauthorizedAccess:IAMUser/MaliciousIPCaller.Custom"
aws cloudwatch get-metric-statistics
--namespace AWS/Events
--metric-name Invocations
--dimensions Name=RuleName,Value=react2shell-malicious-ip-caller
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
--period 300
--statistics Sum
---
## Preguntas frecuentes
### P: ¿Esto reemplaza el parcheo?
**NO.** Este es un kit de detección, no una solución de prevención. DEBES aplicar los parches:
- React: 19.0.1, 19.1.2 o 19.2.1
- Next.js: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 o 16.0.7
### P: ¿Detectará todos los ataques React2Shell?
**Ninguna detección es 100%.** Este kit detecta:
- Conexiones a IPs C2 conocidas (si el atacante usa IPs nuevas, no se detectará)
- Patrones de payload conocidos (si el atacante ofusca, puede evadir el WAF)
- Comportamiento posterior a la explotación (robo de credenciales, movimiento lateral)
### P: ¿Con qué frecuencia debo ejecutar el escáner?
Programa recomendado:
- **Continuo**: GuardDuty + EventBridge (tiempo real)
- **Cada hora**: script de Python con `--hours 1`
- **A diario**: consultas completas de threat hunting en Athena
### P: ¿Cómo agrego nuevos IOCs?
Edita `config/iocs.yaml` y añádelos a las secciones correspondientes:```yaml
network_iocs:
malicious_ips:
- ip: "NEW.IP.ADDRESS.HERE"
port: 8080
context: "Description"
confidence: high
source: "Your source"
Luego actualiza ThreatIntelSet:```bash python src/react2shell_detector.py --guardduty-bucket your-bucket
---
## Ejecutar Pruebas```bash
# Install test dependencies
pip install -r requirements.txt
# Run all tests
pytest tests/ -v
# Run specific test categories
pytest tests/test_terraform.py -v # Terraform validation
pytest tests/test_ioc_matching.py -v # IOC pattern tests
pytest tests/test_waf_patterns.py -v # WAF regex tests
# Run with coverage
pytest tests/ --cov=src --cov-report=html
Descargo de responsabilidad: Este kit de herramientas es únicamente para fines de seguridad defensiva. Asegúrate de contar con la autorización adecuada antes de escanear sistemas.
| Software | Versión | Propósito |
|---|
| Python | 3.9+ | Entorno de ejecución del script de detección |
| Terraform | 1.0+ | Despliegue de infraestructura |
| AWS CLI | 2.x | Autenticación de AWS |
| boto3 | 1.34+ | SDK de AWS para Python |
| Clase | Propósito | Métodos clave |
|---|
IOCLoader | Cargar IOCs desde YAML | get_malicious_ips(), get_suspicious_ports(), get_malicious_domains() |
CloudTrailAnalyzer | Detectar IOCs basados en API | analyze_recent_events(hours) |
VPCFlowLogAnalyzer | Detectar IOCs de red | analyze_flow_logs(log_group, hours) |
GuardDutyManager | Gestionar inteligencia de amenazas | create_threat_intel_set(bucket), get_relevant_findings(hours) |
WAFLogAnalyzer | Detectar IOCs HTTP | analyze_waf_logs(log_group, hours) |
OrganizationScanner | Escaneo entre cuentas | scan_organization(hours, role_name) |
SecurityHubReporter | Importar hallazgos | import_findings(findings) |
SNSAlerter | Enviar alertas | send_alert(findings) |
| Argumento | Tipo | Predeterminado | Descripción |
|---|
--config | string | config/iocs.yaml | Ruta al archivo de configuración de IOC |
--hours | int | 24 | Horas de registros a analizar |
--organization | flag | false | Escanear toda la organización de AWS |
--role-name | string | OrganizationAccountAccessRole | Rol a asumir en cuentas miembro |
--sns-topic | string | none | ARN del topic de SNS para alertas |
--security-hub | flag | false | Importar hallazgos a Security Hub |
--guardduty-bucket | string | none | Bucket S3 para inteligencia de amenazas de GuardDuty |
--vpc-log-group | string | none | Grupo de registros de CloudWatch para VPC Flow Logs |
--waf-log-group | string | none | Grupo de registros de CloudWatch para logs de WAF |
--output | enum | text | Formato de salida: json, text, csv |
--output-file | string | none | Ruta del archivo de salida |
--debug | flag | false | Habilitar registro de depuración |
| Dirección IP | Puerto | Confianza | Contexto | Fuente |
|---|
| 93.123.109.247 | 8000 | ALTA | Servidor C2 principal | Datadog |
| 45.77.33.136 | 8080 | ALTA | Servidor C2 principal | Datadog |
| 194.246.84.13 | 2045 | ALTA | Servidor C2 principal | Datadog |
| 141.11.240.103 | 45178 | ALTA | Servidor C2 principal | Datadog |
| 23.235.188.3 | 652 | ALTA | Stager de PowerShell | GreyNoise |
| 46.36.37.85 | 12000 | ALTA | Staging de payload | GreyNoise |
| 144.202.115.234 | 80 | MEDIA | Alojamiento de payload | Datadog |
| 162.215.170.26 | 3000 | MEDIA | Payload secundario | GreyNoise |
| 45.32.158.54 | - | MEDIA | Escáner | GreyNoise |
| Dominio | Categoría | Confianza |
|---|
| ceye.io | Exfiltración de DNS | ALTA |
| dnslog.cn | Exfiltración de DNS | ALTA |
| *.oastify.com | Burp Collaborator | MEDIA |
| sapo.shk0x.net | C2 | ALTA |
| xwpoogfunv.zaza.eu.org | C2 | ALTA |
| *.c3pool.com | Criptominería | ALTA |
| C2 personalizado |
| 3333, 5555, 14433, 14444 | Criptominería |
| Patrón | Severidad | Descripción |
|---|
next-action: * | CRÍTICA | Cabecera de explotación de RSC (en minúsculas en el WAF) |
rsc-action-id: * | CRÍTICA | Identificador de acción de RSC (en minúsculas en el WAF) |
$ACTION_0:0 | CRÍTICA | Parámetro de acción de RSC |
__proto__:then | CRÍTICA | Contaminación de prototipos |
process.mainModule.require | CRÍTICA | RCE de Node.js |
child_process | CRÍTICA | Ejecución de comandos |
Go-http-client/1.1 | MEDIA | User agent de escáner |