¿Cómo usar Nmap para escanear los puertos de un VPS?

Actualizado el 23 de Julio, 2016. Por BlueHosting.

Nmap (Network Mapper, por sus siglas en inglés), es un software gratuito y de código abierto que funciona principalmente para efectuar rastreo de puertos, descubrimiento de la red y auditorías de seguridad. Incluye varias características que pueden resultar interesantes y útiles; en este tutorial, abordaremos el uso de Nmap para averiguar cuáles puertos de su VPS se encuentran abiertos.

Introducción

El Networking es un tema sumamente extenso y abrumador para muchos de los involucrados en la administración de sistemas. Existen varias capas, protocolos, interfaces y gran variedad de herramientas útiles para la comprensión de las redes.

Esta guía abordará el concepto de "puertos" y demostrará cómo el programa nmap puede ser usado para encontrar información sobre el estado de los puertos de una máquina en la red.

Nota
Este tutorial cubre información de seguridad IPv4. En Linux, la seguridad en IPv6 es mantenida de forma separada de IPv4. Por ejemplo, "nmap" escanea las direcciones IPv4 por defecto, pero también puede escanear direcciones IPv6 si se especifica la opción correspondiente (nmap -6). Si su VPS está configurado para IPv6, por favor recuerde asegurar ambas interfaces de red IPv4 e IPv6 con las herramientas apropiadas.

¿Qué son los puertos?

Hay muchas capas en el modelo de redes OSI. La capa de transporte es la capa primaria en cuanto a la comunicación entre diferentes servicios y aplicaciones. Es además, la capa principal con la que se asocian los puertos.

Terminología de puertos

Se necesita cierto conocimiento de la terminología de puertos para entender su configuración. A continuación algunos términos que le ayudarán a comprender el resto de este tutorial:

  • Puerto: Es una ubicación de red (siempre asociada con una dirección IP) que está implementada como una interfaz dentro del sistema operativo; los puertos ayudan a distinguir el tráfico destinado para diferentes aplicaciones o servicios.

  • Sockets de Internet: Es un descriptor de archivos que especifica la dirección IP y el número de puerto asociado, así como también el protocolo de transferencia que será usado para manejar los datos.

  • Asociación o Binding: El proceso que ocurre cuando una aplicación o un servicio usa un socket de Internet para manejar los datos que están entrando y saliendo.

  • Escuchando: Se dice que un servicio está "escuchando" en un puerto, cuando está haciendo binding a una combinación de puerto/protocolo/dirección IP con el fin de esperar solicitudes de los clientes del servicio.
    Tras recibir una solicitud, establece una conexión con el cliente (cuando es apropiado) usando el mismo puerto por el cual ha estado escuchando. Debido a que los sockets de Internet utilizados están asociados con una dirección IP específica del cliente, esto no previene que el servidor escuche y entregue solicitudes a otros clientes de forma simultánea.

  • Escaneo de puertos: El escaneo de puertos es el proceso de intentar conectarse a una serie de puertos secuenciales, con el fin de adquirir información sobre cuáles puertos están abiertos y qué servicios y sistemas operativos están detrás de estos.

Puertos comunes

Los puertos están especificados por un número que va desde 1 hasta 65535.

  • La mayoría de los puertos por debajo de 1024 están asociados con servicios que los sistemas operativos Linux y basados en Unix consideran críticos para las funciones esenciales de la red, por lo tanto, debe tener privilegios root si desea asignar servicios a estos puertos.

  • Los puertos entre 1024 y 49151 son considerados como "registrados". Esto significa que están "reservados" (en un sentido muy vago de la palabra) para ciertos servicios mediante la emisión de una solicitud a la Autoridad de Números Asignados en Internet (IANA, por sus siglas en inglés). Esto no se aplica de manera muy rigurosa, pero sí le puede dar una idea de los posibles servicios que están ejecutándose en cierto puerto.

  • Los puertos entre 49152 y 65535 no pueden ser registrados y están sugeridos para uso privado.

Debido a la extensa variedad de puertos disponibles, no tendrá que preocuparse de la mayoría de los servicios que suelen estar relacionados con cada puerto.

Sin embargo, hay algunos puertos que vale la pena conocer debido a su ubicuidad. A continuación una lista muy breve:

  • 20: Datos FTP
  • 21: Puerto de control FTP
  • 22: SSH
  • 23: Telnet <= No es seguro y no se recomienda en la mayoría de los usos
  • 25: SMTP
  • 43: Protocolo WHOIS
  • 53: Servicios de DNS
  • 67: Puerto de servidor DHCP
  • 68: Puerto de cliente DHCP
  • 80: Tráfico HTTP <= Tráfico web normal
  • 110: Puerto de correo POP3
  • 113: Servicios de autenticación bajo el protocolo Ident en redes IRC
  • 143: Puerto de correo IMAP
  • 161: SNMP
  • 194: IRC
  • 389: Puerto LDAP
  • 443: HTTPS <= Tráfico web seguro
  • 587: SMTP <= Puerto de envío de mensajes
  • 631: Puerto del demonio de impresión CUPS
  • 666: DOOM <= Este juego basado en FTP de hecho tiene su propio puerto especial

