Nmap para pentesting: comandos para escanear puertos paso a paso

Cómo escanear una máquina con nmap como en un pentest: barrido de los 65535 puertos, versiones y scripts NSE, UDP y cómo leer la salida, con ejemplos en HTB.

· 6 min de lectura

Todas las máquinas empiezan igual: un escaneo de puertos. Si te saltas un puerto, te saltas la entrada. Esta guía es el flujo que usan casi todos los writeups de Hack The Box (y el que te conviene en la OSCP): dos pasadas TCP y una UDP, guardando siempre la salida, con los comandos exactos y lo que deberías ver en cada paso.

Truco

Practica cada paso contra una máquina retirada fácil, por ejemplo Nibbles (Linux) o Blue (Windows). Las máquinas retiradas son legales de atacar porque están en el laboratorio de Hack The Box, al que te conectas por VPN. No escanees nada que no sea tuyo o para lo que no tengas permiso por escrito.

Requisitos

  • Kali, Parrot o cualquier Linux con nmap (sudo apt install nmap). Usa sudo: como root, nmap hace el escaneo SYN (-sS), que es más rápido y fiable que el de conexión completa.
  • Conexión a la VPN de HTB (sudo openvpn lab_usuario.ovpn) y la IP de la máquina, que aquí será 10.10.10.75.
  • Una carpeta por máquina para guardar la salida: mkdir -p nibbles/nmap && cd nibbles.

Paso 0: ¿responde? ¿Linux o Windows?

ping -c 1 10.10.10.75
64 bytes from 10.10.10.75: icmp_seq=1 ttl=63 time=38.2 ms

El TTL te da una pista del sistema operativo: Linux empieza en 64 y Windows en 128, y la VPN de HTB resta un salto. 63 es casi seguro Linux; 127, Windows. Si el ping no responde no pasa nada: muchas máquinas Windows bloquean ICMP, por eso los siguientes comandos llevan -Pn.

Paso 1: todos los puertos TCP, rápido

Por defecto nmap solo mira los 1000 puertos más comunes. En HTB es habitual que la entrada esté en un puerto alto (un 8808, un 50051...), así que el primer escaneo recorre los 65535:

sudo nmap -p- --min-rate 5000 -n -Pn -oA nmap/todos 10.10.10.75
Opción Qué hace
-p- Todos los puertos, del 1 al 65535
--min-rate 5000 Al menos 5000 paquetes por segundo: tarda menos de un minuto en vez de 15
-n No resuelve nombres por DNS (más rápido)
-Pn No comprueba antes si el host está vivo: escanea igualmente
-oA nmap/todos Guarda la salida en los tres formatos (.nmap, .gnmap, .xml)

Salida esperada en Nibbles:

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Cuidado

--min-rate alto en una red lenta puede perder puertos. Si te parece que falta algo (una web que no sale, un dominio sin el 88 de Kerberos), repite con --min-rate 1000 o sin esa opción.

Paso 2: versiones y scripts solo en los abiertos

Ahora sí, el escaneo "lento" y detallado, pero solo sobre los puertos que han salido. Saca la lista del fichero .gnmap para no copiarla a mano:

ports=$(grep -oP '\d+(?=/open)' nmap/todos.gnmap | paste -sd,)
echo $ports        # 22,80
sudo nmap -p$ports -sCV -oA nmap/servicios 10.10.10.75

-sV detecta el servicio y la versión exacta, y -sC lanza los scripts NSE por defecto (títulos de webs, métodos HTTP, sesiones nulas de SMB, certificados...). Salida (recortada):

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)

Paso 3: leer la salida como un pentester

Un escaneo no es una lista de puertos: es una lista de preguntas. Lo que deberías sacar de la salida anterior:

  • La versión exacta del sistema. El paquete OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 solo existe en Ubuntu 16.04: búscalo en Google o en Launchpad. Con eso ya sabes si un exploit de kernel es plausible.
  • Cada versión, a searchsploit. searchsploit apache 2.4.18 y searchsploit openssh 7.2. Lo cuenta la guía de cómo explotar un CVE público.
  • Nombres de dominio. Si un script muestra Did not follow redirect to http://algo.htb/, añádelo a /etc/hosts y busca subdominios (fuzzing de directorios y vhosts).
  • La combinación de puertos. 53 + 88 + 389 + 445 es un controlador de dominio (empieza por enumerar Active Directory); 139 + 445 sin el 88 es un Windows o un Samba normal (enumeración SMB y NFS).

