En 03-01 obtuvimos una tabla de puertos abiertos por host: en dev (10.10.10.15) vimos el 22, 80, 3306, 8080 y un misterioso 54321; en db-interno (10.10.10.40) el 53 y el 161/UDP; en la tienda el 80 y el 443. Pero ese 3306/tcp mysql es solo una etiqueta que Nmap pone por el número de puerto: cualquiera puede poner un servicio en cualquier puerto. No sabemos qué versión corre, qué servidor web sirve el 80, ni qué demonios es el 54321.
Enumerar servicios es responder a esa pregunta: para cada puerto abierto, qué servicio es, qué versión, qué sistema operativo lo aloja y qué información expone. El entregable de esta lección es un inventario de servicios con versiones —la pieza que en 03-03 cruzaremos con vulnerabilidades conocidas—. Aquí identificamos e inventariamos; todavía no valoramos ni priorizamos vulnerabilidades. Y, como siempre, dentro del alcance: la enumeración también genera tráfico y algunas sondas (fuerza bruta de recursos, consultas SNMP masivas) pueden ser intrusivas, así que se acuerdan y documentan.
Contenido
- De puerto abierto a servicio identificado
- Detección de versiones con Nmap (
-sV) - Detección de sistema operativo (
-O) - Banner grabbing manual
- Enumeración por protocolo: panorama
- HTTP/HTTPS: whatweb, nikto y NSE
- SMB: enum4linux y smbclient
- SNMP: snmpwalk
- Otros: FTP, SSH, SMTP, DNS, MySQL
- El inventario de servicios de TechNova
- Contrapartida defensiva
- Errores comunes y consejos
- Ejercicios
- Conclusión
- De puerto abierto a servicio identificado
El escaneo de puertos dice dónde escucha algo; la enumeración dice qué escucha y qué cuenta de sí mismo. La diferencia es enorme para un pentester:
- "El 3306 está abierto" → no sé si es explotable.
- "El 3306 es MySQL 5.5.62, sin TLS, y acepta conexiones desde la red" → ya puedo buscar vulnerabilidades concretas de esa versión.
La versión es el dato más valioso de esta fase, porque las vulnerabilidades conocidas están ligadas a versiones concretas (lo veremos en 03-03 con CVE y CPE). Por eso el objetivo central es afinar cada puerto abierto hasta un servicio + versión.
- Detección de versiones con Nmap (
-sV)
-sV)-sV hace que Nmap, tras encontrar un puerto abierto, interrogue al servicio enviando sondas y comparando las respuestas con su base de datos de firmas (nmap-service-probes). Devuelve el servicio real y, a menudo, la versión exacta.
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) 3306/tcp open mysql MySQL 5.5.62-0ubuntu0.14.04.1 8080/tcp open http Jetty 9.4.z-SNAPSHOT 54321/tcp open http Werkzeug httpd 0.14.1 (Python 3.6.9)
Lectura línea a línea:
22 ... OpenSSH 7.6p1 Ubuntu: no solo "ssh", sino la versión exacta y que el sistema es Ubuntu (dato de SO gratis).80 ... Apache httpd 2.4.29: el servidor web es Apache 2.4.29.3306 ... MySQL 5.5.62: la base de datos ya no es una etiqueta: es MySQL 5.5.62, una versión antigua (pista para 03-03).8080 ... Jetty 9.4.z: un servidor Java Jetty, probablemente una aplicación distinta.54321 ... Werkzeug httpd 0.14.1 (Python 3.6.9): resuelto el misterio: el puerto raro es una app web en Python/Flask (Werkzeug es su servidor de desarrollo). Que corra el servidor de desarrollo en un puerto expuesto es en sí un indicio de mala configuración.
Opciones útiles: --version-intensity 0-9 regula cuántas sondas envía (más intensidad = más preciso pero más ruidoso); -sV --version-light es un compromiso rápido.
- Detección de sistema operativo (
-O)
-O)-O intenta adivinar el SO analizando detalles de la pila TCP/IP (fingerprinting): valores iniciales de TTL, tamaño de ventana, opciones TCP... Cada SO tiene una "huella" distinta.
Running: Linux 4.X|5.X OS CPE: cpe:/o:linux:linux_kernel:4 OS details: Linux 4.15 - 5.6 Network Distance: 1 hop
Running: Linux 4.X|5.X: es un Linux con kernel de la serie 4 o 5.OS CPE: cpe:/o:linux:linux_kernel:4: aparece el CPE, el identificador estandarizado que usaremos en 03-03 para buscar vulnerabilidades.Network Distance: 1 hop: está a un salto (misma red), coherente con la auditoría interna.
Un atajo muy usado es -A, que combina -sV -O más scripts por defecto y traceroute:
Es cómodo, pero más ruidoso; en escenarios sigilosos se prefiere lanzar -sV y -O por separado y controlados.
- Banner grabbing manual
No siempre hace falta Nmap. Muchos servicios se presentan solos al conectar (el banner). Conectarse a mano con netcat u openssl confirma versiones y a veces revela detalles que Nmap resume:
# Cabeceras HTTP: pedimos y leemos la respuesta del servidor
printf 'HEAD / HTTP/1.0\r\n\r\n' | nc 10.10.10.15 80La cabecera X-Powered-By: PHP/7.2.24 es oro: confirma que detrás de Apache hay PHP 7.2 (la versión sin soporte que ya sospechábamos de la tienda). Para servicios sobre TLS se usa openssl s_client -connect host:443 en vez de nc.
- Enumeración por protocolo: panorama
A partir de la versión, cada protocolo tiene sus propias técnicas de enumeración para extraer información. Mapa de qué mirar según el puerto:
| Puerto | Servicio | Qué enumerar | Herramientas |
|---|---|---|---|
| 80/443 | HTTP/S | Tecnologías, rutas, ficheros, cabeceras | whatweb, nikto, nmap NSE, dirb |
| 139/445 | SMB | Recursos compartidos, usuarios, políticas | enum4linux, smbclient, nmap NSE |
| 161/UDP | SNMP | Interfaces, procesos, usuarios, rutas | snmpwalk, onesixtyone |
| 21 | FTP | Acceso anónimo, versión, listados | nmap NSE, ftp |
| 22 | SSH | Versión, métodos de autenticación | nmap NSE, banner |
| 25 | SMTP | Usuarios (VRFY/EXPN), relay abierto | nmap NSE, smtp-user-enum |
| 53 | DNS | Registros, transferencia de zona | dig, nslookup, nmap NSE |
| 3306 | MySQL | Versión, usuarios, acceso remoto | nmap NSE, mysql |
Nmap trae la NSE (Nmap Scripting Engine): scripts categorizados. Aquí usamos la categoría safe de enumeración (no la vuln, que es de 03-03). Los scripts viven en /usr/share/nmap/scripts/ y se invocan con --script.
- HTTP/HTTPS: whatweb, nikto y NSE
La tienda es el objetivo estrella, así que su enumeración web es prioritaria. Primero whatweb para identificar tecnologías:
http://tienda.technova.lab [200 OK] Apache[2.4.29], PHP[7.2.24], Country[RESERVED][ZZ], HTTPServer[Ubuntu][Apache/2.4.29 (Ubuntu)], JQuery[1.12.4], Script, X-Powered-By[PHP/7.2.24]
Confirma Apache 2.4.29, PHP 7.2.24 y jQuery 1.12.4 (todas versiones antiguas). Después nikto, un escáner de servidor web que busca ficheros y configuraciones conocidas (lo usamos aquí como reconocimiento, no como veredicto de vulnerabilidad):
+ Server: Apache/2.4.29 (Ubuntu) + /admin/: Directory indexing found. + /config.php.bak: Backup file found, possibly discloses credentials. + /phpinfo.php: Output from the phpinfo() function was found. + Cookie PHPSESSID created without the httponly flag.
Hallazgos de enumeración muy útiles: un directorio /admin/ con listado, un config.php.bak (posible fuga de credenciales) y un phpinfo.php (revela toda la configuración PHP). Con NSE ampliamos con scripts seguros:
80/tcp open http | http-title: TechNova - Tienda Online | http-methods: | Supported Methods: GET HEAD POST OPTIONS | http-enum: | /admin/: Possible admin folder | /login.php: Possible admin login
- SMB: enum4linux y smbclient
Si en un host Windows o Samba aparecen el 139/445, SMB es una fuente riquísima. En TechNova hay estaciones y un controlador de red; supongamos que 10.10.10.55 (estación) los tiene abiertos. enum4linux automatiza la enumeración:
[+] Server allows sessions using username '', password '' (null session) ... [+] Users via RID cycling: TECHNOVA\Administrador (RID 500) TECHNOVA\jlopez (RID 1103) TECHNOVA\mgarcia (RID 1104) [+] Share Enumeration: Sharename Type Comment --------- ---- ------- RRHH Disk Documentos RRHH IPC$ IPC IPC Service
Un null session (sesión sin credenciales) permite listar usuarios (¡reaparecen jlopez y mgarcia del recon!) y recursos compartidos como RRHH. Con smbclient intentamos acceder al recurso (dentro del alcance):
Poder listar RRHH con -N (sin contraseña) es un fallo de configuración serio. Lo documentamos; explotarlo a fondo es materia de módulos posteriores.
- SNMP: snmpwalk
En 03-01 vimos el 161/UDP (SNMP) abierto en db-interno. SNMP con la comunidad por defecto (public) expone un volcado enorme de información interna. Primero adivinamos la comunidad con onesixtyone, luego snmpwalk:
SNMPv2-MIB::sysDescr.0 = STRING: Linux db-interno 4.15.0-112-generic HOST-RESOURCES-MIB::hrSWRunName.42 = STRING: mysqld IP-MIB::ipAdEntAddr.10.10.10.40 = IpAddress: 10.10.10.40 TCP-MIB::tcpConnLocalPort = INTEGER: 3306
SNMP nos regala: el SO exacto (Linux 4.15.0-112), los procesos en ejecución (mysqld corriendo), las interfaces de red y los puertos locales. Es enumeración interna casi gratis, y por eso SNMP con public es un hallazgo clásico.
- Otros: FTP, SSH, SMTP, DNS, MySQL
Barrido de otros protocolos habituales con NSE y clientes nativos:
# FTP: comprobar acceso anonimo y version
nmap --script ftp-anon,ftp-syst -p 21 10.10.10.60
# SMTP: enumerar usuarios validos y comprobar relay abierto
nmap --script smtp-commands,smtp-open-relay -p 25 correo.technova.lab
# DNS: version del servidor
dig @10.10.10.40 version.bind chaos txt
# MySQL: version y capacidades (script seguro/info)
nmap --script mysql-info -p 3306 10.10.10.15Ejemplo de salida de mysql-info:
3306/tcp open mysql | mysql-info: | Protocol: 10 | Version: 5.5.62-0ubuntu0.14.04.1 | Capabilities flags: 63487 | Salt: k5*Lp2...
Confirma MySQL 5.5.62 desde el propio protocolo (no solo por -sV), y que acepta conexiones desde la red —una base de datos no debería estar expuesta así—.
- El inventario de servicios de TechNova
Consolidamos todo en el entregable de la lección: un inventario de servicios con versiones. Ordenado, es la entrada directa de 03-03.
| Host | Puerto | Servicio | Versión | SO | Notas de enumeración |
|---|---|---|---|---|---|
| tienda.technova.lab | 80 | Apache | 2.4.29 | Ubuntu | PHP 7.2.24, jQuery 1.12.4, /admin/, config.php.bak |
| tienda.technova.lab | 443 | Apache (TLS) | 2.4.29 | Ubuntu | Mismo vhost sobre HTTPS |
| 10.10.10.15 (dev) | 22 | OpenSSH | 7.6p1 | Ubuntu | — |
| 10.10.10.15 (dev) | 80 | Apache | 2.4.29 | Ubuntu | App PHP |
| 10.10.10.15 (dev) | 3306 | MySQL | 5.5.62 | Ubuntu | Expuesta a la red |
| 10.10.10.15 (dev) | 8080 | Jetty | 9.4.z | Ubuntu | App Java |
| 10.10.10.15 (dev) | 54321 | Werkzeug/Flask | 0.14.1 (Py 3.6.9) | Ubuntu | Servidor de desarrollo expuesto |
| 10.10.10.40 (db) | 161/UDP | SNMP | v2c comunidad public |
Linux 4.15 | Volcado interno accesible |
| 10.10.10.55 (est.) | 445 | Samba/SMB | — | Windows | Null session, share RRHH |
Fíjate: pasamos de "puertos abiertos" a un quién-es-quién con versiones listo para buscar CVE. Ese es exactamente el material que necesita la siguiente lección.
- Contrapartida defensiva
Toda esta enumeración se apoya en que los servicios dan demasiada información. El hardening correspondiente:
- Ocultar banners y versiones.
ServerTokens Proden Apache, quitarX-Powered-Byde PHP, banners neutros en SSH/SMTP. No impide el ataque, pero dificulta el mapeo. - Cerrar sesiones nulas de SMB (
restrict anonymous), desactivar SMBv1 y no exponer recursos comoRRHHsin autenticación. - SNMP: cambiar la comunidad
public, usar SNMPv3 con autenticación y cifrado, o desactivarlo si no se usa. - No exponer bases de datos (
bind-address 127.0.0.1en MySQL); nunca dejar servidores de desarrollo (Werkzeug,phpinfo.php,.bak) en sistemas accesibles. - Detección: la enumeración con
-sVy NSE genera conexiones completas y patrones reconocibles; un IDS bien afinado y el registro de accesos anómalos (muchas peticiones a rutas inexistentes, consultas SNMP externas) la delatan.
- Errores Comunes y Consejos
- Fiarse del
SERVICEpor número de puerto. El3306podría no ser MySQL. Confirma siempre con-sVo banner grabbing. - Saltar directo a
--script vuln. Eso es 03-03. Aquí toca inventariar con scriptssafe/de enumeración; mezclar fases ensucia el trabajo. - Ignorar UDP y SNMP. SNMP con
publicda medio informe hecho y mucha gente ni lo mira por ser UDP. - Enumeración web sin contexto. nikto y whatweb sueltan mucho ruido; anota lo relevante (versiones, rutas, ficheros sensibles) y descarta el resto.
- Sesiones nulas no documentadas. Si un null session te da usuarios y shares, es un hallazgo por sí mismo: regístralo, no lo des por hecho.
- Ser demasiado intrusivo. Algunas sondas (fuerza bruta de directorios agresiva, consultas SNMP masivas) cargan el servicio. Ajusta intensidad y respeta la ventana.
- Consejo: mantén un inventario vivo en tabla (host/puerto/servicio/versión/notas) desde el primer comando. Ese documento es literalmente la entrada de 03-03.
- Ejercicios
Ejercicio 1. Tienes el 8080/tcp open de dev pero Nmap solo dijo "http-proxy" en 03-01. Escribe el comando para identificar servicio y versión de ese puerto y explica qué información esperarías obtener y por qué es más útil que "http-proxy".
Ejercicio 2. En 10.10.10.55 un enum4linux -a devuelve una null session con la lista de usuarios y un recurso RRHH accesible con smbclient -N. Clasifica qué es enumeración (propio de esta lección) y qué sería ya explotación (módulos posteriores), y qué debes hacer aquí y ahora.
Ejercicio 3. Justifica, con dos ejemplos concretos del inventario de TechNova, por qué la versión es el dato más valioso de esta fase de cara a la siguiente lección (03-03).
Soluciones
Solución 1.
-sV interroga el servicio y lo compara con las firmas de Nmap; con intensidad alta afina la versión. Esperaríamos algo como Jetty 9.4.z-SNAPSHOT (servidor Java) en vez de la etiqueta genérica "http-proxy". Es más útil porque "http-proxy" es solo una suposición por número de puerto, mientras que "Jetty 9.4.z" identifica el software real y su versión, que es lo que permite buscar vulnerabilidades concretas en 03-03.
Solución 2. Enumeración (esta lección): descubrir que existe la null session, listar usuarios (jlopez, mgarcia, Administrador) y listar/leer los nombres del recurso RRHH. Todo eso es inventariar información expuesta. Explotación (módulos posteriores): usar esos usuarios para ataques de contraseñas (Módulo 4), o descargar y exfiltrar los ficheros de RRHH como parte de un acceso. Aquí y ahora: documentar el fallo (SMB permite sesión nula y expone RRHH sin autenticación) con evidencia, e incluirlo en el inventario; no ir más allá de lo que el alcance autorice en esta fase.
Solución 3. Ejemplo A: MySQL 5.5.62 — sin la versión solo sabríamos "hay una base de datos"; con la versión podemos buscar en la NVD/exploit-db los CVE específicos de MySQL 5.5.62 (03-03). Ejemplo B: PHP 7.2.24 / Apache 2.4.29 — versiones concretas sin soporte cuyos CVE conocidos podremos listar y priorizar. La versión es la clave de búsqueda que conecta un servicio con su lista de vulnerabilidades conocidas; sin ella, la detección de vulnerabilidades de la próxima lección sería adivinar.
Conclusión
Hemos transformado la tabla de puertos abiertos en un inventario de servicios con versiones: ya no tenemos "el 3306 abierto", sino "MySQL 5.5.62 expuesto a la red en un host Ubuntu 4.15"; no "el 80 abierto", sino "Apache 2.4.29 con PHP 7.2.24, con /admin/ listable y un config.php.bak"; y hemos resuelto misterios como el 54321 (un Werkzeug/Flask de desarrollo). Por el camino usamos -sV, -O, banner grabbing manual y enumeración específica por protocolo (whatweb, nikto, enum4linux, smbclient, snmpwalk, NSE), siempre identificando e inventariando, sin valorar todavía la gravedad.
Y esa es justo la frontera que cruzamos ahora. Tenemos una lista de software con versiones concretas, muchas de ellas visiblemente antiguas (MySQL 5.5, PHP 7.2, jQuery 1.12, un servidor de desarrollo expuesto, SMB con sesión nula, SNMP public). La pregunta ya no es "qué hay", sino "qué de esto es vulnerable, cómo de grave y por dónde conviene empezar".
En 03-03 Detección de Vulnerabilidades, la última lección del módulo, cruzaremos este inventario con las bases de datos de vulnerabilidades conocidas (CVE, CPE, NVD, exploit-db), pasaremos escáneres (Nessus/OpenVAS, nmap --script vuln, nuclei) y, sobre todo, validaremos críticamente los resultados para separar el falso positivo del hallazgo real. El resultado será una lista priorizada de vulnerabilidades candidatas: el puente hacia la explotación del Módulo 4.
Curso de Pentesting: Técnicas de Pruebas de Penetración
Módulo 1: Introducción al Pentesting
- ¿Qué es el Pentesting?
- Tipos de Pentesting
- Fases del Pentesting
- Ética y Legalidad en el Pentesting
- Metodologías y Estándares del Sector
Módulo 2: Reconocimiento y Recolección de Información
- Reconocimiento Pasivo
- Reconocimiento Activo
- Herramientas de Recolección de Información
- OSINT y Análisis de la Superficie de Ataque
Módulo 3: Escaneo y Enumeración
Módulo 4: Explotación de Vulnerabilidades
- Introducción a la Explotación
- Explotación de Vulnerabilidades Web
- Explotación de Vulnerabilidades de Red
- Explotación de Vulnerabilidades de Sistemas
- Ataques a Contraseñas y Autenticación
Módulo 5: Post-Explotación
- Escalada de Privilegios
- Mantenimiento del Acceso
- Pivoting y Movimiento Lateral
- Cobertura de Huellas y Anti-Forense
Módulo 6: Reporte y Remediación
- Documentación de Hallazgos
- Clasificación de Riesgos y CVSS
- Recomendaciones de Remediación
- Presentación de Resultados