Estos son solo algunos de los servicios que están comúnmente asociados con los puertos. Debe ser capaz de encontrar los puertos apropiados para las aplicaciones que está intentando configurar en su documentación respectiva.

La mayoría de los servicios pueden ser configurados para usar puertos distintos a los establecidos por defecto, pero debe asegurarse de que tanto el servidor como el clientes hayan configurado ese puerto no estándar.

Puede obtener una lista de puertos comunes usando:

less /etc/services

Este comando le dará una lista de puertos comunes y sus servicios asociados:

. . .
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp          quote
qotd            17/udp          quote
msp             18/tcp                          # message send protocol
msp             18/udp                          # message send protocol
chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source
ftp-data        20/tcp
ftp-data        20/udp
. . .

En la sección de Nmap podremos ver cómo obtener una lista más completa.

Cómo verificar sus propios puertos abiertos

Hay varias herramientas que puede usar para escanear sus puertos abiertos.

Una de las que viene instalada por defecto en la mayoría de las distribuciones de Linux es netstat

Puede descubrir rápidamente cuáles servicios están corriendo ingresando el comando junto con los siguientes parámetros:

sudo netstat -plunt

El resultado estará ordenado de manera similar a este ejemplo, mostrando el puerto y el socket de escucha asociado con el servicio, además enumera los protocolos UDP y TCP:

Proto Recv-Q Send-Q   Local Address   Foreign Address   State       PID/Program name
tcp        0      0   0.0.0.0:3306    0.0.0.0:*         LISTEN      1818/mysqld
tcp        0      0   0.0.0.0:22222   0.0.0.0:*         LISTEN      2909/sshd 
tcp        0      0   127.0.0.1:25    0.0.0.0:*         LISTEN      1312/master

Instalar Nmap

Parte de la seguridad de redes incluye las pruebas de vulnerabilidad. Esto significa tratar de infiltrarse en la red y descubrir sus debilidades de la misma forma en la cual lo haría un atacante.

De todas las herramientas para hacer esto, Nmap es probablemente la más común y poderosa.

Puede instalar Nmap desde Ubuntu o Debian ejecutando:

sudo apt-get update
sudo apt-get install nmap

Para CentOS puede utilizar

yum install nmap

Uno de los beneficios secundarios de instalar este software es un archivo mejorado con un mapeo de puertos. En este archivo, puede ver una asociación mucho más extensa entre los puertos y servicios:

less /usr/share/nmap/nmap-services

Puede ver un extracto de la lista a continuación:

. . .
tcpmux          1/udp   0.001236        # TCP Port Service Multiplexer
compressnet     2/tcp   0.000013        # Management Utility
compressnet     2/udp   0.001845        # Management Utility
compressnet     3/tcp   0.001242        # Compression Process
compressnet     3/udp   0.001532        # Compression Process
unknown         4/tcp   0.000477
rje             5/udp   0.000593        # Remote Job Entry
unknown         6/tcp   0.000502
echo            7/sctp  0.000000
echo            7/tcp   0.004855
echo            7/udp   0.024679
. . .

Además de tener casi 20 mil líneas, este archivo también tiene campos adicionales, como una tercera columna, que enumera la frecuencia de apertura de este puerto descubierta durante escaneos de investigación en Internet.

Cómo escanear puertos con Nmap

Nmap puede revelar mucha información sobre un host. También puede hacer que los administradores del sistema destino piensen que alguien tiene malas intenciones. Por esta razón, solo haga pruebas en servidores que pertenezcan a usted o ejecútelas en ocasiones donde haya notificado a los propietarios.

Si desea hacer pruebas, los creadores de nmap proveen un servidor de prueba ubicado en la siguiente ruta:

scanme.nmap.org

Éste, o sus propios VPS son buenos objetivos para practicar con nmap. Puede ejecutar la forma más básica de Nmap para hacer pruebas con el siguiente comando:

sudo nmap host_remoto

Realice una prueba del comando anterior usando scanme.nmap.org como la dirección del host remoto, obtendrá algo similar a lo siguiente:
Anexo 1 Ejemplo básico Nmap