Una chuleta rápida de qué hacer con cada puerto:

Puerto Servicio Lo primero que pruebas
21 FTP ftp 10.10.10.75 con anonymous y sin contraseña
22 SSH Solo con credenciales o una clave: guárdalo para después
80, 443, 8080 HTTP Abrir en el navegador, ver el código y lanzar fuzzing
139, 445 SMB nxc smb IP -u '' -p '' --shares
161/udp SNMP snmpwalk -v2c -c public IP (enumeración SNMP)
1433 MSSQL Credenciales por defecto y ataques a MSSQL
3306 MySQL Solo con credenciales, salvo versiones muy antiguas
5985 WinRM evil-winrm en cuanto tengas un usuario

Paso 4: UDP, el que todo el mundo se salta

El escaneo UDP es lento (no hay handshake y nmap tiene que esperar a que no llegue nada), así que limita los puertos:

sudo nmap -sU --top-ports 20 -n -Pn -oA nmap/udp 10.10.10.75

Verás muchos open|filtered: significa "no lo sé". Los que importan son los que salen como open. El caso típico de HTB es el 161/udp (SNMP), que te puede regalar procesos con contraseñas en los argumentos, como en Pandora. Para confirmar un puerto concreto añade -sV: sudo nmap -sU -sV -p161 10.10.10.75.

Paso 5: scripts NSE concretos

Además de los de -sC, nmap trae más de 600 scripts en /usr/share/nmap/scripts. Para buscar los de un servicio y ver qué hace uno:

ls /usr/share/nmap/scripts | grep smb
nmap --script-help smb-vuln-ms17-010

El ejemplo clásico es Blue, un Windows 7 vulnerable a EternalBlue:

sudo nmap -p445 --script smb-vuln-ms17-010 10.10.10.40
| smb-vuln-ms17-010:
|   VULNERABLE:
|   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
|     State: VULNERABLE

Otros útiles: --script vuln (todas las comprobaciones de vulnerabilidades, ruidoso), http-enum (rutas conocidas de una web) y ssl-cert (nombres de dominio en el certificado de un 443).

Todo junto en un script

Si quieres el mismo flujo en cada máquina sin pensar, guarda esto como escanear.sh:

#!/bin/bash
# Uso: ./escanear.sh 10.10.10.75
ip=$1; mkdir -p nmap
sudo nmap -p- --min-rate 5000 -n -Pn -oA nmap/todos "$ip"
ports=$(grep -oP '\d+(?=/open)' nmap/todos.gnmap | paste -sd,)
sudo nmap -p"$ports" -sCV -oA nmap/servicios "$ip"
sudo nmap -sU --top-ports 20 -n -Pn -oA nmap/udp "$ip"

Mientras corre el escaneo UDP, ya puedes ir mirando la web.

Errores típicos

  • Note: Host seems down: el host no responde al ping. Añade -Pn.
  • Todos los puertos filtered: la VPN se ha caído o la máquina no ha terminado de arrancar. Haz ping y vuelve a lanzar el escaneo tras un minuto.
  • tcpwrapped: el puerto acepta la conexión y la cierra enseguida. Suele ser un servicio que solo habla con ciertas IP o que necesita algo concreto; prueba a conectarte con nc -nv IP puerto.
  • Faltan puertos que otro writeup sí ve: casi siempre es --min-rate demasiado alto o una máquina que se reinició. Repite el paso 1 más despacio.
  • -sC tarda una eternidad: lo estás lanzando sobre los 65535 puertos. Hazlo solo con la lista del paso 2.

Y después

Marca cada paso en la checklist de reconocimiento, ten a mano la chuleta de nmap y la ficha de la herramienta Nmap con más opciones. Si estás empezando, la ruta De cero a OSCP te lleva de este primer escaneo a tu primer dominio, y la lista de máquinas de HTB para preparar la OSCP te dice por cuáles empezar.

¿Ves un error o echas algo en falta? Cuéntanoslo