A 03-01 vam obtenir una taula de ports oberts per host: a dev (10.10.10.15) vam veure el 22, 80, 3306, 8080 i un misteriós 54321; a db-interno (10.10.10.40) el 53 i el 161/UDP; a la botiga el 80 i el 443. Però aquell 3306/tcp mysql és només una etiqueta que Nmap posa pel número de port: qualsevol pot posar un servei a qualsevol port. No sabem quina versió corre, quin servidor web serveix el 80, ni què dimonis és el 54321.

Enumerar serveis és respondre aquesta pregunta: per a cada port obert, quin servei és, quina versió, quin sistema operatiu l'allotja i quina informació exposa. L'entregable d'aquesta lliçó és un inventari de serveis amb versions —la peça que a 03-03 creuarem amb vulnerabilitats conegudes—. Aquí identifiquem i inventariem; encara no valorem ni prioritzem vulnerabilitats. I, com sempre, dins de l'abast: l'enumeració també genera trànsit i algunes sondes (força bruta de recursos, consultes SNMP massives) poden ser intrusives, així que s'acorden i es documenten.

Contingut

  1. De port obert a servei identificat
  2. Detecció de versions amb Nmap (-sV)
  3. Detecció de sistema operatiu (-O)
  4. Banner grabbing manual
  5. Enumeració per protocol: panorama
  6. HTTP/HTTPS: whatweb, nikto i NSE
  7. SMB: enum4linux i smbclient
  8. SNMP: snmpwalk
  9. Altres: FTP, SSH, SMTP, DNS, MySQL
  10. L'inventari de serveis de TechNova
  11. Contrapartida defensiva
  12. Errors comuns i consells
  13. Exercicis
  14. Conclusió

  1. De port obert a servei identificat

L'escaneig de ports diu on escolta alguna cosa; l'enumeració diu què escolta i què explica de si mateix. La diferència és enorme per a un pentester:

  • "El 3306 està obert" → no sé si és explotable.
  • "El 3306 és MySQL 5.5.62, sense TLS, i accepta connexions des de la xarxa" → ja puc buscar vulnerabilitats concretes d'aquesta versió.

La versió és la dada més valuosa d'aquesta fase, perquè les vulnerabilitats conegudes estan lligades a versions concretes (ho veurem a 03-03 amb CVE i CPE). Per això l'objectiu central és afinar cada port obert fins a un servei + versió.

  1. Detecció de versions amb Nmap (-sV)

-sV fa que Nmap, després de trobar un port obert, interrogui el servei enviant sondes i comparant les respostes amb la seva base de dades de firmes (nmap-service-probes). Retorna el servei real i, sovint, la versió 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ínia a línia:

  • 22 ... OpenSSH 7.6p1 Ubuntu: no només "ssh", sinó la versió exacta i que el sistema és Ubuntu (dada de SO de franc).
  • 80 ... Apache httpd 2.4.29: el servidor web és Apache 2.4.29.
  • 3306 ... MySQL 5.5.62: la base de dades ja no és una etiqueta: és MySQL 5.5.62, una versió antiga (pista per a 03-03).
  • 8080 ... Jetty 9.4.z: un servidor Java Jetty, probablement una aplicació diferent.
  • 54321 ... Werkzeug httpd 0.14.1 (Python 3.6.9): resolt el misteri: el port estrany és una app web en Python/Flask (Werkzeug és el seu servidor de desenvolupament). Que corri el servidor de desenvolupament en un port exposat és en si un indici de mala configuració.

Opcions útils: --version-intensity 0-9 regula quantes sondes envia (més intensitat = més precís però més sorollós); -sV --version-light és un compromís ràpid.

  1. Detecció de sistema operatiu (-O)

