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.
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). Usasudo: 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.2solo 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.18ysearchsploit 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/hostsy 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. Hazpingy 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 connc -nv IP puerto.- Faltan puertos que otro writeup sí ve: casi siempre es
--min-ratedemasiado alto o una máquina que se reinició. Repite el paso 1 más despacio. -sCtarda 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.