A continuación algunas operaciones comunes que pueden ser realizadas con nmap. Las ejecutaremos precedidas por el comando sudo para evitar que nos devuelvan resultados incompletos a algunas solicitudes. Algunos comandos pueden tomar cierto tiempo para ejecutarse completamente:

Escanear para averiguar el sistema operativo del host:

sudo nmap -O host_remoto

Puede saltarse la porción de descubrimiento de la red y asumir que el host está en línea. Esto es útil si obtiene una respuesta que dice: "Note: Host seems down" en sus otras pruebas. Para esto se agrega el parámetro -Pn u "omitir Ping":

sudo nmap -Pn host_remoto

Especifique un rango usando guiones "-" o "/24" para escanear varios hosts a la vez:

sudo nmap -Pn xxx.xxx.xxx.xxx-yyy

Escanee un rango de red puede usar el parámetro -sP, este escaneo enumera los hosts activos -o que respondieron a un ping- dentro del rango especificado:

sudo nmap -sP rango_direcciones_IP

Escanee sin hacer una resolución DNS inversa en la dirección IP especificada. Esto debería agilizar sus resultados en mayoría de los casos:

sudo nmap -n host_remoto

Escanee un puerto específico en lugar de todos los puertos comunes:

sudo nmap -p número_de_puerto host_remoto

Una de las tareas más comunes en las que se usa Nmap es para escanear las conexiones TCP; Nmap usa un escaneo tipo TCP connect(), llamado así debido a que los sockets UNIX usan un sistema llamado connect() para comenzar una conexión TCP a un sitio remoto, esto permite un escaneo básico de puertos y da una imagen clara de los puertos a los que puede acceder o no.

sudo nmap -sT host_remoto

Para escanear los puertos UDP Nmap usa la opción -sU, ésta envía paquetes UDP de 0-byte a cada puerto del destino. Si se recibe un mensaje ICMP de puerto inaccesible (Port Unreachable), quiere decir que el puerto está cerrado, de lo contrario se asume que está abierto:

sudo nmap -sU host_remoto

Para escanear cada uno de los puertos abiertos UDP y TCP, puede ejecutar lo siguiente:

sudo nmap -n -Pn -sT -sU -p- host_remoto

Un escaneo "SYN" aprovecha la forma en que TCP establece una conexión.

Para comenzar una conexión TCP, el extremo que hace la solicitud envía un paquete "synchronize request" (solicitud de sincronización) al servidor. El servidor entonces envía un paquete de acuse de recibo de sincronización de vuelta. Finalmente, el emisor original envía otro paquete final de acuse de recibo al servidor, y la conexión es establecida.

Un escaneo tipo "SYN", sin embargo, deja caer la conexión cuando el primer paquete es retornado desde el servidor. Esto se llama escaneo semi-abierto y se usa para hacer un escaneo subrepticio en los puertos, debido a que la aplicación asociada con los puertos no recibiría el tráfico, ya que la conexión nunca es completada.

Ya este método no se considera muy furtivo, debido a la adopción de tipos de firewalls más avanzados y el abanderamiento en solicitudes SYN incompletas que se utiliza en muchas configuraciones actuales.

Para realizar un escaneo "SYN", ejecute:

sudo nmap -sS host_remoto

Una propuesta más furtiva es enviar cabeceras TCP inválidas, lo que -si el host se ajusta a las especificaciones TCP- debería enviar un paquete de vuelta si el puerto está cerrado. Esto funcionará en servidores no basados en Windows.

Puede usar los parámetros "-sF", "-sX" o "-sN". Todos producirán la respuesta que estamos buscando:

sudo nmap -PN -p número_de_puerto -sN host_remoto

Para poder ver qué versión de un servicio está corriendo en un host, puede intentar utilizar este comando. Éste intenta determinar el servicio y la versión probando diferentes respuestas que vengan del servidor:

sudo nmap -PN -p número_de_puerto -sV host_remoto

Hay muchas otras combinaciones de comandos que puede utilizar, pero esto es una introducción bastante completa para explorar las vulnerabilidades de su red.

Conclusión

Comprender la configuración de puertos y cómo descubrir cuáles son los tipos de ataque que pueden afectar a su servidor es solo uno de los pasos para asegurar su información y su VPS. Además es una habilidad esencial.

Descubrir qué puertos están abiertos y qué información puede ser obtenida de los servicios que aceptan conexiones en esos puertos le da la información que usted necesitaría para asegurar su servidor. Cualquier información extraña que se filtre de su maquina puede ser usada por un usuario malicioso para intentar aprovecharse de las vulnerabilidades conocidas o desarrollar algunas nuevas. ¡Mientras menos puedan saber, mejor!

Recursos adicionales

Puede consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...