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

  1. De puerto abierto a servicio identificado
  2. Detección de versiones con Nmap (-sV)
  3. Detección de sistema operativo (-O)
  4. Banner grabbing manual
  5. Enumeración por protocolo: panorama
  6. HTTP/HTTPS: whatweb, nikto y NSE
  7. SMB: enum4linux y smbclient
  8. SNMP: snmpwalk
  9. Otros: FTP, SSH, SMTP, DNS, MySQL
  10. El inventario de servicios de TechNova
  11. Contrapartida defensiva
  12. Errores comunes y consejos
  13. Ejercicios
  14. Conclusión

  1. 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.

  1. Detección de versiones con Nmap (-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.

nmap -sV -p 22,80,3306,8080,54321 10.10.10.15
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.

  1. Detección de sistema operativo (-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.

sudo nmap -O 10.10.10.15
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:

sudo nmap -A -p 22,80,3306 10.10.10.15

Es cómodo, pero más ruidoso; en escenarios sigilosos se prefiere lanzar -sV y -O por separado y controlados.

  1. 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:

# Banner de SSH: se muestra nada mas conectar
nc 10.10.10.15 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# Cabeceras HTTP: pedimos y leemos la respuesta del servidor
printf 'HEAD / HTTP/1.0\r\n\r\n' | nc 10.10.10.15 80
HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu)
X-Powered-By: PHP/7.2.24

La 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.

  1. 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.

  1. 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:

whatweb http://tienda.technova.lab
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):

nikto -h http://tienda.technova.lab
+ 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:

nmap --script "http-title,http-headers,http-methods,http-enum" -p 80 tienda.technova.lab
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

  1. 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:

enum4linux -a 10.10.10.55
[+] 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):

smbclient //10.10.10.55/RRHH -N
smb: \> ls
  nominas_2025.xlsx    A    48210
  altas_bajas.docx     A    15320

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.

  1. 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:

onesixtyone 10.10.10.40 public
snmpwalk -v2c -c public 10.10.10.40
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.

  1. 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.15

Ejemplo 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í—.

  1. 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.

  1. Contrapartida defensiva

Toda esta enumeración se apoya en que los servicios dan demasiada información. El hardening correspondiente:

  • Ocultar banners y versiones. ServerTokens Prod en Apache, quitar X-Powered-By de 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 como RRHH sin 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.1 en MySQL); nunca dejar servidores de desarrollo (Werkzeug, phpinfo.php, .bak) en sistemas accesibles.
  • Detección: la enumeración con -sV y 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.

  1. Errores Comunes y Consejos

  • Fiarse del SERVICE por número de puerto. El 3306 podría no ser MySQL. Confirma siempre con -sV o banner grabbing.
  • Saltar directo a --script vuln. Eso es 03-03. Aquí toca inventariar con scripts safe/de enumeración; mezclar fases ensucia el trabajo.
  • Ignorar UDP y SNMP. SNMP con public da 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.

  1. 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.

nmap -sV --version-intensity 7 -p 8080 10.10.10.15

-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.

© Copyright 2026. Todos los derechos reservados