GhostAcademy
GhostAcademy
Wapiti vs Nikto — Fuzzing Web
Manual Completo
Wapiti vs Nikto
Fuzzing Web vs Fingerprinting

Nikto detecta vulnerabilidades buscando patrones conocidos (versiones, cabeceras, archivos). Wapiti inyecta payloads reales en parámetros y formularios para descubrir vulnerabilidades que solo existen en ejecución. Son herramientas complementarias, no alternativas.

⚠ Disclaimer LegalSolo usar contra sistemas propios o con autorización expresa. GhostAcademy promueve la seguridad ética y responsable.

La Diferencia Fundamental

🔮 WAPITI — Fuzzing activo
Inyecta payloads en parámetros reales
GET /search?q=' OR 1=1--
GET /page?id=../../../etc/passwd
POST /comment body=<script>alert(1)</script>
GET /cmd?exec=; cat /etc/shadow
Descubre vulns que solo existen en runtime
🔍 NIKTO — Fingerprinting pasivo
Busca patrones y versiones conocidas
GET /phpMyAdmin/ → Expuesto
Server: Apache/2.2.8 → CVE-2011-3192
GET /.git/config → Repositorio expuesto
X-Powered-By: PHP/5.4 → Desactualizado
Detecta vulns conocidas por firma estática

¿Qué encuentra cada uno?

💉
Wapiti exclusivo
SQL Injection
Inyecta payloads SQLi en cada parámetro GET/POST y analiza la respuesta. Nikto solo detectaría SQL si está en una firma conocida.
Solo Wapiti
🔥
Wapiti exclusivo
XSS Reflexivo y DOM
Prueba payloads XSS en cada campo de formulario, parámetro de URL y cabecera. Nikto detecta XSS solo si hay una firma documentada.
Solo Wapiti
📂
Wapiti exclusivo
LFI / Path Traversal
Intenta leer /etc/passwd, wp-config.php y otros archivos sensibles mediante traversal en parámetros de fichero.
Solo Wapiti
💥
Wapiti exclusivo
Command Injection
Inyecta metacaracteres de shell (;, |, &&) en parámetros para detectar ejecución de comandos no sanitizada.
Solo Wapiti
📦
Nikto exclusivo
Versiones y CVEs
Detecta versiones de servidor, CMS y frameworks desactualizados mapeando con CVEs conocidos de su base de datos.
Solo Nikto
🗂
Nikto exclusivo
Archivos y Dirs Expuestos
Enumera más de 6,700 archivos potencialmente peligrosos: .git, phpMyAdmin, backup.zip, admin/, etc.
Solo Nikto
🔑
Ambos
Cabeceras HTTP
Detectan cabeceras de seguridad ausentes: CSP, X-Frame-Options, HSTS, X-Content-Type-Options.
Ambos
🍪
Ambos
Cookies Inseguras
Identifican cookies sin flag HttpOnly o Secure y sesiones con configuraciones débiles.
Ambos
Fundamentos — 01
⚖️ Wapiti vs Nikto — Comparativa Completa

Una comparativa técnica y práctica para saber cuándo usar cada herramienta y cómo combinarlas para máxima cobertura.

Característica🔮 Wapiti🔍 Nikto
MetodologíaFuzzing activo — inyecta payloads reales en parámetrosFingerprinting pasivo — base de datos de firmas conocidas
Detección SQLi✓ Prueba payloads realesSolo por firma estática
Detección XSS✓ Inyecta en formulariosSolo versiones conocidas
CVEs del servidorLimitado✓ Base de datos 6700+ firmas
Archivos expuestosMódulo backup/redirect✓ 6700+ archivos conocidos
Requiere autenticación✓ Soporta login forms, cookies, JWTSolo Basic/Digest auth
Crawling de la app✓ Spider + Swagger + GraphQLNo crawlea — solo rutas predefinidas
Formatos de informeHTML, JSON, XML, TXTTXT, HTML, CSV, XML, JSON
VelocidadLenta (fuzzing es costoso)Rápida (solo GET/HEAD)
APIs REST / Swagger✓ Soporte nativo OpenAPINo
Evasión de WAF✓ Delay, User-Agent, cookiesUser-Agent rotación
LenguajePython 3Perl
💡 Estrategia ÓptimaUsar Nikto primero (rápido, sin impacto) para identificar versiones, archivos expuestos y CVEs. Luego Wapiti con sus módulos de fuzzing para descubrir SQLi, XSS, LFI y command injection. Los resultados son complementarios, no redundantes.
Fundamentos — 02
⚙️ Instalación de Ambas Herramientas

Wapiti y Nikto están disponibles en Kali Linux. También pueden instalarse en cualquier distribución Linux moderna. Wapiti requiere Python 3.10+.

🔮 Wapiti — Instalación
# Kali Linux (repos)
sudo apt install wapiti -y

# pip (versión más reciente)
pip3 install wapiti3

# Desde fuente (última versión)
git clone https://github.com/wapiti-scanner/wapiti
cd wapiti && pip3 install -e .

# Docker
docker pull ghcr.io/wapiti-scanner/wapiti

# Verificar
wapiti --version
Wapiti 3.1.8
🔍 Nikto — Instalación
# Kali Linux (ya incluido)
nikto -Version