-O intenta endevinar el SO analitzant detalls de la pila TCP/IP (fingerprinting): valors inicials de TTL, mida de finestra, opcions TCP... Cada SO té una "empremta" diferent.

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: és un Linux amb kernel de la sèrie 4 o 5.
  • OS CPE: cpe:/o:linux:linux_kernel:4: apareix el CPE, l'identificador estandarditzat que farem servir a 03-03 per buscar vulnerabilitats.
  • Network Distance: 1 hop: està a un salt (mateixa xarxa), coherent amb l'auditoria interna.

Una drecera molt usada és -A, que combina -sV -O més scripts per defecte i traceroute:

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

És còmode, però més sorollós; en escenaris sigilosos es prefereix llançar -sV i -O per separat i controlats.

  1. Banner grabbing manual

No sempre cal Nmap. Molts serveis es presenten sols en connectar (el banner). Connectar-se a mà amb netcat o openssl confirma versions i de vegades revela detalls que Nmap resumeix:

# Banner de SSH: es mostra just en connectar
nc 10.10.10.15 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# Capcaleres HTTP: demanem i llegim la resposta 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 capçalera X-Powered-By: PHP/7.2.24 és or: confirma que darrere d'Apache hi ha PHP 7.2 (la versió sense suport que ja sospitàvem de la botiga). Per a serveis sobre TLS es fa servir openssl s_client -connect host:443 en lloc de nc.

  1. Enumeració per protocol: panorama

A partir de la versió, cada protocol té les seves pròpies tècniques d'enumeració per extreure informació. Mapa de què mirar segons el port:

Port Servei Què enumerar Eines
80/443 HTTP/S Tecnologies, rutes, fitxers, capçaleres whatweb, nikto, nmap NSE, dirb
139/445 SMB Recursos compartits, usuaris, polítiques enum4linux, smbclient, nmap NSE
161/UDP SNMP Interfícies, processos, usuaris, rutes snmpwalk, onesixtyone
21 FTP Accés anònim, versió, llistats nmap NSE, ftp
22 SSH Versió, mètodes d'autenticació nmap NSE, banner
25 SMTP Usuaris (VRFY/EXPN), relay obert nmap NSE, smtp-user-enum
53 DNS Registres, transferència de zona dig, nslookup, nmap NSE
3306 MySQL Versió, usuaris, accés remot nmap NSE, mysql

Nmap porta la NSE (Nmap Scripting Engine): scripts categoritzats. Aquí fem servir la categoria safe d'enumeració (no la vuln, que és de 03-03). Els scripts viuen a /usr/share/nmap/scripts/ i s'invoquen amb --script.

  1. HTTP/HTTPS: whatweb, nikto i NSE

