Desarrollo de aplicación en Python para análisis automático de vulnerabilidades en sitios web. Almacena el resultado en base de datos para su consulta posterior. Guarda los sitios web a analizar y analiza varios vectores de ataque: SQLi, XSS, LFI, SSRF, Open Redirect.
- WAF Pentesting – Herramienta de auditoría y generación de informes.
- Descarga del código fuente completo en Python.
- SQL de creación de las tablas necesarias en MySQL/MariaDB.
- Aplicación en funcionamiento (modo interactivo GUI gráfico).
- Aplicación en funcionamiento (modo CLI línea de comandos).
WAF Pentesting – Herramienta de auditoría y generación de informes
Esta aplicación es una herramienta de pentesting orientada a evaluar la eficacia de protecciones (WAF, CDN, reglas de aplicación) y detectar vulnerabilidades web comunes. Ofrece interfaz gráfica (Tkinter) y modo consola. Ejecuta una batería de pruebas automatizadas (SQLi, XSS, LFI, SSRF, Open Redirect, etc.), captura evidencias, correlaciona técnicas MITRE y genera informes ejecutivos y técnicos en HTML (con posibilidad de exportar a PDF).
Características principales
- Interfaz GUI (Tk/Ttk) con control en tiempo real y logs de fases por prueba.
- Modo consola para ejecuciones no interactivas o automatizadas.
- Conjunto de pruebas: Inyección SQL, XSS, Path Traversal (LFI), Command Injection, Buffer Overflow (simulado), Open Redirect, SSRF, cabeceras de seguridad.
- Persistencia opcional en base de datos (MySQL) con esquema gestionado desde
database/gestor_base_datos.py. - Generación de informes: HTML (plantillas Jinja-like) y opción de exportar a PDF vía
wkhtmltopdforeportlab. - Conversión de recomendaciones ricas (HTML) a texto plano y botones para copiar/guardar detalles de vulnerabilidades.
- WebView (pywebview) opcional para vista alta fidelidad del informe.
Interfaz y descripción de controles
Ventana principal
- Selección de pruebas: Checkbox por vector (SQLi, XSS, etc.). Tooltips explicativos para cada vector.
- Botón
INICIAR PENTEST: Lanza la ejecución completa en un hilo de fondo, captura stdout de cada prueba y añade logs por fase en la vista en tiempo real. Persiste ejecución / resultados / vulnerabilidades / informe en BD (si está configurada). - Botones de control: Pausa/Stop (según configuración).
Panel de Resultados
- Resultado (Vista): Renderizado HTML (tkhtmlview / tkinterweb si están instalados). Si no hay renderizador, ofrece abrir en navegador o instalar dependencias.
- Resultado (HTML): Código fuente HTML del informe (editable / exportable).
- Resultado (Texto): Versión plana y formateada del informe. Hemos implementado un formateador que limpia índices, condensa títulos (ej.: «📊 Resumen Ejecutivo para Equipo Directivo»), normaliza métricas y estructura recomendaciones para legibilidad.
- Copiar detalle: Copia el detalle técnico de la vulnerabilidad al portapapeles.
- Guardar detalle: Exporta el detalle técnico a .txt.
- Abrir en WebView: Si
pywebviewestá instalado, abre una ventana con renderizado más fiel (fallback: navegador).
Qué hace cada prueba (resumen técnico)
Los tests implementados se encuentran en pentesting/pruebas/. Para cada prueba se siguen típicamente las fases: Information Gathering → Ejecución/Explotación → Validación de Efecto → Recolección de Evidencia → Reporte.
- inyeccion_sql.py (SQLi): Prueba de inyección en parámetros de consulta, busca errores, boolean-based y union-based (simulado). Fases: fingerprint de DB, payloads de prueba, verificación de exfiltración o error, captura de payload/evidencia.
- cross_site_scripting.py (XSS): Inyección de scripts en entradas; evalúa persistente/reflectado; verifica ejecución en el DOM y recolección de evidencia.
- path_traversal.py (LFI): Prueba de travesía de rutas, intentos de lectura de archivos sensibles y validación de contenido.
- inyeccion_comandos.py: Evaluación de ejecución de comandos del sistema (sandboxed o con simulación), captura de salida y detección de posibles inyecciones.
- buffer_overflow.py: Prueba demostrativa / simulada de condiciones de desborde para apps nativas (principalmente demostrativa en lugar de explotación real).
- headers_checks.py: Verifica presencia de cabeceras de seguridad (CSP, HSTS, X-Frame-Options, X-Content-Type-Options, etc.) y reporta hallazgos.
- open_redirect.py: Detecta redirecciones abiertas y valida parámetros de destino.
- ssrf.py: Pruebas sobre redirecciones/solicitudes servidor-side a URLs controladas y verificación de respuesta y filtrado.
Resultados y Vulnerabilidades
- Resultado: Objeto que contiene nombre del test, payload, tiempo de respuesta, estado, y evidencia breve.
- Vulnerabilidad: Registro con tipo (SQLi, XSS…), severidad (ALTA/MEDIA/BAJA), descripción, evidencia detallada, recomendaciones técnicas (HTML + texto plano) y posible mapeo MITRE ATT&CK.
- Informes: Generador produce dos secciones principales — ejecutivo y técnico — luego combinadas en un reporte completo. Títulos condensados para legibilidad.
Configuración y personalización
- Archivos de configuración:
- Opciones en tiempo de ejecución: elegir pruebas, verificar SSL (config), encabezados por defecto, timeouts, y duraciones simuladas/reportes.
- Integraciones externas: MySQL para persistencia,
wkhtmltopdforeportlabpara exportar PDF,pywebviewpara WebView integrado.
Descarga del código fuente completo en Python
A continuación, mostramos enlace a la descarga del código fuente de la aplicación de Pentesting profesional en Python:
SQL de creación de las tablas necesarias en MySQL/MariaDB
El SQL de creación de las tablas necesarias en MySQL/MariaDB es:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
CREATE TABLE clientes ( id_cliente int(11) NOT NULL AUTO_INCREMENT, nombre_cliente varchar(255) NOT NULL, url_objetivo varchar(500) NOT NULL, descripcion text DEFAULT NULL, contacto_nombre varchar(255) DEFAULT NULL, contacto_email varchar(255) DEFAULT NULL, contacto_telefono varchar(50) DEFAULT NULL, fecha_creacion timestamp NOT NULL DEFAULT current_timestamp(), fecha_actualizacion timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), activo tinyint(1) DEFAULT 1, PRIMARY KEY (id_cliente), UNIQUE KEY unique_url (url_objetivo), KEY idx_clientes_activo (activo) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE configuracion_aplicacion ( id_config int(11) NOT NULL AUTO_INCREMENT, clave varchar(100) NOT NULL, valor text DEFAULT NULL, descripcion text DEFAULT NULL, fecha_actualizacion timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (id_config), UNIQUE KEY clave (clave) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE configuraciones_pentesting ( id_configuracion int(11) NOT NULL AUTO_INCREMENT, id_cliente int(11) NOT NULL, nombre_configuracion varchar(255) NOT NULL, timeout_segundos int(11) DEFAULT 10, pausa_intra_prueba decimal(5,2) DEFAULT 0.50, pausa_inter_pruebas decimal(5,2) DEFAULT 2.00, pausa_post_destructivo decimal(5,2) DEFAULT 5.00, pruebas_seleccionadas longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(pruebas_seleccionadas)), user_agent varchar(500) DEFAULT NULL, fecha_creacion timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id_configuracion), KEY id_cliente (id_cliente), CONSTRAINT configuraciones_pentesting_ibfk_1 FOREIGN KEY (id_cliente) REFERENCES clientes (id_cliente) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE ejecuciones_pentesting ( id_ejecucion int(11) NOT NULL AUTO_INCREMENT, id_cliente int(11) NOT NULL, id_configuracion int(11) NOT NULL, nombre_ejecucion varchar(255) NOT NULL, fecha_inicio timestamp NOT NULL DEFAULT current_timestamp(), fecha_fin timestamp NULL DEFAULT NULL, duracion_total_segundos decimal(10,2) DEFAULT NULL, total_pruebas int(11) DEFAULT 0, total_vulnerabilidades int(11) DEFAULT 0, efectividad_waf decimal(5,2) DEFAULT NULL, estado enum('pendiente','ejecutando','completado','error','cancelado') DEFAULT 'pendiente', pentester_nombre varchar(255) DEFAULT NULL, pentester_empresa varchar(255) DEFAULT NULL, pentester_email varchar(255) DEFAULT NULL, PRIMARY KEY (id_ejecucion), KEY id_cliente (id_cliente), KEY id_configuracion (id_configuracion), KEY idx_ejecuciones_fecha (fecha_inicio), CONSTRAINT ejecuciones_pentesting_ibfk_1 FOREIGN KEY (id_cliente) REFERENCES clientes (id_cliente) ON DELETE CASCADE, CONSTRAINT ejecuciones_pentesting_ibfk_2 FOREIGN KEY (id_configuracion) REFERENCES configuraciones_pentesting (id_configuracion) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE informacion_objetivo ( id_info int(11) NOT NULL AUTO_INCREMENT, id_ejecucion int(11) NOT NULL, ip_objetivo varchar(50) DEFAULT NULL, servidor_web varchar(100) DEFAULT NULL, tecnologias varchar(255) DEFAULT NULL, cms_detectado varchar(100) DEFAULT NULL, whois_info text DEFAULT NULL, puertos_abiertos varchar(255) DEFAULT NULL, fecha_registro timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id_info), KEY id_ejecucion (id_ejecucion), CONSTRAINT informacion_objetivo_ibfk_1 FOREIGN KEY (id_ejecucion) REFERENCES ejecuciones_pentesting (id_ejecucion) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE informes ( id_informe int(11) NOT NULL AUTO_INCREMENT, id_ejecucion int(11) NOT NULL, tipo_informe enum('completo','ejecutivo','tecnico') NOT NULL, nombre_archivo varchar(500) DEFAULT NULL, contenido_html longtext DEFAULT NULL, fecha_generacion timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id_informe), KEY id_ejecucion (id_ejecucion), CONSTRAINT informes_ibfk_1 FOREIGN KEY (id_ejecucion) REFERENCES ejecuciones_pentesting (id_ejecucion) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE resultados_pruebas ( id_resultado int(11) NOT NULL AUTO_INCREMENT, id_ejecucion int(11) NOT NULL, tipo_ataque varchar(100) NOT NULL, nombre_prueba varchar(100) NOT NULL, fase_prueba varchar(100) DEFAULT NULL, payload text DEFAULT NULL, exito tinyint(1) DEFAULT 0, severidad enum('ALTA','MEDIA','BAJA') DEFAULT 'MEDIA', codigo_estado_http int(11) DEFAULT NULL, tiempo_respuesta decimal(10,4) DEFAULT NULL, longitud_respuesta int(11) DEFAULT NULL, evidencia text DEFAULT NULL, tecnica_mitre varchar(50) DEFAULT NULL, descripcion_mitre text DEFAULT NULL, timestamp_prueba timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id_resultado), KEY idx_ejecucion_tipo (id_ejecucion,tipo_ataque), KEY idx_exito_severidad (exito,severidad), KEY idx_resultados_timestamp (timestamp_prueba), CONSTRAINT resultados_pruebas_ibfk_1 FOREIGN KEY (id_ejecucion) REFERENCES ejecuciones_pentesting (id_ejecucion) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE vulnerabilidades ( id_vulnerabilidad int(11) NOT NULL AUTO_INCREMENT, id_ejecucion int(11) NOT NULL, id_resultado int(11) NOT NULL, tipo_vulnerabilidad varchar(100) NOT NULL, descripcion text DEFAULT NULL, severidad enum('ALTA','MEDIA','BAJA') NOT NULL, payload_utilizado text DEFAULT NULL, evidencia_detallada text DEFAULT NULL, recomendaciones text DEFAULT NULL, tecnica_mitre varchar(50) DEFAULT NULL, fecha_deteccion timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id_vulnerabilidad), KEY id_ejecucion (id_ejecucion), KEY id_resultado (id_resultado), KEY idx_vulnerabilidades_severidad (severidad), CONSTRAINT vulnerabilidades_ibfk_1 FOREIGN KEY (id_ejecucion) REFERENCES ejecuciones_pentesting (id_ejecucion) ON DELETE CASCADE, CONSTRAINT vulnerabilidades_ibfk_2 FOREIGN KEY (id_resultado) REFERENCES resultados_pruebas (id_resultado) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
Aplicación en funcionamiento (modo interactivo GUI gráfico)
Descargaremos el código completo de la aplicación desde:
Deberemos tener Python instalado en el equipo. Esta aplicación requiere una serie de paquetes Python, podremos instalarlos, o bien desde la carpeta donde se encuentra el fichero requeriments.txt, con el comando:
|
1 |
pip install -r requirements.txt |
O bien, instalarlos todos con el comando:
|
1 |
pip install mysql-connector-python==8.0.33 requests==2.31.0 pdfkit==1.0.0 Pillow==10.0.0 Jinja2==3.1.2 python-dateutil==2.8.2 |
La aplicación usa la herramienta externa wkhtmltopdf (requerido por pdfkit para exportar a PDF), que podremos instalar descargando el instalador desde:
En la carpeta del código, donde se encuentra el fichero main.py, ejecutaremos:
|
1 |
python -u main.py |
En primer lugar, realizaremos la configuración de la aplicación, desde la pestaña «Configuración Global», donde indicaremos los datos del servidor de base de datos MySQL/MariaDB al que nos conectaremos, así como los datos del auditor (nombre, empresa) y si queremos verificar los certificados TLS/SSL de los sitios web a analizar:

Desde «Sitios a analizar», pulsaremos en «Nuevo Sitio» para añadir una nueva URL a analizar:

Introduciremos los datos del sitio web a analizar:

Seleccionaremos el sitio web añadido, marcaremos los vectores de ataque a analizar:
- Information Gathering.
- SQL Injection.
- Cross-Site Scripting (XSS).
- Path Transversal.
- Command Injection.
- Buffer Overflow.
- Cabeceras de Seguridead (HSTS/CSP).
- Open Redirect.
- SSRF.
Elegiremos las opciones de tiempos y delays y pulsaremos en «Ir a Ejecución» (o doble clic sobre el sitio web):

Pulsaremos en «INICIAR PENTEST»:

La aplicación iniciará el análisis de cada vector de ataque marcado para el sitio web, mostrando cada fase:

Una vez concluido, mostrará el siguiente mensaje:

Nos llevará a la pestaña de resultados, donde podremos ver el resumen, así como el reporte completo. Podremos guardarlo en HTML, PDF o texto plano:

Pulsando en «Guardar HTML», nos generará un fichero HTML con el el resultado completo del pentest:

Desde la pestaña «Detallado», podremos consultar todos los análisis realizados y el resultado (bloqueado o vulnerable). Si ha habido algún vector de ataque al que el sitio web pudiera ser vulnerable, lo mostrará con fondo rojo, haciendo doble clic sobre él nos mostrará la vulnerabilidad en detalle:

Desde la pestaña «Vulnerabilidades», podremos consultar el detalle completo de la vulnerabilidad detectada: tipo, severidad, descripción, payload utilizado, evidencia técnica y recomendaciones de mitigación:

En la pestaña «Histórico» podremos consultar todos los análisis realizados:

Con todos sus datos (haciendo doble clic sobre uno de ellos), nos llevará a la pestaña de «Resultado»:

Aplicación en funcionamiento (modo CLI línea de comandos)
Desde la línea de comandos, en la carpeta donde se encuentre el fichero main_cli.py del código fuente Python de la aplicación, ejecutaremos el siguiente comando para analizar el sitio «https://ajpdsoft.com» con todas las pruebas (vectores de ataque):
|
1 |
python main_cli.py --url https://ajpdsoft.com --pruebas all |

Podremos listar los sitios web dados de alta desde la línea de comandos, servirá para comprobar la conexión a la base de datos, con:
|
1 |
python main_cli.py --listar-clientes |
