Nmap (Network Mapper) es la herramienta de reconocimiento de redes más popular del mundo. Es gratuita, open source y extremadamente poderosa para descubrir dispositivos, puertos abiertos, servicios en ejecución y mucho más.
🎯 ¿Por qué es importante? En ciberseguridad, el reconocimiento es el primer paso. Nmap te permite “mapear” una red como un explorador, identificando qué hay disponible antes de cualquier acción.
🛠️ Instalación rápida
En Debian/Ubuntu:
1
| sudo apt update && sudo apt install nmap
|
En otras distribuciones:
1
2
3
4
5
| # Fedora/CentOS
sudo dnf install nmap
# Arch Linux
sudo pacman -S nmap
|
Verificar instalación:
🎯 Conceptos básicos antes de empezar
¿Qué hace Nmap?
- Descubre dispositivos en una red
- Identifica puertos abiertos en esos dispositivos
- Detecta servicios corriendo en esos puertos
- Determina sistemas operativos aproximados
- Evalúa seguridad con scripts especializados
⚖️ Uso ético y legal
⚠️ Importante: Solo usa Nmap en:
- Tu propia red/dispositivos
- Redes donde tengas permiso explícito
- Laboratorios de práctica legales
Escanear redes ajenas sin permiso puede ser ilegal.
🚀 Comandos básicos para principiantes
1. Tu primer escaneo
¿Qué hace? Escanea los 1000 puertos más comunes de esa IP.
Salida típica:
1
2
3
4
5
6
7
8
9
| Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 192.168.1.1
Host is up (0.001s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
8080/tcp open http-proxy
|
2. Escanear un rango de IPs
1
2
3
| nmap 192.168.1.1-10 # IPs del 1 al 10
nmap 192.168.1.0/24 # Toda la subred (254 IPs)
nmap 192.168.1.1 192.168.1.5 # IPs específicas
|
3. Escanear puertos específicos
1
2
3
4
| nmap -p 22 192.168.1.1 # Solo puerto 22
nmap -p 22,80,443 192.168.1.1 # Puertos específicos
nmap -p 1-100 192.168.1.1 # Rango de puertos
nmap -p- 192.168.1.1 # TODOS los puertos (1-65535)
|
🔍 Tipos de escaneo (para entender qué pasa bajo el capó)
Escaneo TCP SYN (por defecto)
- Más rápido y sigiloso
- No completa la conexión TCP
- Requiere privilegios root
Escaneo TCP Connect
- Más lento pero no requiere root
- Completa la conexión TCP
- Más detectable en logs
Escaneo UDP
- Escanea puertos UDP
- Más lento que TCP
- Útil para servicios como DNS, DHCP
📋 Detección de servicios y versiones
Detectar versiones de servicios
Salida ejemplo:
1
2
3
4
| PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5
80/tcp open http Apache httpd 2.4.41
443/tcp open ssl/http Apache httpd 2.4.41
|
Detectar sistema operativo
¿Qué hace? Analiza respuestas TCP/IP para adivinar el OS.
Escaneo con scripts por defecto
¿Qué hace? Ejecuta scripts de Nmap para detectar vulnerabilidades comunes, información adicional, etc.
Combo poderoso: Versión + Scripts + OS
1
| nmap -sC -sV -O 192.168.1.1
|
⚡ Controlando la velocidad del escaneo
1
2
3
4
5
6
| nmap -T0 192.168.1.1 # Paranoid: MUY lento, sigiloso
nmap -T1 192.168.1.1 # Sneaky: Lento, difícil de detectar
nmap -T2 192.168.1.1 # Polite: Lento, menos agresivo
nmap -T3 192.168.1.1 # Normal: Velocidad por defecto
nmap -T4 192.168.1.1 # Aggressive: Rápido, recomendado
nmap -T5 192.168.1.1 # Insane: MUY rápido, puede perder info
|
💡 Tip: Para la mayoría de casos, -T4
es perfecto. Usa -T1
o -T2
si necesitas ser sigiloso.
🎯 Descubrimiento de hosts (¿quién está vivo?)
Ping scan (solo verificar si están activos)
1
| nmap -sn 192.168.1.0/24
|
Útil para: Mapear rápidamente todos los dispositivos en una red.
Escaneo específico sin ping
Cuándo usar: Cuando el host bloquea pings pero tiene puertos abiertos.
📂 Guardando resultados
1
| nmap -oN escaneo.txt 192.168.1.1
|
1
| nmap -oX escaneo.xml 192.168.1.1
|
1
| nmap -oA escaneo_completo 192.168.1.1
|
Genera: escaneo_completo.nmap
, escaneo_completo.xml
, escaneo_completo.gnmap
🧪 Scripts de Nmap (NSE)
Nmap incluye más de 600 scripts para tareas específicas:
Ver scripts disponibles
1
| ls /usr/share/nmap/scripts/ | grep -i "http"
|
Ejecutar script específico
1
2
3
| nmap --script http-title 192.168.1.1
nmap --script ssh-brute 192.168.1.1
nmap --script vuln 192.168.1.1
|
Scripts por categoría
1
2
3
4
| nmap --script "auth" 192.168.1.1 # Scripts de autenticación
nmap --script "brute" 192.168.1.1 # Scripts de fuerza bruta
nmap --script "discovery" 192.168.1.1 # Scripts de descubrimiento
nmap --script "vuln" 192.168.1.1 # Scripts de vulnerabilidades
|
🚀 Ejemplos prácticos paso a paso
Escenario 1: Reconocimiento básico de tu red
1
2
3
4
5
6
7
8
| # 1. Descubrir dispositivos en tu red local
nmap -sn 192.168.1.0/24
# 2. Escanear un dispositivo específico
nmap -T4 -A 192.168.1.1
# 3. Buscar puertos web específicos
nmap -p 80,443,8080,8443 192.168.1.0/24
|
Escenario 2: Análisis detallado de un servidor
1
2
| # Escaneo completo y profesional
nmap -T4 -A -v --script vuln -oA servidor_scan 192.168.1.100
|
¿Qué hace cada opción?
-T4
: Velocidad agresiva-A
: Detección de OS, versión, scripts y traceroute-v
: Modo verbose (más información)--script vuln
: Scripts de vulnerabilidades-oA
: Guardar en todos los formatos
Escenario 3: Buscar servicios específicos
1
2
3
4
5
6
7
8
| # Buscar servidores web
nmap -p 80,443 --open 192.168.1.0/24
# Buscar servidores SSH
nmap -p 22 --open 192.168.1.0/24
# Buscar servicios de base de datos
nmap -p 3306,5432,1433 --open 192.168.1.0/24
|
🔧 Comando profesional para pentesting
1
| sudo nmap -p- --open -sS -sC -sV --min-rate 5000 -vvv -n -Pn 192.168.1.100 -oN escaneo_completo
|
Desglose del comando:
sudo
: Permisos de administrador-p-
: Escanear TODOS los puertos (1-65535)--open
: Mostrar solo puertos abiertos-sS
: Escaneo SYN (sigiloso y rápido)-sC
: Scripts por defecto-sV
: Detección de versiones--min-rate 5000
: Mínimo 5000 paquetes por segundo-vvv
: Máximo nivel de detalle-n
: No resolver DNS (más rápido)-Pn
: No hacer ping (asumir que está activo)-oN
: Guardar resultado en archivo
📊 Interpretando resultados
Estados de puertos
- open: Puerto abierto y aceptando conexiones
- closed: Puerto cerrado pero responde
- filtered: Puerto filtrado por firewall
- unfiltered: Puerto accesible pero estado indeterminado
**open | filtered**: Nmap no puede determinar si está abierto o filtrado |
Ejemplo de salida completa
1
2
3
4
5
6
7
8
9
10
11
| Nmap scan report for 192.168.1.100
Host is up (0.00043s latency).
Not shown: 65530 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page
443/tcp open ssl/http Apache httpd 2.4.41 ((Ubuntu))
| ssl-cert: Subject: commonName=localhost
|
🛡️ Evasión básica de firewalls
1
2
3
4
5
6
7
8
9
10
11
| # Fragmentar paquetes
nmap -f 192.168.1.1
# Usar señuelos (decoy)
nmap -D 192.168.1.5,192.168.1.6,ME 192.168.1.1
# Cambiar puertos source
nmap --source-port 53 192.168.1.1
# Escaneo idle/zombie
nmap -sI zombie_host target_host
|
📚 Recursos para seguir aprendiendo
Documentación oficial
1
2
| man nmap # Manual completo
nmap --help # Ayuda rápida
|
Libros recomendados
- “Nmap Network Scanning” por Gordon Lyon (creador de Nmap)
- “The Official Nmap Project Guide”
Laboratorios de práctica
- VulnHub: Máquinas virtuales vulnerables
- HackTheBox: Plataforma de pentesting legal
- TryHackMe: Tutoriales interactivos
🎯 Próximos pasos
- Practica en tu red local con dispositivos propios
- Combina Nmap con otras herramientas como Wireshark
- Aprende sobre scripts NSE específicos para tus intereses
- Estudia evasión de firewalls para pentesting avanzado
💡 Recuerda: Nmap es solo el primer paso en el reconocimiento. La información que obtengas será la base para todo análisis posterior de seguridad.
🔥 Casos de uso profesionales avanzados
Auditoría de seguridad empresarial
1. Inventario de activos:
1
2
3
4
5
6
7
8
| # Escaneo completo de la red corporativa
nmap -sn 192.168.0.0/16 > inventario_ips.txt
# Identificar sistemas operativos en la red
nmap -O --osscan-guess 192.168.1.0/24 -oX os_detection.xml
# Buscar servicios críticos expuestos
nmap -p 21,22,23,25,53,80,110,443,993,995,1433,3306,3389,5432 --open 192.168.1.0/24
|
2. Detección de vulnerabilidades:
1
2
3
4
5
6
| # Escaneo completo de vulnerabilidades
nmap --script vuln -sV 192.168.1.100
# Buscar vulnerabilidades específicas
nmap --script smb-vuln* 192.168.1.100
nmap --script ssl-* 192.168.1.100
|
Pentesting y red team
3. Reconocimiento sigiloso:
1
2
3
4
5
6
| # Escaneo ultra sigiloso
nmap -sS -T1 -f --randomize-hosts --data-length 25 -D 192.168.1.5,192.168.1.6,ME target
# Usando técnicas de evasión
nmap --source-port 53 --scan-delay 10s -T1 target
nmap --spoof-mac Apple target
|
4. Enumeración de servicios web:
1
2
3
4
5
6
7
8
| # Enumerar aplicaciones web
nmap --script http-enum -p 80,443,8080,8443 target
# Buscar directorios ocultos
nmap --script http-brute-dirs target
# Identificar tecnologías web
nmap --script http-waf-detect,http-waf-fingerprint target
|
Análisis forense y incident response
5. Detección de backdoors:
1
2
3
4
5
| # Buscar puertos inusuales abiertos
nmap -p 1-65535 --top-ports 1000 target
# Detectar servicios en puertos no estándar
nmap -sV --version-intensity 9 target
|
6. Monitoreo continuo:
1
2
3
4
5
6
7
8
9
10
11
12
13
| # Script de monitoreo automático
#!/bin/bash
while true; do
nmap -sn 192.168.1.0/24 | grep "Nmap scan report" |
awk '{print $5}' > current_hosts.txt
if ! diff previous_hosts.txt current_hosts.txt > /dev/null; then
echo "¡Cambios detectados en la red!" | mail admin@empresa.com
cp current_hosts.txt previous_hosts.txt
fi
sleep 300 # Revisar cada 5 minutos
done
|
🛡️ Técnicas avanzadas de evasión
Fragmentación de paquetes
1
2
3
4
| # Fragmentar paquetes IP
nmap -f target # Fragmentos de 8 bytes
nmap -ff target # Fragmentos de 16 bytes
nmap --mtu 24 target # MTU personalizado (múltiplo de 8)
|
Señuelos (Decoys)
1
2
3
| # Usar señuelos para ocultar origen
nmap -D decoy1,decoy2,decoy3,ME target
nmap -D RND:10 target # 10 señuelos aleatorios
|
Modificación de puertos origen
1
2
3
4
5
6
7
8
| # Simular tráfico DNS
nmap --source-port 53 target
# Simular tráfico web
nmap --source-port 80 target
# Puerto origen aleatorio
nmap -g 1337 target
|
Timing y velocidad
1
2
3
4
5
6
| # Escaneo extremadamente lento (1 paquete cada 15 segundos)
nmap -T0 --scan-delay 15s target
# Control fino del timing
nmap --min-rate 100 --max-rate 1000 target
nmap --min-parallelism 10 --max-parallelism 50 target
|
📊 Análisis avanzado de resultados
Parsing automático con scripts
1
2
3
4
5
6
7
8
9
10
| #!/bin/bash
# Script para analizar resultados de Nmap
# Extraer solo IPs con puertos abiertos
grep -E "^Nmap scan report|^[0-9]+/tcp.*open" nmap_scan.txt |
awk '/Nmap scan report/ {ip=$NF} /open/ {print ip":"$1}' > puertos_abiertos.txt
# Crear reporte de servicios vulnerables
nmap -sV --script vulners target -oX scan.xml
xsltproc scan.xml > reporte.html
|
Integración con bases de datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| # Python script para analizar resultados
import xml.etree.ElementTree as ET
import sqlite3
def parse_nmap_xml(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
conn = sqlite3.connect('scan_results.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS hosts
(ip TEXT, hostname TEXT, status TEXT)''')
cursor.execute('''CREATE TABLE IF NOT EXISTS ports
(ip TEXT, port INTEGER, protocol TEXT,
service TEXT, version TEXT)''')
for host in root.findall('host'):
ip = host.find('address').get('addr')
status = host.find('status').get('state')
cursor.execute("INSERT INTO hosts VALUES (?, ?, ?)",
(ip, '', status))
ports = host.find('ports')
if ports is not None:
for port in ports.findall('port'):
port_num = port.get('portid')
protocol = port.get('protocol')
service = port.find('service')
if service is not None:
service_name = service.get('name', '')
version = service.get('version', '')
else:
service_name = version = ''
cursor.execute("INSERT INTO ports VALUES (?, ?, ?, ?, ?)",
(ip, port_num, protocol, service_name, version))
conn.commit()
conn.close()
# Uso
parse_nmap_xml('scan_results.xml')
|
🔬 Scripts NSE personalizados
Crear tu propio script NSE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| -- mi-script.nse
local nmap = require "nmap"
local shortport = require "shortport"
local http = require "http"
description = [[
Script personalizado para detectar aplicaciones web específicas
]]
author = "Tu Nombre"
license = "Same as Nmap"
categories = {"discovery", "safe"}
-- Definir en qué puertos ejecutar
portrule = shortport.http
action = function(host, port)
local response = http.get(host, port, "/")
if response and response.status == 200 then
local body = response.body
-- Buscar patrones específicos
if string.match(body, "WordPress") then
return "WordPress detectado"
elseif string.match(body, "Joomla") then
return "Joomla detectado"
end
end
return nil
end
|
Ejecutar script personalizado:
1
| nmap --script mi-script.nse target
|
🎯 Automatización con Nmap
Script de reconocimiento completo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| #!/bin/bash
# recon.sh - Script de reconocimiento automático
TARGET=$1
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR="scan_${TARGET}_${TIMESTAMP}"
mkdir -p $OUTPUT_DIR
echo "[*] Iniciando reconocimiento de $TARGET"
# 1. Ping sweep
echo "[*] Descubrimiento de hosts..."
nmap -sn $TARGET > $OUTPUT_DIR/ping_sweep.txt
# 2. Escaneo de puertos rápido
echo "[*] Escaneo rápido de puertos..."
nmap -T4 --top-ports 1000 $TARGET -oN $OUTPUT_DIR/quick_scan.txt
# 3. Escaneo completo de puertos abiertos
OPEN_PORTS=$(grep -E "^[0-9]+/tcp.*open" $OUTPUT_DIR/quick_scan.txt |
cut -d'/' -f1 | tr '\n' ',' | sed 's/,$//')
if [ ! -z "$OPEN_PORTS" ]; then
echo "[*] Escaneo detallado de puertos: $OPEN_PORTS"
nmap -sC -sV -p $OPEN_PORTS $TARGET -oA $OUTPUT_DIR/detailed_scan
fi
# 4. Escaneo de vulnerabilidades
echo "[*] Escaneo de vulnerabilidades..."
nmap --script vuln -p $OPEN_PORTS $TARGET -oN $OUTPUT_DIR/vuln_scan.txt
# 5. Detección de OS
echo "[*] Detección de sistema operativo..."
nmap -O $TARGET -oN $OUTPUT_DIR/os_detection.txt
echo "[*] Reconocimiento completado. Resultados en: $OUTPUT_DIR"
|
Monitoreo continuo de red
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| #!/bin/bash
# monitor_network.sh - Monitoreo continuo
NETWORK="192.168.1.0/24"
BASELINE_FILE="network_baseline.txt"
ALERT_EMAIL="admin@empresa.com"
# Crear baseline si no existe
if [ ! -f $BASELINE_FILE ]; then
nmap -sn $NETWORK | grep "Nmap scan report" > $BASELINE_FILE
echo "Baseline creado: $BASELINE_FILE"
exit 0
fi
# Escaneo actual
CURRENT_SCAN=$(mktemp)
nmap -sn $NETWORK | grep "Nmap scan report" > $CURRENT_SCAN
# Comparar con baseline
DIFF_OUTPUT=$(diff $BASELINE_FILE $CURRENT_SCAN)
if [ ! -z "$DIFF_OUTPUT" ]; then
echo "¡Cambios detectados en la red!"
echo "$DIFF_OUTPUT"
# Enviar alerta por email (requiere mailutils)
echo "Cambios detectados en la red $NETWORK:
$DIFF_OUTPUT" | mail -s "Alerta de Red" $ALERT_EMAIL
# Actualizar baseline
cp $CURRENT_SCAN $BASELINE_FILE
fi
rm $CURRENT_SCAN
|
📚 Recursos adicionales para maestría
Laboratorios de práctica
- Metasploitable: VM vulnerable para práctica
- DVWA: Aplicación web vulnerable
- VulnHub: Colección de VMs vulnerables
- HackTheBox: Plataforma de pentesting
- TryHackMe: Tutoriales interactivos
Herramientas complementarias
1
2
3
4
5
6
7
8
9
10
11
| # Masscan - Escaneo masivo ultra rápido
masscan -p1-65535 192.168.1.0/24 --rate=1000
# Unicornscan - Escáner asíncrono
unicornscan -mT 192.168.1.1:1-65535
# Zmap - Internet-wide scanning
zmap -p 22 -o ssh_hosts.txt
# Rustscan - Scanner moderno en Rust
rustscan -a 192.168.1.1 -- -sC -sV
|
Integración con frameworks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # python-nmap integration
import nmap
nm = nmap.PortScanner()
result = nm.scan('192.168.1.1', '22-443')
for host in nm.all_hosts():
print(f'Host: {host} ({nm[host].hostname()})')
print(f'State: {nm[host].state()}')
for protocol in nm[host].all_protocols():
ports = nm[host][protocol].keys()
for port in ports:
service = nm[host][protocol][port]
print(f'Port: {port} - {service["state"]} - {service["name"]}')
|
Andrés Nuñez - t4ifi