# apt
sudo apt install nikto -y

# Desde fuente (GitHub)
git clone https://github.com/sullo/nikto
cd nikto && perl nikto.pl -Version

# Docker
docker pull sullo/nikto
docker run sullo/nikto -h target.com

# Actualizar base de datos
nikto -update
BASH — Entorno de laboratorio completo
# Instalar aplicaciones vulnerables para el lab
sudo apt install docker.io docker-compose -y

# DVWA (Damn Vulnerable Web Application)
docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa

# Juice Shop (OWASP)
docker run -d -p 3000:3000 --name juiceshop bkimminich/juice-shop

# WebGoat
docker run -d -p 8088:8080 --name webgoat webgoat/goatandwolf

# Verificar que están corriendo
docker ps
CONTAINER ID   IMAGE                     PORTS                    NAMES
a1b2c3d4       vulnerables/web-dvwa      0.0.0.0:8080->80/tcp     dvwa
e5f6a7b8       bkimminich/juice-shop     0.0.0.0:3000->3000/tcp   juiceshop
c9d0e1f2       webgoat/goatandwolf       0.0.0.0:8088->8080/tcp   webgoat
Wapiti — 01
🔮 Wapiti — Uso Básico

Wapiti primero crawlea la aplicación web (modo araña) y luego inyecta payloads en cada parámetro encontrado. Entender su flujo de trabajo es esencial para configurarlo correctamente.

🔮 Wapiti

Sintaxis y Flags Principales

BASH — Wapiti: flags esenciales
wapiti -u URL [opciones]

## TARGET
-u URL              → URL de inicio del crawling
--scope URL|domain  → alcance del crawling (URL exacta o todo el dominio)

## MÓDULOS
-m sql,xss,blindsql → ejecutar solo estos módulos
--list-modules       → listar todos los módulos disponibles
--skip-crawl         → no crawlear, usar solo la URL dada

## AUTENTICACIÓN
--auth-user USER     → usuario para login form
--auth-password PASS → contraseña para login form
--auth-method post  → método de autenticación
-c cookies.pkl       → usar cookies guardadas

## OUTPUT
-f html              → formato del informe: html, json, xml, txt
-o /tmp/report       → directorio de salida del informe
--color              → output con colores en terminal

## RENDIMIENTO
--max-depth N        → profundidad máxima de crawling
--max-links-per-page N → max links por página
--max-scan-time N    → tiempo máximo de escaneo en segundos
-t N                 → timeout por petición (segundos)

Primer Escaneo

Wapiti — Escaneo básico DVWA
$ wapiti -u http://localhost:8080/dvwa/ --color -f html -o /tmp/wapiti_report [*] Wapiti 3.1.8 (wapiti-scanner.github.io) [*] Starting crawling phase ... Crawled 1/? http://localhost:8080/dvwa/ Crawled 2/? http://localhost:8080/dvwa/login.php Crawled 3/? http://localhost:8080/dvwa/index.php Crawled 15/? http://localhost:8080/dvwa/vulnerabilities/sqli/ [*] Attack phase starting ... [+] Launching module sql [!] SQL Injection vulnerability found at http://localhost:8080/dvwa/vulnerabilities/sqli/ Parameter: id (GET) Payload: 1 AND sleep(5)# [+] Launching module xss [!] XSS Vulnerability found at http://localhost:8080/dvwa/vulnerabilities/xss_r/ [*] Report saved to /tmp/wapiti_report/

Escaneos Frecuentes

BASH — Recetas de escaneo Wapiti
# Escaneo completo con todos los módulos + informe HTML
wapiti -u http://target.com --scope domain -f html -o /tmp/report --color

# Solo SQLi y XSS (más rápido)
wapiti -u http://target.com -m sql,xss,blindsql -f json -o /tmp/report

# Con autenticación en formulario de login
wapiti -u http://target.com --auth-user admin --auth-password password \
  --auth-method post --auth-url http://target.com/login -f html -o /tmp/r

# Con cookies (sesión ya autenticada)
wapiti -u http://target.com -c /tmp/cookies.pkl --color -f html -o /tmp/r

# Limitar tiempo de escaneo (útil en CI/CD)
wapiti -u http://target.com --max-scan-time 1800 -f json -o /tmp/r

# Escaneo de API OpenAPI/Swagger
wapiti -u http://api.target.com --swagger http://api.target.com/swagger.json -f json -o /tmp/r

# Con proxy (para ver tráfico en Burp Suite)
wapiti -u http://target.com --proxy http://127.0.0.1:8080 -f html -o /tmp/r
Wapiti — 02
🧩 Módulos de Ataque

Wapiti 3.x incluye más de 30 módulos de ataque. Cada módulo es un conjunto de payloads especializados en una categoría de vulnerabilidad.

🔮 Wapiti
BASH — Ver todos los módulos disponibles
wapiti --list-modules

Módulos Web (inyección de payloads):
  sql         → SQL Injection (error-based)
  blindsql    → Blind SQL Injection (time-based)
  xss         → Cross-Site Scripting (reflejado y almacenado)
  ssti        → Server-Side Template Injection
  ssrf        → Server-Side Request Forgery
  redirect    → Open Redirect
  crlf        → CRLF Injection (HTTP header injection)
  xxe         → XML External Entity Injection
  exec        → Command Execution / OS Injection
  shellshock  → Shellshock (CVE-2014-6271)
  file        → File Disclosure (LFI/Path Traversal)
  cms         → CMS Detection (WordPress, Joomla, Drupal)

