Nmap
Nmap puede considerarse el estándar de la industria en lo referente al escaneo de puertos. Es una aplicación con un largo historial que está ampliamente optimizada e incluye un motor de secuencias de comandos que la convierte en una herramienta muy versátil. Por ejemplo, es posible buscar vulnerabilidades mientras se realiza el escaneo de puertos e incluso realizar la explotacoión de las mismas directamente.
Está disponible en diversos sistemas operativos y su uso principal es mediante línea de comandos, aunque existe la posibilidad de utilizarla en entorno gráfico. Se invoca con la orden nmap seguida de los diferentes switches que le dicen al programa las tareas a realizar.
Tipos de escaneo
Tres son los escaneos básicos:
- TCP Connect Scans (
-sT) - SYN “Half-open” Scans (
-sS) - UDP Scans (
-sU)
Existen otros menos comunes, entre los que podemos destacar:
- TCP Null Scans (
-sN) - TCP FIN Scans (
-sF) - TCP Xmas Scans (
-sX)
TCP Connect Scans
Este tipo de escaneo se basa en el conocido como three-way handshake que sucede al intentar establecer una conexión TCP. Este proceso consta de tres etapas.

En primer lugar, el equipo que quiere establecer una conexión (el cliente) con otro equipo (el servidor) le envía a éste una solicitud TCP con el indicador SYN establecido. En una segunda etapa, el equipo que ha recibido la petición SYN reconoce este paquete con una respuesta TCP que contiene los indicadores indicador SYN y ACK. Finalmente, el equipo que ha iniciado la conexión completa el protocolo de enlace enviando un paquete TCP con el indicador ACK activado. En caso de no poder establecerse la conexión, el RFC 793 establece que en lugar de responder con SYN/ACK se debe responder con el flag RST (Reset).
En base a este protocolo, Nmap intenta realizar una conexión. Si el pueto está abierto recibirá una respuesta con los flags SYN/ACK. Por contra, si está cerrado recibirá una respuesta con el flag RST.
Existe un tercer escenario: el puerto puede estar abierto pero oculto detrás de un firewall. En este caso, al mandar un paquete con SYN Nmap no rebibirá ninguna respuesta, por lo que se considerará que el puerto está filtered (filtrado).
Como medida de seguridad, el firewall se puede configurar para responder con un paquete RST, de forma que entorpezca el proceso de escaneado de puertos en caso de sufrirlo.
Este tipo de escaneo es el utilizado por defecto cuando ejecutamos el programa como usuario normal, sin priviliegios de root.
SYN “Half-open” Scans
Este tipo de escaneo, también conocido como sigiloso (stealth), se diferencia del anterior en que se envía un paquete TCP con el flag RST activado después de recibir el paquete SYN/ACK del servidor. Al recibir una respuesta afirmativa por parte del servidor ya se entiende que el puerto está abierto y no se sigue con el proceso de establecer una conexión completa.

