Herramienta interactiva y completa de pruebas de seguridad web basada en la metodología OWASP WSTG.
Características • Instalación • Uso • Reportes • Contribuir
- Descripción
- Características
- Requisitos Previos
- Instalación
- Uso Rápido
- Menú Principal
- Reportes
- Configuración Avanzada
- Solución de Problemas
- Contribuciones
- Licencia
- Disclaimer
WSTG Scanner es una herramienta de pentesting web interactiva y comprehensiva que implementa las mejores prácticas del OWASP Web Security Testing Guide y el OWASP API Top 10.
Diseñada para bug bounty hunters y pentesters, automatiza tareas comunes de reconocimiento, análisis y pentesting web:
- 🕷️ Mapeo completo y exhaustivo de aplicaciones web (spidering con detección de formularios e inputs)
- 🔬 Análisis del código fuente de páginas y scripts JS expuestos (credenciales, API keys, JWT, claves PEM, comentarios sensibles)
- 🛡️ Análisis de vulnerabilidades con Nuclei (10.000+ templates)
- 🔍 Fuzzing rápido de directorios con ffuf (pre-filtrado de wordlist + baseline anti-falsos positivos)
- 💉 Pruebas de inyección avanzadas (SQLi, XSS, LFI, RCE, Open Redirect)
- 🔌 Detección y testing de APIs (IDOR, Mass Assignment, GraphQL, JWT, CORS)
- 🔍 Escaneo de puertos con Nmap (
-sVpara detección de servicios y versiones) - 🌐 Fuzzing de subdominios (vhost) con
ffufy baselineContent-Length - 🧩 WordPress / WPScan – enumeración de usuarios, detección de plugins/temas vulnerables y ataques dirigidos
- 🏛️ Pentesting de Active Directory – Kerbrute, LDAP, NetExec (nxc) e Impacket (AS-REP Roasting y Kerberoasting)
- 👤 Enumeración de usuarios y emails
- 🔐 Fuerza bruta con hydra + fallback CSRF-aware y autodetección del mensaje de error
- 📊 Reportes en TXT, JSON, Markdown y HTML (dashboard SaaS con tema claro/oscuro, exportable a PDF)
- Pre-autenticación – Login automático con credenciales (Basic Auth o formulario)
- Login headless (Playwright) – Para SPAs (Angular, Vue, React) y flujos OAuth2/OIDC/PKCE donde no existe
<form>HTML; detecta campos de email/usuario en dos pasos y extrae cookies de sesión del navegador - Validación real de credenciales – Basic Auth solo se da por bueno si el servidor envía el desafío
401 WWW-Authenticate: Basic; en formularios detecta mensajes de fallo (ES/EN) y rechaza si la respuesta sigue mostrando el campo de contraseña - Login con usuario o email – Un solo campo identificador; detecta el tipo por
@y rellena el campo de formulario correcto - User-Agent personalizado – Aplicable al login con credenciales, headless y modo manual
- Modo manual de sesión – Carga cookie/token, cabecera
Authorizationy cabeceras extra; valida la sesión antes de confiar en ella - Verificación post-login – Confirma que la sesión persiste tras autenticar
- Sesión persistente – Todas las pruebas posteriores usan la sesión autenticada
- Manejo de cookies y campos hidden (CSRF tokens)
- Información general – Server, headers, cookies, SSL/TLS, métodos HTTP, robots.txt / sitemap.xml
- Detección de tecnologías – Integración con
whatweb(auto-instalación) con fallback por cabeceras - Análisis de cabeceras de seguridad – HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy
- Seguridad de cookies – Flags
Secure,HttpOnly,SameSite - CORS avanzado – Wildcard + Credentials, origen reflejado, preflight con orígenes maliciosos
- Ejecuta
nmap -sVsobre el host del objetivo (extraído de la URL) - Auto-instalación de nmap vía
aptsi no está presente - Parsing XML (
-oX -) robusto: extrae puerto, protocolo, estado, servicio, producto, versión yextrainfo - Tabla visual con colores por estado (open / open|filtered) al terminar el escaneo
- Cada puerto abierto se registra en
FINDINGScon prefijo[PORT]y queda agrupado en una categoría propia en los reportes - Timeout configurable (600s por defecto), interrumpible con Ctrl+C
- Auto-instalación de Nuclei vía
aptsi no está presente - Soporte para
-jsonl-export(formato actual) con fallback a-json-export - Deduplicación automática por
(template_id, url, severity) - Tabla resumen por severidad y listado de hallazgos relevantes (critical/high/medium/low)
- Ruido del backend Interactsh (
Could not unmarshal interaction data) filtrado - Resultados integrados directamente en los reportes (TXT/JSON/HTML)
- Crawling BFS configurable (profundidad, número de páginas, respeto a robots.txt)
- Detección de formularios con inputs reales (excluye submit/button/file)
- Deduplicación por
(action, method, inputs)— no infla con el form de login del navbar - Manejo robusto de redirecciones (
TooManyRedirectsno aborta la fase) - Resultados reutilizados por las pruebas de inyección y el análisis de código fuente
- Reutiliza las URLs descubiertas por el spider (o lanza un spider rápido si no hay datos previos)
- Descarga el HTML de cada página y los recursos enlazados del mismo dominio: JS, JSON, source maps (
.map), CSS, YAML, XML,.env - Cap de 2 MB por archivo y
stream=Truepara evitar descargas masivas - 15 catálogos de patrones con severidad ponderada:
- Critical – claves PEM privadas, cadenas de conexión de BD con credenciales embebidas
- High – AWS Access Key/Secret, Google API Key, GitHub/Slack/Stripe tokens, JWT, credenciales hardcoded genéricas (
password=,api_key=,bearer=, …) - Medium – comentarios HTML sensibles (
TODO password,FIXME admin, …), Basic Auth en URL, source maps expuestos, IPs privadas (10/8, 172.16/12, 192.168/16) - Low – rutas internas (
/admin,/.git,/.env,/actuator, …), emails expuestos
- Los hallazgos critical/high se vuelcan a
FINDINGScon el prefijo[CODE:SEV] - Snippet de contexto (±30 caracteres) alrededor de cada coincidencia, deduplicación global por
(tipo, valor, url) - Resumen por severidad, tablas visuales, exportación a TXT/JSON/MD/HTML (card dedicado en el reporte)
- Detección de vhosts con
ffufenviandoHost: FUZZ.<dominio> - Baseline por Content-Length – envía un Host inválido (
defnotvalid<rnd>.<dominio>) para obtener el tamaño base y filtrar con-fstodas las respuestas que coincidan - Autodetección del dominio base si el target es un FQDN; pide manual si es una IP
- Wordlist por defecto:
Discovery/DNS/namelist.txt(SecLists) - Fallback a método interno multihilo si no hay
ffuf
- Fuzzing de directorios con
ffuf(ultra-rápido) o método interno multihilo - Pre-filtrado de wordlist – descarta comentarios (
#), líneas vacías y entradas con espacios - Filtro
-fspor baseline – descarta páginas-comodín (apps que devuelven 200 con el index para cualquier ruta) - Auto-calibración (
-ac) habilitada - Wordlist por defecto:
raft-small-directories.txt(SecLists) - Tabla con anchos dinámicos y separación por status code
- SQLi – Error-based, time-based blind, boolean-based
- XSS – Reflejado con análisis contextual
- Path Traversal / LFI –
/etc/passwd,win.ini, encodings y bypass - Command Injection – Linux y Windows
- Open Redirect – Detección de redirecciones a hosts arbitrarios
- Reutiliza los formularios e inputs detectados por el spider (eficiente)
- Enumera usuarios y rutas de login.
- Detecta la versión del core, los plugins y los temas instalados.
- Busca vulnerabilidades conocidas (CVE) en plugins y temas.
- Realiza fuerza bruta del login con wordlists.
- SSRF – Payloads contra parámetros URL (
url,redirect,src, …) y cabeceras (X-Forwarded-For,X-Original-URL, …); detecta respuestas de metadatos cloud (AWS IMDSv1, GCP, Alibaba); soporte OOB via colaborador externo (Burp, interactsh) - SSTI – Detección por math probes para Jinja2, Twig, FreeMarker, ERB, Pebble, Tornado; identifica el engine y detección por mensajes de error de template
- XXE – Descubre endpoints XML/SOAP (
/xmlrpc.php,/soap,/api/xml, WSDL); inyecta entidades externas confile:///etc/passwd, hostname y SSRF via DTD externo - CRLF Injection – Payloads
%0d%0aen path y parámetros de redirección; verifica cabeceras inyectadas en respuestas sin seguimiento de redireccionamiento - HTTP Request Smuggling – Usa
smuggler.pysi está disponible; prueba manual CL.TE con socket raw; instrucciones para instalar smuggler.py si falta - Cache Poisoning – Inyecta
X-Forwarded-Host,X-Host,X-Original-URLcon valor aleatorio único; verifica si el valor persiste en respuesta posterior sin la cabecera (cache confirmed); detecta presencia de cache viaX-Cache/Age/CF-Cache-Status
Módulo dedicado (opción 14 del menú) que orquesta las herramientas estándar de AD de Kali. Funciona en dos modos: sin credenciales (solo enumeración) o autenticado (usuario/contraseña para ataques más profundos).
- Enumeración de usuarios con
kerbrute userenuma partir de una wordlist. - Consultas LDAP (
ldapsearch) para listar usuarios, grupos y equipos del dominio. - SMB con NetExec (
nxc smb) para enumeración y password spraying / fuerza bruta. - AS-REP Roasting con
impacket-GetNPUserssobre los usuarios sin pre-autenticación Kerberos. - Kerberoasting con
impacket-GetUserSPNs -requestpara extraer hashes de cuentas de servicio. - Todos los hashes y credenciales obtenidos quedan integrados en los reportes (sección Active Directory).
Herramientas recomendadas:
kerbrute,ldap-utils,netexec/nxceimpacket-scripts.
- Descubrimiento de endpoints (
/api,/swagger,/graphql,/actuator, etc.) con fuzzing recursivo multihilo y parsing de OpenAPI (reporta documentación Swagger expuesta como API9) - IDOR / BOLA (API1) – Modificación de IDs numéricos, UUID y parámetros, con sonda de control que descarta endpoints que devuelven el mismo shell para cualquier id (anti falso positivo)
- JWT (API2) – Detección en cabeceras, cookies de sesión, cuerpo de respuesta y endpoints descubiertos;
alg:nonebypass activo, RS256→HS256 key confusion,kidpath traversal/SQLi, brute force de secreto HMAC con wordlist, claims de privilegio, token caducado aceptado - Rate Limiting (API4) – 429, soft-block por latencia progresiva, captcha, ban por IP (403 repetido)
- Auth Bypass (API5) – Cabeceras
X-Original-URL/X-Rewrite-URLapuntando al path real del endpoint,X-Forwarded-For, etc., con baseline que ignora páginas de login genéricas - Mass Assignment (API6) – Inyección de
is_admin,role,privilegecon verificación de persistencia vía re-GET del objeto - Verbose Errors (API7) – Detección de stack traces y rutas internas
- CORS / GraphQL (API8) – Introspección habilitada, enumeración de users
- Todos los hallazgos de API se integran en
FINDINGSy aparecen en los reportes HTML/Markdown/TXT y en el resumen final
- Enumeración de usuarios – Desde APIs (
/api/users, etc.) y formularios diferenciales - Fuerza bruta de contraseñas – Soporta POST forms y Basic Auth
- Integración con
hydra(-t 4 -I -upara fiabilidad y deduplicación) - Fallback CSRF-aware al método interno con
requests.Session(mantiene cookies y hidden fields) - Autodetección del mensaje de error de login – Envía credenciales imposibles, extrae frases candidatas del HTML y las propone para confirmar
- Heurística estricta (≥2 señales positivas) cuando no hay mensaje de error confirmado, para evitar falsos positivos
- Wordlists personalizables, soporta SecLists
- Menú interactivo con autocompletado de rutas (Tab) en Kali
- Fases visualmente separadas con cabeceras
[INFO] ======= ... ======= - Tablas box-drawing unificadas con anchos dinámicos y colores por severidad/status
- Barras de progreso para spidering, fuzzing y bruteforce (tqdm)
- Manejo robusto de Ctrl+C – Cualquier fase se interrumpe limpiamente, guardando hallazgos parciales
| Requisito | Versión | Requerido |
|---|---|---|
| Python | 3.8+ | ✅ Sí |
| pip | Última | ✅ Sí |
| nmap | Última | ❌ Opcional (auto-instalable, requerido para escaneo de puertos) |
| nuclei | 3.x | ❌ Opcional (auto-instalable) |
| ffuf | Última | ❌ Opcional (mejora el fuzzing) |
| hydra | Última | ❌ Opcional (mejora el bruteforce) |
| whatweb | Última | ❌ Opcional (mejora fingerprinting) |
| wpscan | Última | ❌ Opcional (enumeración y ataques WordPress) |
| kerbrute, ldap-utils, netexec/nxc, impacket-scripts | Última | ❌ Opcional (módulo de Active Directory) |
| SecLists | Última | ❌ Opcional (wordlists) |
- SO: Kali Linux (recomendado) o cualquier Debian/Ubuntu con SecLists instalado
- RAM: 512 MB mínimo, 2 GB recomendado
- Almacenamiento: ~500 MB para dependencias y wordlists
- Red: Conexión al objetivo (interna o internet)
git clone https://github.com/afsh4ck/WSTG-Scan.git
cd WSTG-Scan
# Crear entorno virtual (recomendado)
python3 -m venv venv
source venv/bin/activate
# Dependencias Python
pip install -r requirements.txt
# Ejecutar
python3 wstg-scan.py# Tras los pasos de la instalación rápida:
sudo apt update
sudo apt install -y nmap ffuf hydra whatweb seclists wpscan
# Nuclei: usa los binarios oficiales (más recientes que apt)
GO111MODULE=on go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# O bien:
sudo apt install -y nuclei
nuclei -update-templatesEl script ofrecerá instalar Nuclei, WhatWeb, SecLists y WPScan automáticamente vía
aptsi no los encuentra.
python3 wstg-scan.pySe pedirá la URL objetivo y se mostrará el menú principal.
python3 wstg-scan.py --url https://example.com --output report.html --threads 10 --timeout 15| Argumento | Descripción |
|---|---|
--url, -u |
URL objetivo. Repetible y admite varias separadas por comas (-u a.com,b.com -u c.com) |
--list, -L |
Fichero con una URL por línea (admite # comentarios). Repetible |
--batch |
No interactivo: pentest completo en cada objetivo y un reporte por objetivo. Requiere -u/-L |
--output, -o |
Ruta base del reporte (genera TXT/JSON/HTML) |
--threads, -t |
Número de hilos (default: 5) |
--timeout |
Timeout por request en segundos (default: 10) |
--delay, -d |
Delay entre requests para evasión, aplicado a TODAS las peticiones de la sesión (default: 0) |
--insecure, -k |
Desactiva la verificación TLS (uso en labs / certificados auto-firmados) |
--no-color |
Desactiva colores ANSI |
--version, -V |
Versión del scanner |
# Interactivo: la opción que elijas se ejecuta en TODOS los objetivos, con estado por objetivo
python3 wstg-scan.py -u https://a.com -u https://b.com
python3 wstg-scan.py -L targets.txt
# Batch no interactivo: pentest completo por objetivo + un reporte por objetivo + resumen global
python3 wstg-scan.py -L targets.txt --batch
# Sin argumentos: el script pregunta si quieres una URL única o una lista
python3 wstg-scan.py- Sin
-u/-L, al arrancar se ofrece elegir: 1) URL única o 2) Lista (varias URLs separadas por coma/espacio, o ruta a un fichero), con opción de batch. - Las fuentes
-u(repetible/coma) y-L(ficheros) se combinan y deduplican. - Cada objetivo mantiene su propio
SCAN_DATA/FINDINGS; los reportes se guardan enreports/<host>/. - En batch, el módulo Active Directory se omite (no interactivo); el resto del pentest se ejecuta completo.
python3 wstg-scan.py
# Menú → 1. Configurar autenticación (login)
# (Opcional) User-Agent personalizado
# Modo credenciales: URL de login + usuario o email + contraseña
# o Modo manual: pega cookie/token de sesión y cabeceras
# Se valida la sesión; las siguientes pruebas usarán la sesión autenticadaSPA / OAuth2 (SSO): si el login se renderiza en JavaScript (Angular/Vue/React) o usa OAuth2/PKCE, el tool intentará automáticamente el login headless con Playwright. Si Playwright no está instalado, se ofrecerá instalarlo. Como alternativa usa el modo manual: inicia sesión en el navegador, copia la cookie completa y pégala en la opción 1.
_ __ __ _____
| | / /_____ / /_ ____ _/ ___/ _____ ____ _ ____
| | /| / // ___// __// __ `/\__ \ / ___// __ `// __ \
| |/ |/ /(__ )/ /_ / /_/ /___/ // /__ / /_/ // / / /
|__/|__//____/ \__/ \__, //____/ \___/ \__,_//_/ /_/
/____/
OWASP Web Security Testing Scanner
developed by @afsh4ck
====================================================
WSTG SCANNER v1.4.0 [Sin autenticación]
====================================================
1. Configurar autenticación (login / headless SPA / OAuth2)
2. Información general y enumeración
3. Escaneo de puertos con Nmap (-sV + NSE dirigido)
4. Análisis de vulnerabilidades con Nuclei
5. Fuzzing de subdominios (vhost) con ffuf
6. Fuzzing de directorios (usa ffuf si está instalado)
7. Spidering / Mapeo completo del sitio
8. Análisis de código fuente (credenciales/secretos en HTML y JS)
9. Pruebas de inyección (SQLi, XSS, Path Traversal, Command Injection)
10. Pruebas avanzadas (SSRF / SSTI / XXE / CRLF / Smuggling / Cache)
11. Pruebas de API (descubrimiento, IDOR, mass assignment, JWT, Rate limit)
12. Enumeración de usuarios/emails y fuerza bruta de contraseñas
13. Enumeración y ataques WordPress (WPScan)
14. Pentesting Active Directory (Kerbrute/LDAP/NXC)
15. PENTESTING COMPLETO (ejecuta todas las pruebas anteriores)
(tras escanear aparecen)
16. Mostrar resumen en Markdown
17. Mostrar tablas de resultados
(siempre visible)
18. Salir
====================================================
Selecciona una opción:
Cómo leer el menú:
- Opciones 2–14 ejecutan cada fase de forma independiente. Puedes lanzarlas en cualquier orden; los resultados se acumulan en la misma sesión.
- Opción 1 configura el login una sola vez: Basic Auth, formulario HTML, login headless Playwright (SPA/OAuth2) o sesión manual (cookie/token).
- Opción 10 — Pruebas avanzadas: SSRF (parámetros URL + cabeceras + metadatos cloud), SSTI (Jinja2/Twig/FreeMarker/ERB), XXE, CRLF injection, HTTP Request Smuggling (via smuggler.py o prueba manual CL.TE) y Cache Poisoning.
- Opción 15 — Pentesting completo: encadena automáticamente información → Nmap → Nuclei → vhost → directorios → spidering → código fuente → inyección → pruebas avanzadas → API → bruteforce → WordPress → Active Directory (opcional). Al terminar muestra todas las tablas y ofrece guardar el reporte.
- Opciones 16 y 17 solo aparecen en el menú una vez que hay datos de algún escaneo. Sirven para revisar resultados sin volver a escanear: la 16 imprime el resumen en Markdown (listo para pegar en GitBook/GitHub) y la 17 reimprime las tablas visuales.
Los reportes se generan automáticamente en reports/<host>/<host>.{txt,json,html,md} con cuatro formatos:
| Formato | Contenido |
|---|---|
*.txt |
Resumen plano + secciones por categoría (general, vhost, spider, análisis de código fuente, API, directorios, credenciales, hallazgos, Nuclei) |
*.json |
Datos serializados completos (ideal para integrar con otras herramientas) |
*.html |
Dashboard SaaS en un único archivo: tema claro/oscuro, barra lateral colapsable, buscador de tablas y exportación a PDF |
*.md |
Resumen completo en Markdown estándar — copia/pega directo en GitBook, GitHub u Obsidian |
El reporte HTML es un dashboard interactivo tipo Saas profesional:
- 🎨 Tema claro/oscuro con detección automática del sistema y conmutador persistente.
- 🧭 Barra lateral colapsable con navegación e indicador de la sección activa al hacer scroll.
- 🔎 Buscador en vivo que filtra todas las tablas (host, puerto, CVE, hash…).
- 📊 Resumen visual con tarjetas-KPI (enlazadas a su sección) y un medidor de riesgo por severidad.
- 🖨️ Exportación a PDF optimizada (paleta clara, márgenes y sin cortes entre páginas).
- 🧩 Solo se muestran las secciones con datos. Las disponibles son: Resumen, Información general, Nmap y NSE, Hallazgos, Nuclei, API, VHosts, Directorios, Superficie expuesta, WordPress, Spidering, Código fuente, Active Directory, Credenciales y un volcado JSON completo.
Edita las constantes en wstg-scan.py:
SECLISTS_SMALL = "/usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt"
SECLISTS_MEDIUM = "/usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt"
SECLISTS_PASSWORDS = "/usr/share/seclists/Passwords/xato-net-10-million-passwords-10000.txt"DEFAULT_TIMEOUT = 10 # segundos por request
MAX_REDIRECTS = 10 # redirecciones máximas seguidas
THREADS = 5 # hilos concurrentes
REQUEST_DELAY = 0.0 # delay entre requestsexport HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080
python3 wstg-scan.pypip install -r requirements.txtsudo apt install -y ffufEs ruido del backend OAST. El script filtra los Could not unmarshal interaction data. Para desactivar Interactsh completamente, edita la llamada a Nuclei y añade -ni.
Hydra no maneja CSRF tokens ni sesiones; el script detectará los usuarios pendientes y caerá al método interno (CSRF-aware con requests.Session). Si aun así no las encuentra, comprueba account lockout o rate limiting en el servidor.
Si ves Exceeded N redirects, el target tiene cadenas de redirección largas. Sube MAX_REDIRECTS en el script.
- OWASP WSTG – Guía oficial
- OWASP API Security Top 10
- Nuclei Templates
- ffuf – Web fuzzer
- hydra – Fuerza bruta
- SecLists – Listas para pentesting
¡Las contribuciones son bienvenidas!
- Fork el repositorio
- Crea una rama (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add AmazingFeature') - Push (
git push origin feature/AmazingFeature) - Abre un Pull Request
- Imagen Docker oficial
- Reportes en PDF
- Tests automatizados (pytest)
- Soporte WebSocket / Server-Sent Events
- Plugins de detección de WAF
- Interfaz gráfica (TUI con Textual)
Este proyecto está bajo la licencia MIT. Ver LICENSE para detalles.
afsh4ck – Offensive Security Engineer | Pentester
IMPORTANTE: Esta herramienta solo debe usarse en sistemas donde tienes permiso explícito para realizar pruebas de seguridad.
- ❌ El uso no autorizado es ILEGAL
- ❌ El autor NO se hace responsable del mal uso
⚠️ Respeta leyes locales e internacionales- ✅ Siempre obtén consentimiento escrito antes de testar
"This tool is for authorized security testing only.
Unauthorized access to computer systems is illegal."
⭐ Si te resulta útil, ¡dale una estrella! ⭐
- OWASP por la guía WSTG y el API Security Top 10
- ProjectDiscovery por Nuclei
- Daniel Miessler por SecLists
- van Hauser por Hydra