Módulos de Información:
  backup      → Archivos de backup expuestos (.bak, .old, ~)
  brute_login → Fuerza bruta en formularios de login
  csrf        → Cross-Site Request Forgery
  cookieflags → Flags de seguridad en cookies
  headers     → Cabeceras HTTP de seguridad ausentes
  http_headers → Información en cabeceras HTTP
  htaccess    → Archivos .htaccess accesibles
  methods     → Métodos HTTP permitidos (PUT, DELETE...)
  wapp        → Detección de tecnologías (Wappalyzer)
  timesql     → SQL injection por tiempo de respuesta

Módulos por Prioridad

💉
Crítico
sql + blindsql
Inyección SQL error-based y time-based. Prueba en cada parámetro GET, POST, cabeceras y cookies. El módulo más valioso.
-m sql,blindsql
🔥
Crítico
xss
XSS reflexivo y almacenado en formularios, parámetros de URL, cabeceras HTTP reflejadas en la respuesta.
-m xss
💥
Crítico
exec
Command injection. Inyecta metacaracteres de shell. Detecta ejecución de comandos en parámetros no sanitizados.
-m exec
📂
Alto
file
Local File Inclusion y Path Traversal. Intenta acceder a /etc/passwd, /etc/shadow y archivos de configuración.
-m file
🌐
Alto
ssrf
Server-Side Request Forgery. Detecta parámetros que hacen peticiones a URLs controladas por el atacante.
-m ssrf
📝
Alto
ssti
Server-Side Template Injection en Jinja2, Twig, Freemarker, Smarty. Puede llevar a RCE.
-m ssti
🗄
Medio
backup
Busca archivos de backup: config.php.bak, database.sql, .env.old, sitio.tar.gz, etc.
-m backup
🔒
Medio
headers + cookieflags
Cabeceras de seguridad ausentes (CSP, HSTS, X-Frame-Options) y flags de cookies (HttpOnly, Secure, SameSite).
-m headers,cookieflags
Wapiti — 03
💉 SQLi Fuzzing con Wapiti

El módulo SQL de Wapiti inyecta payloads de inyección SQL en cada parámetro detectado durante el crawling. Analiza la respuesta para detectar errores o diferencias de tiempo.

🔮 Wapiti

Cómo Funciona el Módulo SQL

1
Crawling — Descubrir parámetros
Wapiti rastrea la aplicación como un spider. Detecta parámetros GET, POST, cabeceras y cookies. Cada parámetro se convierte en un punto de inyección.
2
Inyección — Probar payloads SQLi
Para cada parámetro, envía payloads como: ' OR 1=1-- ' OR SLEEP(5)-- 1 AND 1=2 ' UNION SELECT NULL-- y analiza la respuesta.
3
Análisis — Detectar diferencias
Compara la respuesta con la petición original. Si hay mensajes de error SQL, diferencia de contenido (boolean-based) o diferencia de tiempo (time-based), reporta la vulnerabilidad.
BASH — Fuzzing SQLi con Wapiti
# Solo módulos SQLi (error + blind time-based)
wapiti -u http://localhost:8080/dvwa/ -m sql,blindsql --color -f html -o /tmp/sqli_report

# Con autenticación para acceder a áreas protegidas
wapiti -u http://localhost:8080/dvwa/ \
  --auth-user admin --auth-password password \
  --auth-method post \
  --auth-url http://localhost:8080/dvwa/login.php \
  -m sql,blindsql --color -f html -o /tmp/sqli_auth_report

# Forzar escaneo de URL específica sin crawling
wapiti -u "http://localhost:8080/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --scope url -m sql,blindsql --color
Wapiti — Output SQLi detectado
[+] Launching module sql [*] Testing http://localhost:8080/dvwa/vulnerabilities/sqli/?id=1 (GET) Parameter: id Payload: 1' Response contains SQL error: You have an error in your SQL syntax... [!] SQL Injection vulnerability found at: http://localhost:8080/dvwa/vulnerabilities/sqli/?id=1 Parameter: id (GET) Payload used: 1' Type: Error-based SQL injection [+] Launching module blindsql [*] Testing parameter: id with time-based payload Payload: 1 AND SLEEP(5)# Response time: 5.03s (normal: 0.02s) → Time-based SQLi confirmed [!] Blind SQL Injection found at: http://localhost:8080/dvwa/vulnerabilities/sqli_blind/?id=1 Parameter: id (GET) Payload: 1 AND SLEEP(5)#

Payloads SQLi que Usa Wapiti

Payloads SQLi — Wapiti internos
# Error-based (detecta mensajes de error SQL en la respuesta)
1'
1''
' OR '1'='1
1' AND 1=CONVERT(int,@@version)--
' UNION SELECT NULL,NULL,NULL--

# Boolean-based (compara respuesta con/sin condición)
1 AND 1=1  # → misma respuesta que sin payload
1 AND 1=2  # → respuesta diferente → SQLi boolean