Características de esta forma de escaneo:
- Es más fácil esquivar sistemas de detección de intrusos, aunque las soluciones más modernas de IDS están preparadas para ello.
- Este tipo de escaneos a menudo no son registrados por las aplicaciones que escuchan en los puertos abiertos, ya que es común registrar una conexión una vez que se ha establecido por completo.
- El proceso de escaneado es más rápido que en el tipo TCP Connect.
- Hay que tener en cuenta que para poder utilizar este tipo de escaneo en Linux es necesario ejecutar Nmap con privilegios de root, ya que es necesario crear paquetes sin procesar. Por esta razón, los escaneos SYN son los escaneos predeterminados utilizados por Nmap si se ejecutan con permisos sudo. Si se ejecuta sin permisos de sudo, Nmap utiliza de manera predeterminada el escaneo TCP Connect.
- Es utilizado por defecto cuando ejecutamos el programa con permisos de root.
Respecto a como se identifican los puertos cerrados y filtrados, se aplican exactamente las mismas reglas que con un escaneo TCP Connect. Si un puerto está cerrado, el servidor responde con un paquete RST. Si el puerto está filtrado por un firewall, puede no recibirse nada o recibirse un paquete modificado por el firewall con RST.
En este sentido, los dos escaneos son idénticos: la gran diferencia está en cómo manejan los puertos abiertos.
UDP Scans
A diferencia de TCP, las conexiones UDP no tienen estado. No se utiliza el three-way handshake ya que al enviar un paquete no se espera una confirmación que asegure que el paquete a llegado a su destino.
Cuando se envía un paquete a un puerto UDP abierto, no debería haber respuesta. Cuando esto sucede, Nmap se refiere al puerto como abierto|filtrado (open|filtered). En otras palabras, sospecha que el puerto está abierto, pero no puede asegurarlo ya que podría tener un firewall. Si obtiene una respuesta UDP (lo cual es muy inusual), entonces el puerto se marca como abierto. En general, no hay respuesta, y Nmap continua enviando una segunda solicitud de conexión como una doble verificación. Si de nuevo no hay respuesta, el puerto se marca como abierto|filtrado y Nmap continúa.
Si el puerto está cerrado, el servidor debe responder con un paquete ICMP que contenga un mensaje que indica que el puerto no está disponible. Esto identifica claramente los puertos cerrados y Nmap los marca como tales.
En este tipo de escaneo, las solicitudes enviadas están completamente vacías, son solo paquetes UDP sin procesar. Sin embargo, para los puertos que suelen estar ocupados por servicios bien conocidos se envía una carga útil específica del protocolo con la que es más probable que se obtenga una respuesta que permita obtener un resultado más preciso.
Debido a la dificultad para identificar si un puerto UDP está realmente abierto, este tipo de escaneo es bastante lento. Por ello es recomendable limitar el número de puertos a comprobar. Por ejemplo, se puede utilizar el switch --top-ports <x> para limitar la búsqueda a los x puertos UDP más utilizados.
NULL, FIN y Xmas
Estos tres tipos de escaneo están relacionados y se utilizan principalmente porque tienden a ser aún más sigilosos que un escaneo SYN.
En el escaneo de tipo NULL, el cliente envía una petición TCP sin ningún flag activado. Según el RFC, el host de destino debe responder con un RST si el puerto está cerrado.
El escaneo de tipo FIN funciona de forma similar. Sin embargo, en lugar de enviar un paquete completamente vacío se envía una solicitud con el flag FIN, el cual se usa generalmente para cerrar correctamente una conexión activa. Como en el caso anterior, Nmap espera un RST si el puerto está cerrado.
Por último, el escaneo Xmas se realiza envíando un paquete TCP con formato incorrecto y esperando, de nuevo, una respuesta RST para puertos cerrados. Se lo conoce como un escaneo de “navidad” (Xmas) porque los flags que activa (PSH, URG y FIN) le dan la apariencia de un árbol de navidad parpadeante cuando se ve como una captura de paquetes en Wireshark.
La forma de tratar los puertos abiertos en estos escaneos es idéntica y es muy similar a la de un escaneo UDP. Si el puerto está abierto, no hay respuesta al paquete con formato incorrecto. El problema es, al igual que con los puertos UDP abiertos, que ese comportamiento es el esperado si el puerto está protegido por un firewall, por lo que estos escaneos solo identificarán los puertos como abierto|filtrado, cerrado o filtrado. Si un puerto se identifica como filtrado con uno de estos escaneos, generalmente se debe a que el destino ha respondido con un paquete ICMP inalcanzable.
También vale la pena señalar que no siempre se cumple lo establecido en el RFC 793. En este documento se exige que los hosts de una red respondan a paquetes con formato incorrecto devolviendo un paquete TCP con el flag RST si los puertos están cerrados y no emitiendo ninguna respuesta si los puertos estén abiertos. En el caso de Windows y muchos dispositivos de red de Cisco, por ejemplo, esto no se cumple ya que responden con un RST a cualquier paquete TCP con formato incorrecto, independientemente de si el puerto está realmente abierto o no. Esto hace que todos los puertos aparezcan como cerrados.
Limitar el número de puertos a escanear
Por defecto, Nmap escanea los primeros 1000 puertos. Esto podemos cambiarlo usando la opción -F, que solo escaneará los prmeros 100 puertos, o con -p[rango], para escanear un rango concreto de puertos (-p- escaneará todos los puertos ya que dejamos el rango abierto).
Detectar versiones
Podemos intentar detectar el sistema operativo ejecutado en la máquina objetivo, con la opción -O, y la versión de los servicios ejecutados en los puertos abiertos, con -sV (-sVCamplia la información recuperada). Ambas opciones se pueden juntar con -A. A tener en cuenta que -sV no se puede utilizar con un escaneo de tipo -sS.
Descubrir equipos activos
Para descubrir hosts activos, sin realizar un escaneado de puertos, podemos usar
nmap -sn 192.168.0.1-254 o nmap -sn 192.168.0.0/24Las siguientres opciones permiten realizar este proceso mediante diversas técnicas:
-PR -snutiliza peticiones ARP (se usa si los objetivos están en el mismo segmento de red)-PE -snutiliza peticiones ICMP tipoecho(ping)-PP -snutiliza peticiones ICMP tipotimestamp-PM -snutiliza peticiones ICMP tipoaddress mask-PS -snutiliza peticiones TCP usando el flag SYN. Por defecto se usa una conexión al puerto 80 pero puede indicarse otro u otro rango de puertos-PS21 -PS21-25 -PS80,443,8080. Si se usa comorootno es necesario completar el TCP 3-way handshake-PA -snutiliza peticiones TCP usando el flag ACK. Como el anterior se pueden indicar los puertos, pero debe ejecutarse como usuario privilegiado-PU -snutiliza peticiones UDP usando el flag ACK. Se pueden indicar los puertos a comprobar como las anteriores opciones
Evitar firewalls y ser detectado
De forma general, los puertos se encuentran en dos estados: abierto o cerrado. Pero en un escenario real es necesario tener en cuenta la presencia de firewalls. Por ejemplo, un puerto podría estar abierto pero un firewall podría estar bloqueando los paquetes. Por lo tanto, Nmap considera los siguientes seis estados:
- Abierto (Open): indica que un servicio está escuchando en el puerto especificado.
- Cerrado (Closed): indica que ningún servicio está escuchando en el puerto especificado, aunque el puerto es accesible. Por accesible, se entiende que es alcanzable y no está bloqueado por un firewall u otros dispositivos/programas de seguridad.
- Filtrado (Filtered): significa que Nmap no puede determinar si el puerto está abierto o cerrado porque el puerto no es accesible. Puede que se estén bloqueando los paquetes que envía Nmap o las respuestas a los mismos.
- No Filtrado (Unfiltered): significa que Nmap no puede determinar si el puerto está abierto o cerrado, aunque el puerto es accesible. Este estado se encuentra cuando se utiliza un escaneo ACK (−sA).
- Abierto|Filtrado (Open|Filtered): Esto significa que Nmap no puede determinar si el puerto está abierto o filtrado.
- Cerrado|Filtrado (Closed|Filtered): Esto significa que Nmap no puede decidir si un puerto está cerrado o filtrado.
A la hora de intentar evadir la presencia de un firewall se pueden usar algunas de las siguientes opciones:
-PnYa que Nmap hace uso por defecto de ping para determinar si un equipo está activo o no, si el firewall de un equipo bloquea los paquetes ICMP provocará que Nmap no lo detecte como activo. Con esta opción se indica que no se utilice ping y se trate al objetivo como activo. El problema de esta opción es que puede consumir una gran cantidad de tiempo ya que obliga a escanear equipos que realmente no están activos.-fSe utiliza para fragmentar los paquetes y, de esta forma, dividirlos en partes más pequeñas, lo que hace menos probable que los paquetes sean detectados por un firewall o IDS. Los datos se dividen en grupos de 8 bytes. Se puede usar-ff, que dividirá en fragmentos de 16 bytes.-mtu <número>Similar a la anterior. Permite fragmentar los paquetes pero especificando el tamaño de los mismos. Debe ser un múltiplo de 8.--data-length <número>Permite crear paquetes de mayor tamaño.--badsumSe usa para generar una suma de verificación no válida para paquetes. En principio, cualquier pila TCP/IP debería eliminar un paquete de estas características. Sin embargo, los firewalls pueden responder automáticamente sin comprobar la suma de verificación del paquete. Como tal, este conmutador se puede utilizar para determinar la presencia de un firewall/IDS.--scan-delay <time>msPermite agregar un retraso entre los paquetes enviados.-TnúmeroTambién permite establecer una demora, siendo número un valor entre 0 (paranoid) y 4 (aggressive).--min-rate <número>y--max-rate <número>Indican el mínimo y máximo de paquetes por segundo enviados.--min-parallelism <número>y--max-parallelism <número>Indican el mínimo y máximo de puertos a probar simultáneamente.
Uso de consultas DNS
Con la opción -n se indica que no se utilicen consultas DNS. Con -R lo contrario, pudiendo especificar el servidor de consulta a usar mediante --dns-servers.
Guardar en archivo
El resultado del proceso de escaneado puede guardarse en un fichero. La opción -oN es la más común, guardando la salida en un fichero de texto normal.
Más información: