README
Reconocimiento
Section titled “Reconocimiento”Metodología Completa de Enumeración Web
Section titled “Metodología Completa de Enumeración Web”Fases de la Enumeración
Section titled “Fases de la Enumeración”1. PASIVO (No alertas) └─ Subfinder → DNSx
2. VALIDACIÓN HTTP (Bajo-medio ruido) └─ httpx → Filtrado
3. ANÁLISIS VISUAL (Bajo-medio ruido) └─ GoWitness → Screenshots + DB
4. DESCOBRIMIENTO ADICIONAL (Medio ruido) └─ ParamSpider → Parámetros └─ Ffuf → Directorios/Vhosts └─ Nuclei → Vulnerabilidades
5. ANÁLISIS TÉCNICO └─ Waf-detect → Identificar WAF └─ Retire.js → JS vulnerables └─ Análisis manual en BurpRequisitos previos
Section titled “Requisitos previos”# Instalación de herramientasgo install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latestgo install -v github.com/projectdiscovery/httpx/cmd/httpx@latestgo install github.com/sensepost/gowitness@latestgo install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latestgo install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latestgo install -v github.com/projectdiscovery/paramspider@latestgo install -v github.com/ffuf/ffuf@latestgo install github.com/projectdiscovery/wafw00f/cmd/wafw00f@latest
# En Fedora/RHELsudo dnf install -y openjdk-latest-runtime # Para algunas herramientas
# Opcional pero recomendadogit clone https://github.com/RetireJS/retire.js.gitFASE 1: RECONOCIMIENTO PASIVO
Section titled “FASE 1: RECONOCIMIENTO PASIVO”Paso 1.1: Enumeración de subdominios con Subfinder
Section titled “Paso 1.1: Enumeración de subdominios con Subfinder”TARGET="target.com"WORKSPACE="$TARGET-enum-$(date +%Y%m%d)"
mkdir -p "$WORKSPACE"cd "$WORKSPACE"
echo "[+] Fase 1: Reconocimiento pasivo con Subfinder"echo "[*] Target: $TARGET"
subfinder -d $TARGET -silent -o 01-subdominios-raw.txt
echo "[✓] Subdominios encontrados: $(wc -l < 01-subdominios-raw.txt)"Salida esperada:
01-subdominios-raw.txt- Lista de subdominios sin validar
Paso 1.2: Resolver DNS y validar existencia
Section titled “Paso 1.2: Resolver DNS y validar existencia”# Resolver A records de todos los subdominiosdnsx -l 01-subdominios-raw.txt -a -o 01-dns-resolved.txt
# Resolver MX records (opcional, util para email enumeration)dnsx -l 01-subdominios-raw.txt -mx -o mx-records.txt
# Ver cuáles resuelvenecho "[✓] Subdominios resueltos: $(wc -l < 01-dns-resolved.txt)"
# Filtrar solo los que resuelvencat 01-dns-resolved.txt | cut -d' ' -f1 | sort -u > 01-subdominios-validos.txtArchivos generados:
01-dns-resolved.txt- IPs resueltas01-subdominios-validos.txt- Solo subdominios que resuelven
FASE 2: VALIDACIÓN HTTP
Section titled “FASE 2: VALIDACIÓN HTTP”Paso 2.1: httpx - Verificar status HTTP
Section titled “Paso 2.1: httpx - Verificar status HTTP”echo "[+] Fase 2: Validación HTTP con httpx"
httpx -l 01-subdominios-validos.txt \ -fc 404,403,500,502,503,504 \ -status-code \ -title \ -content-length \ -tech-detect \ -location \ -rate-limit 50 \ -timeout 5 \ -threads 25 \ -retries 2 \ -json \ -o 02-httpx-results.json
echo "[✓] URLs vivas encontradas"Salida: 02-httpx-results.json
{ "url": "https://api.target.com", "status_code": 200, "title": "API Dashboard", "content_length": 45123, "technologies": ["Node.js", "Express"], "location": "", "time": "45ms"}Paso 2.2: Parsear y filtrar resultados
Section titled “Paso 2.2: Parsear y filtrar resultados”# Extraer solo URLs vivas (200, 301, 302, 401, 403 interesantes)jq -r 'select(.status_code | IN(200,301,302,401,403,429)) | .url' \ 02-httpx-results.json | sort -u > 02-urls-vivas.txt
echo "[✓] URLs vivas: $(wc -l < 02-urls-vivas.txt)"
# Crear index para análisis posteriorjq -r '.url + " [" + (.status_code | tostring) + "] " + .title' \ 02-httpx-results.json > 02-urls-indexed.txt
cat 02-urls-indexed.txtArchivo: 02-urls-vivas.txt
https://target.comhttps://api.target.comhttps://admin.target.comhttps://staging.target.comFASE 3: ANÁLISIS VISUAL CON GOWITNESS
Section titled “FASE 3: ANÁLISIS VISUAL CON GOWITNESS”Paso 3.1: Tomar screenshots
Section titled “Paso 3.1: Tomar screenshots”echo "[+] Fase 3: Screenshots con GoWitness v3"
gowitness scan file -f 02-urls-vivas.txt \ --threads 8 \ --delay 500 \ --timeout 20 \ --writer-db \ --writer-jsonl \ --destination ./screenshots
echo "[✓] Screenshots completados"Genera:
gowitness.sqlite- Base de datos con metadatascreenshots/- Directorio con PNGs.jsonl- Línea por línea en JSON
Paso 3.2: Análisis en interfaz web
Section titled “Paso 3.2: Análisis en interfaz web”# Iniciar servidor de reportesecho "[+] Iniciando GoWitness report server..."gowitness report --port 7171
# Abrir en navegador# http://localhost:7171
# En otra terminal, mantener acceso:# firefox http://localhost:7171 &En la UI de GoWitness:
- Dashboard - Estadísticas generales
- Table View - Listar todos con filtros
- Detail - Inspeccionar individual
- Search - Buscar por headers, tecnologías, etc
- Export - Exportar para análisis
Paso 3.3: Queries SQL en GoWitness
Section titled “Paso 3.3: Queries SQL en GoWitness”# Acceder a la DB directamentesqlite3 gowitness.sqlite
# Queries útiles:SELECT url, status_code, title, technologiesFROM urlsWHERE status_code = 200ORDER BY url;
# URLs con keywords interesantesSELECT url, titleFROM urlsWHERE title LIKE '%admin%' OR title LIKE '%login%';
# Tecnologías detectadasSELECT DISTINCT technologiesFROM urlsWHERE technologies IS NOT NULL;
# Exportar a CSV.mode csv.output report.csvSELECT url, status_code, title, technologies FROM urls;.quitFASE 4: DESCUBRIMIENTO ADICIONAL
Section titled “FASE 4: DESCUBRIMIENTO ADICIONAL”Paso 4.1: WAF Detection
Section titled “Paso 4.1: WAF Detection”echo "[+] Fase 4.1: Detectando WAF..."
wafw00f -l 02-urls-vivas.txt -o 04-waf-detect.txt
cat 04-waf-detect.txtImportante: Si hay WAF, ajustar estrategia (rate limiting, User-Agent, etc)
Paso 4.2: Descubrimiento de parámetros (ParamSpider)
Section titled “Paso 4.2: Descubrimiento de parámetros (ParamSpider)”echo "[+] Fase 4.2: Extrayendo parámetros con ParamSpider..."
# ParamSpider usa Wayback Machine - pasivoparamspider --domain target.com --output params.txt --quiet
# Filtrar parámetros únicossort -u params.txt > 04-parametros-unicos.txt
echo "[✓] Parámetros encontrados: $(wc -l < 04-parametros-unicos.txt)"Archivo: 04-parametros-unicos.txt
user_idproduct_idredirect_urlsearchqsort_byfilterPaso 4.3: Fuzzing de directorios y vhosts
Section titled “Paso 4.3: Fuzzing de directorios y vhosts”echo "[+] Fase 4.3: Fuzzing con Ffuf..."
# Crear wordlist para directorios# O descarga: https://github.com/danielmiessler/SecLists
# Fuzzing de directorios (en cada URL viva)for url in $(cat 02-urls-vivas.txt); do echo "[*] Fuzzing: $url" ffuf -u "$url/FUZZ" \ -w /usr/share/seclists/Discovery/Web-Content/common.txt \ -fc 404 \ -t 50 \ -of json \ -o "04-ffuf-$(echo $url | md5sum | cut -d' ' -f1).json"done
# Consolidar resultadosecho "[✓] Fuzzing completado"Filtrar resultados interesantes:
# Directorios con status 200 o 301find . -name "04-ffuf-*.json" -exec jq '.results[] | select(.status | IN(200,301))' {} \; \ > 04-directorios-interesantes.txtPaso 4.4: Fuzzing de Vhosts
Section titled “Paso 4.4: Fuzzing de Vhosts”echo "[+] Fase 4.4: Fuzzing de Virtual Hosts..."
# Obtener IP principal de target.comIP=$(dig +short target.com A | head -1)
# Fuzzing de vhostsffuf -u "http://$IP/" \ -H "Host: FUZZ.target.com" \ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \ -fc 404 \ -t 50 \ -of json \ -o 04-vhosts-ffuf.jsonFASE 5: ANÁLISIS TÉCNICO
Section titled “FASE 5: ANÁLISIS TÉCNICO”Paso 5.1: Nuclei - Escaneo de vulnerabilidades
Section titled “Paso 5.1: Nuclei - Escaneo de vulnerabilidades”echo "[+] Fase 5.1: Escaneo con Nuclei..."
# Actualizar templatesnuclei -update-templates
# Escaneo básiconuclei -l 02-urls-vivas.txt \ -t /root/nuclei-templates/cves/ \ -t /root/nuclei-templates/exposures/ \ -o 05-nuclei-results.txt \ -severity high,critical
# Escaneo específico (CORS, CSP, etc)nuclei -l 02-urls-vivas.txt \ -t /root/nuclei-templates/http/ \ -tags cors,csp,headers \ -o 05-nuclei-headers.txtEjemplo de output:
[CVE-2021-1234] https://admin.target.com - Vulnerable to XXE[CORS-Misconfiguration] https://api.target.com - Overly permissive CORS[Missing-Security-Headers] https://target.com - Missing CSP headerPaso 5.2: Análisis de JavaScript (Retire.js)
Section titled “Paso 5.2: Análisis de JavaScript (Retire.js)”echo "[+] Fase 5.2: Escaneo de librerías JS vulnerables..."
# Descargar retire.js si no está[ ! -d retire.js ] && git clone https://github.com/RetireJS/retire.js.git
cd retire.jsnpm install
# Escanear las URLs (descarga JS y analiza)node retire.js --jspath screenshots/ --outputformat json > ../05-retire-results.json
cd ..Paso 5.3: Extracción de tecnologías para análisis adicional
Section titled “Paso 5.3: Extracción de tecnologías para análisis adicional”echo "[+] Fase 5.3: Resumen de tecnologías..."
# Desde httpx resultsjq -r '.technologies[]?' 02-httpx-results.json | sort | uniq -c | sort -rn > 05-tech-summary.txt
cat 05-tech-summary.txtEjemplo:
10 Apache8 PHP 7.47 jQuery 3.5.15 Bootstrap 43 Wordpress 5.8FASE 6: COMPILACIÓN Y ANÁLISIS
Section titled “FASE 6: COMPILACIÓN Y ANÁLISIS”Paso 6.1: Crear reporte consolidado
Section titled “Paso 6.1: Crear reporte consolidado”cat > 06-reporte-enumeracion.txt << 'EOF'========================================REPORTE DE ENUMERACIÓN========================================
TARGET: target.comFECHA: $(date)ENUMERADOR: Pyrhos
--- ESTADÍSTICAS ---Total subdominios encontrados: $(wc -l < 01-subdominios-raw.txt)Subdominios que resuelven: $(wc -l < 01-subdominios-validos.txt)URLs HTTP vivas: $(wc -l < 02-urls-vivas.txt)Directorios descubiertos: $(jq '.results[] | select(.status == 200)' 04-ffuf-*.json | wc -l)Vulnerabilidades encontradas: $(wc -l < 05-nuclei-results.txt)
--- URLS VIVAS PRIORITARIAS ---$(head -20 02-urls-indexed.txt)
--- TECNOLOGÍAS DETECTADAS ---$(head -10 05-tech-summary.txt)
--- WAF DETECTADO ---$(cat 04-waf-detect.txt | head -5)
--- VULNERABILIDADES CRÍTICAS ---$(grep -E "critical|high" 05-nuclei-results.txt | head -10)
========================================EOF
cat 06-reporte-enumeracion.txtPaso 6.2: Estructura final de directorios
Section titled “Paso 6.2: Estructura final de directorios”target.com-enum-20260315/├── 01-subdominios-raw.txt├── 01-dns-resolved.txt├── 01-subdominios-validos.txt├── 02-httpx-results.json├── 02-urls-vivas.txt├── 02-urls-indexed.txt├── 03-screenshots/│ ├── https-target.com.png│ ├── https-api.target.com.png│ └── ...├── gowitness.sqlite├── 04-waf-detect.txt├── 04-parametros-unicos.txt├── 04-directorios-interesantes.txt├── 04-vhosts-ffuf.json├── 05-nuclei-results.txt├── 05-nuclei-headers.txt├── 05-retire-results.json├── 05-tech-summary.txt├── 06-reporte-enumeracion.txt└── notes.txt (anotaciones manuales)HERRAMIENTAS COMPLEMENTARIAS
Section titled “HERRAMIENTAS COMPLEMENTARIAS”Una vez completada la enumeración, para profundizar:
Burp Suite Pro
Section titled “Burp Suite Pro”- Análisis manual detallado
- Intruder para fuzzing
- Scanner para vulnerabilidades
Análisis de Respuestas
Section titled “Análisis de Respuestas”# Extraer todos los headers interesantesjq -r '.headers | to_entries[] | "\(.key): \(.value)"' 02-httpx-results.json | sort -u
# Headers de seguridadjq -r 'select(.headers | keys[] | contains("X-") or contains("Content-Security-Policy")) | .url + ": " + (.headers | to_entries[].key)' 02-httpx-results.jsonTesting Manual
Section titled “Testing Manual”- Validar hallazgos de Nuclei
- Buscar lógica de negocio
- Testing de autenticación/autorización
TIPS FINALES
Section titled “TIPS FINALES”Documentación:
- Guardar notas de cada descubrimiento
- Screenshots manuales de paneles interesantes
- Guardar URLs de endpoints críticos
Ruido & Detección:
- Este pipeline genera entre 2000-3000 requests
- Duración típica: 30-60 minutos
- Visible en logs pero pasa como tráfico legítimo