# Time-based blind (detecta por diferencia de tiempo)
1 AND SLEEP(5)           # MySQL
1; WAITFOR DELAY '0:0:5' # MSSQL
1 AND pg_sleep(5)        # PostgreSQL
1 AND RANDOMBLOB(100000000) # SQLite
Wapiti — 04
🔥 XSS Fuzzing con Wapiti

El módulo XSS de Wapiti inyecta payloads JavaScript en formularios, parámetros de URL y cabeceras HTTP para detectar reflexión sin sanitizar.

🔮 Wapiti
BASH — Fuzzing XSS con Wapiti
# Módulo XSS sobre DVWA
wapiti -u http://localhost:8080/dvwa/ -m xss \
  --auth-user admin --auth-password password \
  --auth-method post --auth-url http://localhost:8080/dvwa/login.php \
  --color -f html -o /tmp/xss_report

# Wapiti también detecta Stored XSS (persiste en la BD)
# El spider lo detecta al releer páginas después de inyectar
Wapiti — XSS detectado
[+] Launching module xss [*] Testing form at /dvwa/vulnerabilities/xss_r/ — field: name Payload: <script>alert('wapiti')</script> Payload reflected in response without encoding! [!] XSS Vulnerability found at: http://localhost:8080/dvwa/vulnerabilities/xss_r/ Method: POST — Parameter: name Payload: <script>alert('wapiti')</script> Type: Reflected XSS [*] Testing form at /dvwa/vulnerabilities/xss_s/ — field: mtxMessage Payload: <img src=x onerror=alert(1)> Payload found in subsequent page request → Stored! [!] Stored XSS Vulnerability found at: http://localhost:8080/dvwa/vulnerabilities/xss_s/ Method: POST — Parameter: mtxMessage Payload: <img src=x onerror=alert(1)> Type: Stored XSS

Payloads XSS que Prueba Wapiti

<script>alert(1)</script> <img src=x onerror=alert(1)> <svg onload=alert(1)> javascript:alert(1) <body onload=alert(1)> "><script>alert(1)</script> '><img src=x onerror=alert(1)> <details open ontoggle=alert(1)> <iframe srcdoc="<script>alert(1)</script>">
Wapiti — 05
📂 LFI y Path Traversal

El módulo file de Wapiti prueba path traversal en parámetros que parecen hacer referencia a archivos. También detecta SSRF y Directory Traversal.

🔮 Wapiti
BASH — LFI Fuzzing con Wapiti
# Módulo file (LFI, path traversal, file disclosure)
wapiti -u http://localhost:8080/dvwa/ -m file,ssrf \
  --auth-user admin --auth-password password \
  --auth-method post --auth-url http://localhost:8080/dvwa/login.php \
  --color -f html -o /tmp/lfi_report
Wapiti — LFI detectado
[+] Launching module file [*] Testing: http://localhost:8080/dvwa/vulnerabilities/fi/?page=include.php Parameter: page (GET) Payload: ../../../etc/passwd Response contains: root:x:0:0:root:/root:/bin/bash [!] Path Traversal / LFI found at: http://localhost:8080/dvwa/vulnerabilities/fi/?page=../../../etc/passwd Parameter: page (GET) File disclosed: /etc/passwd Payload: http://127.0.0.1:80/ Response differs from baseline → SSRF possible [!] SSRF Vulnerability at: page parameter accepts external URLs

Payloads LFI/Traversal de Wapiti

../../../etc/passwd ....//....//etc/passwd %2e%2e%2f%2e%2e%2fetc%2fpasswd ..%252f..%252fetc%252fpasswd ../../../../../../etc/shadow ../../windows/win.ini ../../boot.ini php://filter/convert.base64-encode/resource=index.php
Wapiti — 06
📊 Informes y Output

Wapiti genera informes detallados en múltiples formatos. El HTML es el más legible para presentar hallazgos. El JSON es ideal para integrar con pipelines de CI/CD.

🔮 Wapiti
BASH — Generar informes en múltiples formatos
# HTML (para presentar)
wapiti -u http://target.com -f html -o /tmp/report_html
firefox /tmp/report_html/index.html

# JSON (para pipelines)
wapiti -u http://target.com -f json -o /tmp/report.json
cat /tmp/report.json | python3 -m json.tool | head -50

# Parsear el JSON de Wapiti
python3 -c "
import json
report = json.load(open('/tmp/report.json'))
vulns = report.get('vulnerabilities', {})
for vuln_type, findings in vulns.items():
    for f in findings:
        print(f'[{vuln_type.upper()}] {f[\"path\"]} - Param: {f.get(\"parameter\",\"N/A\")}')
"
[SQL_INJECTION] /dvwa/sqli/ - Param: id
[XSS] /dvwa/xss_r/ - Param: name
[FILE_HANDLING] /dvwa/fi/ - Param: page

# XML (para importar en herramientas como DefectDojo)
wapiti -u http://target.com -f xml -o /tmp/report.xml
Nikto — 01
🔍 Nikto — Uso Básico

Nikto escanea el servidor web comparando lo que encuentra con su base de datos de más de 6,700 problemas conocidos. Rápido, sin autenticación, ideal como primer paso.