La botiga és l'objectiu estrella, així que la seva enumeració web és prioritària. Primer whatweb per identificar tecnologies:

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 i jQuery 1.12.4 (totes versions antigues). Després nikto, un escàner de servidor web que busca fitxers i configuracions conegudes (l'utilitzem aquí com a reconeixement, no com a veredicte de vulnerabilitat):

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.

Troballes d'enumeració molt útils: un directori /admin/ amb llistat, un config.php.bak (possible fuga de credencials) i un phpinfo.php (revela tota la configuració PHP). Amb NSE ampliem amb scripts segurs:

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 i smbclient

Si en un host Windows o Samba apareixen el 139/445, SMB és una font riquíssima. A TechNova hi ha estacions i un controlador de xarxa; suposem que 10.10.10.55 (estació) els té oberts. enum4linux automatitza l'enumeració:

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 (sessió sense credencials) permet llistar usuaris (reapareixen jlopez i mgarcia del recon!) i recursos compartits com RRHH. Amb smbclient intentem accedir al recurs (dins de l'abast):

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

Poder llistar RRHH amb -N (sense contrasenya) és una fallada de configuració seriosa. Ho documentem; explotar-lo a fons és matèria de mòduls posteriors.

  1. SNMP: snmpwalk

A 03-01 vam veure el 161/UDP (SNMP) obert a db-interno. SNMP amb la comunitat per defecte (public) exposa un bolcat enorme d'informació interna. Primer endevinem la comunitat amb onesixtyone, després 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 ens regala: el SO exacte (Linux 4.15.0-112), els processos en execució (mysqld corrent), les interfícies de xarxa i els ports locals. És enumeració interna gairebé de franc, i per això SNMP amb public és una troballa clàssica.

  1. Altres: FTP, SSH, SMTP, DNS, MySQL

Escombrat d'altres protocols habituals amb NSE i clients natius:

# FTP: comprovar acces anonim i versio
nmap --script ftp-anon,ftp-syst -p 21 10.10.10.60

# SMTP: enumerar usuaris valids i comprovar relay obert
nmap --script smtp-commands,smtp-open-relay -p 25 correo.technova.lab

# DNS: versio del servidor
dig @10.10.10.40 version.bind chaos txt

# MySQL: versio i capacitats (script segur/info)
nmap --script mysql-info -p 3306 10.10.10.15

Exemple de sortida 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 des del mateix protocol (no només per -sV), i que accepta connexions des de la xarxa —una base de dades no hauria d'estar exposada així—.

  1. L'inventari de serveis de TechNova

Consolidem tot en l'entregable de la lliçó: un inventari de serveis amb versions. Ordenat, és l'entrada directa de 03-03.

Host Port Servei Versió SO Notes d'enumeració
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 Mateix 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 Exposada a la xarxa
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 desenvolupament exposat
10.10.10.40 (db) 161/UDP SNMP v2c comunitat public Linux 4.15 Bolcat intern accessible
10.10.10.55 (est.) 445 Samba/SMB Windows Null session, share RRHH

Fixa't: passem de "ports oberts" a un qui-és-qui amb versions llest per buscar CVE. Aquest és exactament el material que necessita la lliçó següent.

  1. Contrapartida defensiva

Tota aquesta enumeració es recolza en el fet que els serveis donen massa informació. El hardening corresponent:

  • Ocultar banners i versions. ServerTokens Prod a Apache, treure X-Powered-By de PHP, banners neutres a SSH/SMTP. No impedeix l'atac, però dificulta el mapatge.
  • Tancar sessions nul·les d'SMB (restrict anonymous), desactivar SMBv1 i no exposar recursos com RRHH sense autenticació.
  • SNMP: canviar la comunitat public, fer servir SNMPv3 amb autenticació i xifratge, o desactivar-lo si no es fa servir.
  • No exposar bases de dades (bind-address 127.0.0.1 a MySQL); mai deixar servidors de desenvolupament (Werkzeug, phpinfo.php, .bak) en sistemes accessibles.
  • Detecció: l'enumeració amb -sV i NSE genera connexions completes i patrons reconeixibles; un IDS ben afinat i el registre d'accessos anòmals (moltes peticions a rutes inexistents, consultes SNMP externes) la delaten.

  1. Errors Comuns i Consells

  • Refiar-se del SERVICE per número de port. El 3306 podria no ser MySQL. Confirma sempre amb -sV o banner grabbing.
  • Saltar directe a --script vuln. Això és 03-03. Aquí toca inventariar amb scripts safe/d'enumeració; barrejar fases embruta la feina.
  • Ignorar UDP i SNMP. SNMP amb public dóna mig informe fet i molta gent ni el mira per ser UDP.
  • Enumeració web sense context. nikto i whatweb solten molt soroll; anota el rellevant (versions, rutes, fitxers sensibles) i descarta la resta.
  • Sessions nul·les no documentades. Si un null session et dóna usuaris i shares, és una troballa per si mateixa: registra-la, no la donis per feta.
  • Ser massa intrusiu. Algunes sondes (força bruta de directoris agressiva, consultes SNMP massives) carreguen el servei. Ajusta intensitat i respecta la finestra.
  • Consell: mantén un inventari viu en taula (host/port/servei/versió/notes) des de la primera comanda. Aquest document és literalment l'entrada de 03-03.

  1. Exercicis

Exercici 1. Tens el 8080/tcp open de dev però Nmap només va dir "http-proxy" a 03-01. Escriu la comanda per identificar servei i versió d'aquest port i explica quina informació esperaries obtenir i per què és més útil que "http-proxy".

Exercici 2. A 10.10.10.55 un enum4linux -a retorna una null session amb la llista d'usuaris i un recurs RRHH accessible amb smbclient -N. Classifica què és enumeració (propi d'aquesta lliçó) i què seria ja explotació (mòduls posteriors), i què has de fer aquí i ara.

Exercici 3. Justifica, amb dos exemples concrets de l'inventari de TechNova, per què la versió és la dada més valuosa d'aquesta fase de cara a la lliçó següent (03-03).

Solucions

Solució 1.

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

-sV interroga el servei i el compara amb les firmes de Nmap; amb intensitat alta afina la versió. Esperaríem alguna cosa com Jetty 9.4.z-SNAPSHOT (servidor Java) en lloc de l'etiqueta genèrica "http-proxy". És més útil perquè "http-proxy" és només una suposició per número de port, mentre que "Jetty 9.4.z" identifica el programari real i la seva versió, que és el que permet buscar vulnerabilitats concretes a 03-03.

Solució 2. Enumeració (aquesta lliçó): descobrir que existeix la null session, llistar usuaris (jlopez, mgarcia, Administrador) i llistar/llegir els noms del recurs RRHH. Tot això és inventariar informació exposada. Explotació (mòduls posteriors): fer servir aquests usuaris per a atacs de contrasenyes (Mòdul 4), o descarregar i exfiltrar els fitxers de RRHH com a part d'un accés. Aquí i ara: documentar la fallada (SMB permet sessió nul·la i exposa RRHH sense autenticació) amb evidència, i incloure-la a l'inventari; no anar més enllà del que l'abast autoritzi en aquesta fase.

Solució 3. Exemple A: MySQL 5.5.62 — sense la versió només sabríem "hi ha una base de dades"; amb la versió podem buscar a la NVD/exploit-db els CVE específics de MySQL 5.5.62 (03-03). Exemple B: PHP 7.2.24 / Apache 2.4.29 — versions concretes sense suport els CVE conegudes de les quals podrem llistar i prioritzar. La versió és la clau de cerca que connecta un servei amb la seva llista de vulnerabilitats conegudes; sense ella, la detecció de vulnerabilitats de la propera lliçó seria endevinar.

Conclusió

Hem transformat la taula de ports oberts en un inventari de serveis amb versions: ja no tenim "el 3306 obert", sinó "MySQL 5.5.62 exposat a la xarxa en un host Ubuntu 4.15"; no "el 80 obert", sinó "Apache 2.4.29 amb PHP 7.2.24, amb /admin/ llistable i un config.php.bak"; i hem resolt misteris com el 54321 (un Werkzeug/Flask de desenvolupament). Pel camí hem fet servir -sV, -O, banner grabbing manual i enumeració específica per protocol (whatweb, nikto, enum4linux, smbclient, snmpwalk, NSE), sempre identificant i inventariant, sense valorar encara la gravetat.

I aquesta és just la frontera que creuem ara. Tenim una llista de programari amb versions concretes, moltes d'elles visiblement antigues (MySQL 5.5, PHP 7.2, jQuery 1.12, un servidor de desenvolupament exposat, SMB amb sessió nul·la, SNMP public). La pregunta ja no és "què hi ha", sinó "què d'això és vulnerable, com de greu i per on convé començar".

A 03-03 Detecció de Vulnerabilitats, l'última lliçó del mòdul, creuarem aquest inventari amb les bases de dades de vulnerabilitats conegudes (CVE, CPE, NVD, exploit-db), passarem escàners (Nessus/OpenVAS, nmap --script vuln, nuclei) i, sobretot, validarem críticament els resultats per separar el fals positiu de la troballa real. El resultat serà una llista prioritzada de vulnerabilitats candidates: el pont cap a l'explotació del Mòdul 4.

© Copyright 2026. Tots els drets reservats