🔍 Nikto
BASH — Nikto: flags esenciales
nikto -h TARGET [opciones]

## TARGET
-h HOST         → host o URL objetivo
-p PORT         → puerto (default: 80)
-ssl            → forzar HTTPS

## TUNING (qué categorías escanear)
-Tuning 1       → Interesting File / Seen in logs
-Tuning 2       → Misconfiguration / Default File
-Tuning 3       → Information Disclosure
-Tuning 4       → Injection (XSS/Script/HTML)
-Tuning 6       → Denial of Service
-Tuning 9       → SQL Injection
-Tuning x       → Reverse Tuning (excluir categoría)

## OUTPUT
-o FILE.html    → guardar informe (detecta formato por extensión)
-Format html   → forzar formato: html, csv, txt, json, xml

## OPCIONES
-C all          → escanear todos los CGI dirs
-useragent UA   → User-Agent personalizado
-timeout N      → timeout por petición
-maxtime Ns     → tiempo máximo total de escaneo
-Plugins LISTA  → plugins específicos a usar
Nikto — Escaneo típico contra DVWA
$ nikto -h http://localhost:8080 -p 8080 -C all -o /tmp/nikto_report.html - Nikto v2.1.6 --------------------------------------------------------------------------- + Target IP: 127.0.0.1 + Target Port: 8080 + Start Time: 2024-01-15 14:30:22 + Server: Apache/2.4.38 (Debian) + The anti-clickjacking X-Frame-Options header is not present + The X-XSS-Protection header is not defined + The X-Content-Type-Options header is not set + Cookie PHPSESSID created without the HttpOnly flag + Cookie security created without the secure flag + Apache/2.4.38 appears to be outdated (current is at least Apache/2.4.54) + /phpinfo.php: Output from the phpinfo() function was found + /dvwa/login.php: Default admin password 'password' may be used + /.git/HEAD: Git repository found — may expose source code + /dvwa/setup.php: DVWA setup script accessible + 6544 requests: 0 error(s) and 12 item(s) reported on remote host + End Time: 2024-01-15 14:31:15 (53 seconds)
Nikto — 02
🚩 Nikto — Flags Avanzados

Nikto tiene opciones de tuning, plugins y modos de autenticación que maximizan la cobertura del escaneo según el objetivo.

🔍 Nikto
BASH — Recetas Nikto avanzadas
# Escaneo HTTPS
nikto -h https://target.com -ssl -o /tmp/nikto_ssl.html

# Solo misconfigs y archivos interesantes (rápido)
nikto -h http://target.com -Tuning 1,2,3 -o /tmp/nikto_fast.html

# Con autenticación HTTP Basic
nikto -h http://target.com -id admin:password -o /tmp/nikto_auth.html

# Con cookies (sesión autenticada)
nikto -h http://target.com -Cookies "PHPSESSID=abc123; security=low" -o /tmp/nikto_session.html

# Via proxy (para ver en Burp Suite)
nikto -h http://target.com -useproxy http://127.0.0.1:8080 -o /tmp/nikto_proxy.html

# Escaneo masivo de múltiples hosts
nikto -h hosts.txt -o /tmp/nikto_mass.csv -Format csv

# Tiempo máximo 5 minutos (CI/CD)
nikto -h http://target.com -maxtime 300s -o /tmp/nikto_quick.html

# Evasión básica de IDS — modo de evasión 1 (aleatorizar mayúsculas URL)
nikto -h http://target.com -evasion 1 -o /tmp/nikto_evade.html

# Ver todos los plugins disponibles
nikto -list-plugins
Nikto — 03
📊 Interpretar el Output de Nikto

El output de Nikto tiene un sistema de códigos OSVDB e IDREF que indican la referencia de la vulnerabilidad. Aprender a leerlos es esencial para priorizar hallazgos.

🔍 Nikto
Nikto — Anatomía del output
# Formato de cada hallazgo de Nikto:
+ /phpinfo.php: Output from the phpinfo() function was found.
  ^                ^
  |                Descripción del hallazgo
  Ruta encontrada

  OSVDB-ID: 12184
  ^
  Base de datos de vulnerabilidades (Open Source Vulnerability Database)

# Clasificación por prefijo del mensaje:
+ Server: Apache/2.4.38    → información del servidor (sin + de peligro)
+ X-Frame-Options...       → cabecera de seguridad ausente (bajo riesgo)
+ /admin/ accessible       → directorio/archivo expuesto (medio riesgo)
+ Default password found   → credencial por defecto (alto riesgo)
+ CVE-XXXX-XXXX found      → CVE documentado (crítico)

# Parsear output JSON de Nikto
nikto -h http://target.com -Format json -o /tmp/nikto.json
cat /tmp/nikto.json | python3 -c "
import json,sys
data=json.load(sys.stdin)
for vuln in data.get('vulnerabilities',[]):
    sev = 'HIGH' if 'CVE' in str(vuln) else 'LOW'
    print(f'[{sev}] {vuln[\"url\"]} — {vuln[\"msg\"][:80]}')
"
Laboratorio — 01
🧪 Lab: DVWA Completo

Escaneo completo de DVWA (Damn Vulnerable Web Application) con Wapiti. Encontrar SQLi, XSS, LFI, Command Injection y CSRF en un entorno de laboratorio controlado.

🧪LAB-WEB-01 — DVWA: todos los módulos WapitiMEDIO

DVWA en Docker. Wapiti con autenticación, todos los módulos de fuzzing activos. Objetivo: encontrar al menos SQLi, XSS, LFI y Command Injection.

Setup

BASH — Preparar DVWA
# Levantar DVWA
docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa
# Visitar http://localhost:8080, login admin/password
# Ir a Setup/Reset DB → Create/Reset Database
# Security Level → Low (para que Wapiti detecte todo)

Escaneo Completo con Wapiti

Wapiti — DVWA full scan
$ wapiti -u http://localhost:8080/dvwa/ \ --auth-user admin --auth-password password \ --auth-method post \ --auth-url http://localhost:8080/dvwa/login.php \ -m sql,blindsql,xss,exec,file,csrf,cookieflags,headers,backup,redirect \ --color -f html -o /tmp/dvwa_full_report [*] Crawling http://localhost:8080/dvwa/ ... Found 24 URLs and 8 forms [+] Module: sql [!] SQL Injection — /dvwa/vulnerabilities/sqli/?id=1 — param: id [!] Blind SQL — /dvwa/vulnerabilities/sqli_blind/?id=1 — param: id [+] Module: xss [!] Reflected XSS — /dvwa/vulnerabilities/xss_r/ — param: name [!] Stored XSS — /dvwa/vulnerabilities/xss_s/ — param: mtxMessage [!] DOM XSS — /dvwa/vulnerabilities/xss_d/ — param: default [+] Module: exec [!] Command Injection — /dvwa/vulnerabilities/exec/ — param: ip Payload: 127.0.0.1; cat /etc/passwd [+] Module: file [!] Path Traversal — /dvwa/vulnerabilities/fi/?page=.. — param: page [!] LFI — /dvwa/vulnerabilities/fi/?page=../../../etc/passwd [+] Module: csrf [!] CSRF — /dvwa/vulnerabilities/csrf/ — form without token [+] Module: headers Missing: X-Content-Type-Options, X-Frame-Options, CSP [*] Report saved to /tmp/dvwa_full_report/ Vulnerabilities: 9 found, 3 warnings
Laboratorio — 02
🧪 Lab: Wapiti vs Nikto — Comparativa Real

Ejecutar ambas herramientas contra el mismo objetivo y documentar exactamente qué encuentra cada una, qué se solapa y qué es exclusivo de cada herramienta.

🧪LAB-WEB-02 — Comparativa: mismo target, distintos hallazgosMEDIO

Target: DVWA. Ejecutar Wapiti y Nikto en paralelo y comparar los resultados. Demostrar por qué son complementarios, no redundantes.

🔮 Wapiti — Lo que encuentra
✗ CVE del servidor Apache → NO detecta
✗ /phpinfo.php expuesto → NO detecta
✗ .git/ expuesto → NO detecta
✓ SQL Injection en ?id=1
✓ Blind SQLi time-based
✓ XSS reflejado en name=
✓ XSS almacenado en message=
✓ Command Injection ip=
✓ LFI en ?page=
✓ CSRF sin token en formulario
✓ Cabeceras ausentes
🔍 Nikto — Lo que encuentra
✓ Apache/2.4.38 desactualizado
✓ /phpinfo.php accesible
✓ /.git/HEAD expuesto
✓ /setup.php accesible
✓ Contraseña por defecto
✓ Cookie sin HttpOnly/Secure
✓ X-Frame-Options ausente
✗ SQL Injection → NO prueba payloads
✗ XSS → NO prueba payloads
✗ Command Injection → NO detecta
✗ LFI → NO detecta
✗ CSRF → NO detecta
BASH — Ejecutar ambos en paralelo
# Terminal 1: Wapiti
wapiti -u http://localhost:8080/dvwa/ \
  --auth-user admin --auth-password password \
  --auth-method post --auth-url http://localhost:8080/dvwa/login.php \
  -m sql,xss,exec,file,csrf \
  -f html -o /tmp/wapiti_report 2>&1 | tee /tmp/wapiti.log &

# Terminal 2: Nikto (corre mucho más rápido)
nikto -h http://localhost:8080 -p 8080 \
  -Cookies "PHPSESSID=$(curl -s -c /tmp/cookies.txt -d 'username=admin&password=password&Login=Login' http://localhost:8080/dvwa/login.php > /dev/null && grep PHPSESSID /tmp/cookies.txt | awk '{print $NF}')" \
  -C all -o /tmp/nikto_report.html 2>&1 | tee /tmp/nikto.log &

# Esperar a que terminen
wait && echo "Ambos escaneos completados"

# Comparar hallazgos
echo "=== WAPITI ===" && grep "!" /tmp/wapiti.log | wc -l
echo "=== NIKTO ===" && grep "^+" /tmp/nikto.log | wc -l
Laboratorio — 03
🧪 Lab: Escanear WordPress

WordPress es el CMS más escaneado del mundo. Wapiti y Nikto tienen capacidades distintas y complementarias sobre instalaciones WordPress.

BASH — Escaneo WordPress con ambas herramientas
# Levantar WordPress vulnerable para el lab
docker run -d -p 8081:80 --name wpvuln \
  -e WORDPRESS_DB_HOST=db \
  wordpress:5.8-php7.4-apache

## NIKTO — Excelente para WP: detecta versión, rutas expuestas, plugins
nikto -h http://localhost:8081 -C all \
  -Plugins "@@ALL" \
  -o /tmp/wp_nikto.html
+ WordPress version 5.8 found
+ /wp-admin/ accessible (admin panel)
+ /wp-login.php accessible
+ /readme.html reveals WordPress version
+ /xmlrpc.php accessible (bruteforce vector)
+ /wp-content/debug.log accessible (info disclosure)

## WAPITI — Fuzzing en formularios WP
wapiti -u http://localhost:8081 \
  --scope domain \
  -m xss,sql,exec,backup,redirect,cookieflags,headers,cms \
  -f html -o /tmp/wp_wapiti_report
[*] CMS detected: WordPress 5.8
[!] XSS in search parameter
[!] Backup file found: /wp-config.php.bak
[!] Cookie without Secure flag: wordpress_test_cookie

# Wapiti con autenticación WP (si tenemos credenciales)
wapiti -u http://localhost:8081/wp-admin/ \
  --auth-user admin --auth-password password \
  --auth-method post \
  --auth-url http://localhost:8081/wp-login.php \
  -m sql,xss,exec,file --color -f html -o /tmp/wp_auth_report
Laboratorio — 04
🧪 Lab: REST API Fuzzing

Wapiti tiene soporte nativo para APIs REST con definición OpenAPI/Swagger. Nikto no puede crawlear APIs. Esta es la mayor ventaja de Wapiti en aplicaciones modernas.

🧪LAB-WEB-04 — API REST fuzzing con Wapiti + SwaggerAVANZADO

Juice Shop de OWASP tiene una API REST con definición Swagger. Wapiti puede fuzzear automáticamente todos los endpoints usando el swagger.json como mapa.

BASH — Wapiti con OpenAPI/Swagger
# Juice Shop expone Swagger en /api-docs
docker run -d -p 3000:3000 bkimminich/juice-shop

# Verificar swagger disponible
curl -s http://localhost:3000/api-docs | python3 -m json.tool | head -20
{
  "swagger": "2.0",
  "info": {"title": "OWASP Juice Shop"},
  "paths": {
    "/api/Users": {...},
    "/api/Products": {...},
    "/api/Feedbacks": {...}
  }
}

# Wapiti con Swagger: fuzzea todos los endpoints automáticamente
wapiti -u http://localhost:3000 \
  --swagger http://localhost:3000/api-docs \
  -m sql,xss,exec,ssrf,xxe \
  --color -f html -o /tmp/juiceshop_report

# Con autenticación JWT (Juice Shop usa Bearer tokens)
# Primero obtener el token
TOKEN=$(curl -s -X POST http://localhost:3000/api/Users/login \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@juice-sh.op","password":"admin123"}' | \
  python3 -c "import json,sys; print(json.load(sys.stdin)['authentication']['token'])")

# Escanear con token Bearer
wapiti -u http://localhost:3000 \
  --swagger http://localhost:3000/api-docs \
  -H "Authorization: Bearer $TOKEN" \
  -m sql,xss,ssrf --color -f html -o /tmp/js_auth_report

# Nikto contra la API (limitado — no entiende rutas dinámicas)
nikto -h http://localhost:3000 -C all -o /tmp/js_nikto.html
# Solo detectará cabeceras ausentes y archivos estáticos conocidos
Avanzado
🌫 Evasión de WAF

Wapiti y Nikto tienen técnicas para reducir la detección por WAF (Web Application Firewall) y sistemas IDS/IPS. Útil cuando el target tiene protección activa.

BASH — Técnicas de evasión Wapiti y Nikto
## WAPITI — Técnicas de evasión

# Delay entre peticiones (evitar rate limiting)
wapiti -u http://target.com --wait 2 --color -f html -o /tmp/r

# User-Agent personalizado (parecer un navegador real)
wapiti -u http://target.com \
  --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
  --color -f html -o /tmp/r

# Vía proxy Tor (anonimizar el origen)
torify wapiti -u http://target.com --color -f html -o /tmp/r

# Vía Burp Suite (para ver y modificar las peticiones)
wapiti -u http://target.com --proxy http://127.0.0.1:8080 --color -f html -o /tmp/r

## NIKTO — Modos de evasión (-evasion)
1  → Random URI encoding (non-UTF8)
2  → Directory self-reference (/./)
3  → Premature URL ending
4  → Prepend long random string
5  → Fake parameter
6  → Tab as request spacer
7  → Random case sensitivity
8  → Use Windows directory separator (\)
A  → Use carriage return (0x0d) as separator
B  → Use binary value 0x0b as separator

# Nikto con evasión múltiple
nikto -h http://target.com -evasion 1,7 -useragent "Mozilla/5.0" -o /tmp/nikto_waf.html

# Delay entre peticiones
nikto -h http://target.com -timeout 3 -maxtime 600s -o /tmp/nikto_slow.html
Avanzado
⚡ Automatización CI/CD

Integrar Wapiti y Nikto en pipelines de desarrollo continuo para detectar vulnerabilidades automáticamente en cada build.

YAML — GitHub Actions con Wapiti + Nikto
# .github/workflows/security-scan.yml
name: Security Scan

on:
  push:
    branches: [main, develop]
  schedule:
    - cron: '0 6 * * 1'  # Lunes a las 6am

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - name: Start app
        run: docker-compose up -d && sleep 30

      - name: Nikto (quick fingerprint)
        run: |
          docker run --network host sullo/nikto \
            -h http://localhost:8080 -maxtime 120s \
            -Format json -o nikto_report.json || true
          cat nikto_report.json

      - name: Wapiti (deep fuzzing)
        run: |
          pip3 install wapiti3
          wapiti -u http://localhost:8080 \
            -m sql,xss,exec,file \
            --max-scan-time 300 \
            -f json -o /tmp/wapiti_report
          cat /tmp/wapiti_report/report.json

      - name: Fail on critical vulns
        run: |
          CRITICAL=$(cat /tmp/wapiti_report/report.json | python3 -c "
          import json,sys
          d=json.load(sys.stdin)
          vulns=d.get('vulnerabilities',{})
          critical=['sql_injection','exec','file_handling']
          count=sum(len(vulns.get(v,[])) for v in critical)
          print(count)
          ")
          if [ "$CRITICAL" -gt "0" ]; then
            echo "FAIL: $CRITICAL critical vulnerabilities found!"
            exit 1
          fi

# Script standalone de auditoría
cat > audit.sh << 'EOF'
#!/bin/bash
TARGET=$1
echo "[*] GhostAcademy Security Audit: $TARGET"
echo "[1/2] Nikto fingerprinting..."
nikto -h "$TARGET" -Format json -o /tmp/nikto.json -maxtime 120s

echo "[2/2] Wapiti fuzzing..."
wapiti -u "$TARGET" -m sql,xss,exec,file --max-scan-time 600 -f json -o /tmp/wapiti

echo "[*] Resumen:"
echo "Nikto: $(cat /tmp/nikto.json | python3 -c "import json,sys;d=json.load(sys.stdin);print(len(d.get('vulnerabilities',[])),'hallazgos')")"
echo "Wapiti: $(cat /tmp/wapiti/report.json | python3 -c "import json,sys;d=json.load(sys.stdin);v=d.get('vulnerabilities',{});print(sum(len(x) for x in v.values()),'vulnerabilidades')")"
EOF
chmod +x audit.sh
./audit.sh http://target.com
Recursos
✅ Referencia Rápida

Cheatsheet completo para Wapiti y Nikto. Úsalo como guía durante auditorías web.

🔮 Wapiti — Comandos Clave

  • Escaneo básico: wapiti -u URL --color -f html -o /tmp/r
  • Solo SQLi: wapiti -u URL -m sql,blindsql -f html -o /tmp/r
  • Con auth form: --auth-user admin --auth-password pass --auth-method post --auth-url URL/login
  • Con cookies: -c cookies.pkl
  • Con Swagger: --swagger http://target/swagger.json
  • Módulos críticos: -m sql,blindsql,xss,exec,file,ssrf,ssti
  • Módulos de info: -m headers,cookieflags,backup,csrf
  • Limitar tiempo: --max-scan-time 1800
  • Via proxy: --proxy http://127.0.0.1:8080
  • Listar módulos: wapiti --list-modules

🔍 Nikto — Comandos Clave

  • Básico: nikto -h URL -C all -o /tmp/report.html
  • HTTPS: nikto -h URL -ssl -C all -o /tmp/report.html
  • Con auth: nikto -h URL -id user:pass -o /tmp/report.html
  • Con cookies: nikto -h URL -Cookies "SESSION=abc123"
  • Tuning rápido: -Tuning 1,2,3 (archivos, misconfigs, info)
  • Evasión WAF: -evasion 1,7 -useragent "Mozilla/5.0..."
  • Limitar tiempo: -maxtime 300s
  • JSON output: -Format json -o report.json
  • Masivo: nikto -h hosts.txt -Format csv -o report.csv
  • Actualizar DB: nikto -update

Flujo de Auditoría Recomendado

  • 1. Nikto rápido: identificar versiones, archivos expuestos y CVEs
  • 2. Wapiti sin auth: descubrir endpoints públicos y parámetros
  • 3. Obtener sesión autenticada (cookies/login)
  • 4. Wapiti con auth: fuzzear áreas protegidas (admin, perfil, etc.)
  • 5. Si hay Swagger/OpenAPI: usar --swagger para cobertura completa de API
  • 6. Combinar con WPScan/CMSeeK si hay CMS
  • 7. Verificar manualmente los hallazgos críticos (SQLi, RCE)
  • 8. Generar informe HTML de Wapiti + txt de Nikto para el cliente

Diferencia Clave — Cuándo usar cada una

SituaciónHerramientaMotivo
Escaneo inicial rápido (5 min)NiktoRápido, sin impacto, identifica lo obvio
Buscar SQLi/XSS realesWapitiSolo Wapiti inyecta payloads reales
Auditar API RESTWapitiNikto no crawlea APIs dinámicas
Detectar CVEs del servidorNiktoBase de datos de 6700+ firmas
Cobertura completaAmbosResultados complementarios, no redundantes