Skip to content

Puertos y servicios por defecto

PuertoServicio
21FTP
22SSH
23Telnet
25SMTP
53DNS
80HTTP
110POP3
115SFTP
137, 138, 139NETBIOS
143IMAP
443HTTPS
445SMB
1433MS SQL Server
3306MySQL
3389RDP

Nmap

Escaneo de Top 10 puertos

c
❯ sudo nmap 172.16.50.28 --top-ports=10 
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:36 CEST
Nmap scan report for 172.16.50.28
Host is up (0.021s latency).
PORT     STATE    SERVICE
21/tcp   closed   ftp
22/tcp   open     ssh
23/tcp   closed   telnet
25/tcp   open     smtp
80/tcp   open     http
110/tcp  open     pop3
139/tcp  filtered netbios-ssn
443/tcp  closed   https
445/tcp  filtered microsoft-ds
3389/tcp closed   ms-wbt-server
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
  • --top-ports=N : escanea los N puertos más comunes según la base de datos de nmap.

Enumeración de puertos abiertos UDP

c
❯ sudo nmap 172.16.50.28 -F -sU
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:01 CEST
Nmap scan report for 172.16.50.28
Host is up (0.059s latency).
Not shown: 95 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
137/udp  open          netbios-ns
138/udp  open|filtered netbios-dgm
631/udp  open|filtered ipp
5353/udp open          zeroconf
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Nmap done: 1 IP address (1 host up) scanned in 98.07 seconds
  • -sU : escaneo de puertos UDP.
  • -F : modo rápido, escanea solo los 100 puertos más comunes.

Enumeración detallada de un puerto UDP específico, viendo el paquete enviado/recibido:

c
❯ sudo nmap 172.16.50.28 -sU -Pn -n --disable-arp-ping --packet-trace -p 137 --reason 
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:15 CEST
SENT (0.0367s) UDP 192.168.60.5:55478 > 172.16.50.28:137 ttl=57 id=9122 iplen=78
RCVD (0.0398s) UDP 172.16.50.28:137 > 192.168.60.5:55478 ttl=64 id=13222 iplen=257
Nmap scan report for 172.16.50.28
Host is up, received user-set (0.0031s latency).
PORT    STATE SERVICE    REASON
137/udp open  netbios-ns udp-response ttl 64
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
  • -Pn : no hacer descubrimiento de host previo (asume que está activo), útil cuando el ping está bloqueado.
  • -n : no resolver DNS.
  • --disable-arp-ping : desactiva el ping ARP, obliga a usar el protocolo indicado (UDP en este caso).
  • --packet-trace : muestra los paquetes enviados y recibidos.
  • --reason : indica el motivo por el cual nmap determina el estado del puerto.

Escaneo SYN (Stealth Scan)

El escaneo SYN es la técnica de escaneo TCP más popular de Nmap, y es la opción por defecto cuando no se especifica ninguna otra y el usuario tiene privilegios de socket sin procesar (root/sudo). Consiste en enviar paquetes SYN a los puertos de destino sin completar el three-way handshake: si el puerto está abierto, el objetivo responde con SYN-ACK, y ahí Nmap ya sabe que está abierto sin necesidad de enviar el ACK final.

c
❯ sudo nmap -sS 172.16.50.14

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-09 06:31 EST
Nmap scan report for 172.16.50.14
Host is up (0.11s latency).
Not shown: 989 closed tcp ports (reset)
PORT     STATE SERVICE
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
...
  • Al no completarse el handshake, la conexión nunca llega a la capa de aplicación, por lo que no queda registrada en los logs de la aplicación — solo a nivel de red/firewall si este loguea SYN sueltos.
  • Es más rápido y genera menos tráfico que un escaneo de conexión completa, ya que se envían/reciben menos paquetes por puerto.
  • El término "sigiloso" es en parte histórico: los firewalls modernos sí registran conexiones TCP incompletas, así que no ofrece tanto sigilo real como el nombre sugiere.
  • Este resultado en particular (puertos 88, 389, 445, 3268...) es característico de un controlador de dominio de Active Directory.

Escaneo de conexión TCP (Connect Scan)

Cuando el usuario no tiene privilegios de socket sin procesar, Nmap recurre por defecto a este método, que sí completa el handshake TCP completo usando la API de sockets estándar del sistema operativo. Por esto no requiere privilegios elevados, pero es más lento que un SYN scan porque Nmap debe esperar a que cada conexión se complete.

c
❯ nmap -sT 172.16.50.14

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-09 06:44 EST
Nmap scan report for 172.16.50.14
Host is up (0.11s latency).
Not shown: 989 closed tcp ports (conn-refused)
PORT     STATE SERVICE
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
...
  • Útil cuando se necesita escanear a través de ciertos tipos de proxies, o simplemente cuando no se dispone de privilegios de root.
  • Con solo este escaneo básico ya se puede inferir el sistema operativo y el rol del host (en este caso, otro controlador de dominio).

Escaneo UDP combinado con SYN

-sU (UDP) puede combinarse con -sS (SYN) en un mismo comando para obtener una imagen más completa del objetivo en una sola pasada:

c
❯ sudo nmap -sU -sS 172.16.50.14

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-09 08:16 EST
Nmap scan report for 172.16.50.14
Host is up (0.10s latency).
Not shown: 989 closed tcp ports (reset), 977 closed udp ports (port-unreach)
PORT      STATE         SERVICE
53/tcp    open          domain
88/tcp    open          kerberos-sec
135/tcp   open          msrpc
139/tcp   open          netbios-ssn
389/tcp   open          ldap
445/tcp   open          microsoft-ds
464/tcp   open          kpasswd5
593/tcp   open          http-rpc-epmap
636/tcp   open          ldapssl
3268/tcp  open          globalcatLDAP
3269/tcp  open          globalcatLDAPssl
53/udp    open          domain
123/udp   open          ntp
389/udp   open          ldap
...
  • Para puertos UDP comunes (como el 161 de SNMP), Nmap envía un paquete específico del protocolo en vez de uno vacío, para forzar una respuesta real de la aplicación y reducir los falsos positivos típicos del escaneo UDP.

Network Sweeping (barrido de red)

Para conservar tráfico o gestionar grandes volúmenes de hosts, conviene empezar con escaneos amplios y luego enfocarse en los hosts de interés con escaneos más específicos.

Barrido básico con -sn (no escanea puertos, solo determina si el host está activo). Nmap no se limita a un ping ICMP: también envía un SYN al puerto 443, un ACK al puerto 80 y una solicitud de timestamp ICMP, para maximizar la detección incluso si el ICMP está bloqueado:

c
❯ nmap -sn 172.16.50.1-253

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-10 03:19 EST
Nmap scan report for 172.16.50.6
Host is up (0.12s latency).
Nmap scan report for 172.16.50.8
Host is up (0.12s latency).
...
Nmap done: 254 IP addresses (13 hosts up) scanned in 3.74 seconds

Guardando en formato "greppable" (-oG) para filtrar fácilmente los hosts activos con grep en vez de parsear la salida normal:

c
❯ nmap -v -sn 172.16.50.1-253 -oG ping-sweep.txt
❯ grep Up ping-sweep.txt | cut -d " " -f 2

172.16.50.6
172.16.50.8
172.16.50.9
...

Barrido dirigido a un puerto específico (más preciso que un ping sweep, ya que confirma directamente si el servicio está activo):

c
❯ nmap -p 80 172.16.50.1-253 -oG web-sweep.txt
❯ grep open web-sweep.txt | cut -d" " -f2

172.16.50.6
172.16.50.20
172.16.50.21

Barrido de los 20 puertos más comunes en todo un rango, con detección de versión, scripts por defecto y traceroute (-A):

c
❯ nmap -sT -A --top-ports=20 172.16.50.1-253 -oG top-port-sweep.txt

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-10 04:04 EST
Nmap scan report for 172.16.50.6
Host is up (0.12s latency).

PORT     STATE  SERVICE       VERSION
21/tcp   closed ftp
22/tcp   open   ssh           OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 56:57:11:b5:dc:f1:13:d3:50:88:b8:ab:a9:83:e2:29 (RSA)
|   256 4f:1d:f2:55:cb:40:e0:76:b4:36:90:19:a2:ba:f0:44 (ECDSA)
|_  256 67:46:b3:97:26:a9:e3:a8:4d:eb:20:b3:9b:8d:7a:32 (ED25519)
23/tcp   closed telnet
25/tcp   closed smtp
53/tcp   closed domain
80/tcp   open   http          Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Under Construction
110/tcp  closed pop3
111/tcp  closed rpcbind
...
  • Los "20 puertos principales" se determinan a partir del archivo /usr/share/nmap/nmap-services, que lista cada servicio con su frecuencia histórica de aparición abierto en internet (tres columnas: nombre, puerto/protocolo, frecuencia).
c
❯ cat /usr/share/nmap/nmap-services | grep -w "^http\|^hosts2-ns"

http    80/sctp    0.000000    # www-http | www | World Wide Web HTTP
http    80/tcp    0.484143    # World Wide Web HTTP
http    80/udp    0.035767    # World Wide Web HTTP
hosts2-ns    81/tcp    0.012056    # HOSTS2 Name Server
hosts2-ns    81/udp    0.001005    # HOSTS2 Name Server

OS Fingerprinting

Nmap puede intentar identificar el sistema operativo del objetivo inspeccionando particularidades de la pila TCP/IP (TTL por defecto, tamaño de ventana TCP, etc.), que varían ligeramente entre sistemas operativos.

c
❯ sudo nmap -O 172.16.50.14 --osscan-guess

...
Running (JUST GUESSING): Microsoft Windows 2019|2012|10|2016|2022|7|2008|8.1 (93%)
OS CPE: cpe:/o:microsoft:windows_server_2012:r2 cpe:/o:microsoft:windows_10 cpe:/o:microsoft:windows_server_2016 cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_server_2008 cpe:/o:microsoft:windows_8.1
Aggressive OS guesses: Microsoft Windows Server 2019 (93%), Microsoft Windows Server 2012 R2 (89%), Microsoft Windows 10 1909 (88%), Microsoft Windows Server 2012 Data Center (88%), Microsoft Windows Server 2016 (88%), Microsoft Windows Server 2022 (87%), Microsoft Windows 7 SP1 or Windows Server 2008 (85%), Microsoft Windows 7 Ultimate (85%), Microsoft Windows 8.1 (85%)
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
...
  • -O : activa la identificación de sistema operativo.
  • --osscan-guess : fuerza a Nmap a mostrar su mejor estimación aunque la huella no sea 100% precisa (por defecto solo muestra resultados de alta confianza).
  • La detección puede fallar o ser imprecisa si hay firewalls/proxies en el camino que reescriben cabeceras de los paquetes.
c
❯ nmap -sT -A 172.16.50.14

Nmap scan report for 172.16.50.14
Host is up (0.12s latency).
Not shown: 996 closed tcp ports (conn-refused)
PORT    STATE SERVICE       VERSION
21/tcp  open  ftp?
| fingerprint-strings:
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, NULL, RPCCheck, SSLSessionReq, TLSSessionReq, TerminalServerCookie:
|     220-FileZilla Server 1.2.0
|     Please visit https://filezilla-project.org/
|   GetRequest:
|     220-FileZilla Server 1.2.0
|     Please visit https://filezilla-project.org/
|     What are you trying to do? Go away.
|   Help:
|     220-FileZilla Server 1.2.0
|     Please visit https://filezilla-project.org/
|     214-The following commands are recognized.
|     USER TYPE SYST SIZE RNTO RNFR RMD REST QUIT
|     HELP XMKD MLST MKD EPSV XCWD NOOP AUTH OPTS DELE
|     CDUP APPE STOR ALLO RETR PWD FEAT CLNT MFMT
|     MODE XRMD PROT ADAT ABOR XPWD MDTM LIST MLSD PBSZ
|     NLST EPRT PASS STRU PASV STAT PORT
|_    Help ok.
| ftp-syst:
|_  SYST: UNIX emulated by FileZilla.
| ssl-cert: Subject: commonName=filezilla-server self signed certificate
| Not valid before: 2022-01-06T15:37:24
|_Not valid after:  2023-01-07T15:42:24
|_ssl-date: TLS randomness does not represent time
135/tcp open  msrpc         Microsoft Windows RPC
139/tcp open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp open  microsoft-ds?
Nmap done: 1 IP address (1 host up) scanned in 55.67 seconds
  • -A : combina detección de versión, scripts por defecto (-sC), OS fingerprinting y traceroute en un solo escaneo.
  • -sV (sin -A) : hace solo la detección de versión de servicio, más liviano.
  • Los banners pueden ser modificados intencionalmente por administradores para mostrar información falsa y confundir a un atacante — no hay que confiar ciegamente en ellos, conviene validar con otras técnicas (comportamiento del protocolo, respuestas a comandos específicos, etc.).

Nmap Scripting Engine (NSE)

Permite ejecutar scripts (propios o incluidos con Nmap) para automatizar tareas de enumeración, fuerza bruta o detección de vulnerabilidades. Los scripts están en /usr/share/nmap/scripts/.

c
❯ nmap --script http-headers 172.16.50.6

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-10 13:53 EST
Nmap scan report for 172.16.50.6
Host is up (0.14s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
| http-headers:
|   Date: Thu, 10 Mar 2022 18:53:29 GMT
|   Server: Apache/2.4.41 (Ubuntu)
|   Last-Modified: Thu, 10 Mar 2022 18:51:54 GMT
|   ETag: "d1-5d9e1b5371420"
|   Accept-Ranges: bytes
|   Content-Length: 209
|   Vary: Accept-Encoding
|   Connection: close
|   Content-Type: text/html
|
|_  (Request type: HEAD)

Nmap done: 1 IP address (1 host up) scanned in 5.11 seconds

Ver ayuda de un script específico (descripción, categoría y enlace a documentación con ejemplos de uso y argumentos):

c
❯ nmap --script-help http-headers

Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-10 13:54 EST

http-headers
Categories: discovery safe
https://nmap.org/nsedoc/scripts/http-headers.html
  Performs a HEAD request for the root folder ("/") of a web server and displays the HTTP headers returned.
...
  • Si no hay acceso a internet, gran parte de esta información también puede consultarse leyendo directamente el archivo .nse del script.
  • Vale la pena explorar la carpeta de scripts (ls /usr/share/nmap/scripts/), ya que hay cientos disponibles agrupados por categoría (auth, brute, discovery, exploit, vuln, etc.) — se puede filtrar por categoría con --script-args o combinando varias con --script "discovery and safe".

Escaneo desde Windows (Living off the Land)

En un escenario de post-explotación donde solo se dispone de un host Windows comprometido (sin Kali ni Nmap disponibles, y sin acceso a internet para instalar herramientas), se puede recurrir a funciones nativas de PowerShell para hacer un escaneo de puertos básico. Esto entra dentro de las técnicas "Living off the Land" (LOLBAS): usar herramientas legítimas ya presentes en el sistema para fines de reconocimiento.

Test-NetConnection

Comprueba si una IP responde a ICMP y si un puerto TCP específico del host de destino está abierto:

c
PS C:\Users\student> Test-NetConnection -Port 445 172.16.50.14

ComputerName     : 172.16.50.14
RemoteAddress    : 172.16.50.14
RemotePort       : 445
InterfaceAlias   : Ethernet0
SourceAddress    : 172.16.50.15
TcpTestSucceeded : True
  • TcpTestSucceeded : True confirma que el puerto (en este ejemplo, 445 de SMB) está abierto y aceptando conexiones.
  • Es la forma más simple de comprobar un puerto puntual, equivalente a un ping + prueba TCP en una sola función.

Escaneo de rango de puertos con PowerShell

Automatizando la comprobación de múltiples puertos con un bucle, instanciando directamente un objeto TcpClient (más liviano que llamar a Test-NetConnection en cada iteración):

c
PS C:\Users\student> 1..1024 | % {echo ((New-Object Net.Sockets.TcpClient).Connect("172.16.50.14", $_)) "TCP port $_ is open"} 2>$null

TCP port 88 is open
...
  • El bucle 1..1024 genera los números de puerto a probar; % es el alias de ForEach-Object.
  • Por cada puerto, se intenta una conexión TCP directa; si tiene éxito, se imprime el mensaje de "puerto abierto". 2>$null descarta los errores de conexión (puertos cerrados), dejando solo los resultados positivos en pantalla.
  • Esta base se puede extender fácilmente: agregar un timeout por conexión (para no colgarse en puertos filtrados), exportar resultados a un archivo con Out-File, o paralelizar con Start-Job/ForEach-Object -Parallel (PowerShell 7+) para acelerar el escaneo en rangos grandes.

Nota sobre alcance y ruido en la red

Un escaneo de los 1000 puertos por defecto de Nmap genera relativamente poco tráfico (decenas de KB por host), pero un escaneo completo de los 65535 puertos TCP puede generar varios MB de tráfico por host — en una red clase C completa (254 hosts) esto se traduce fácilmente en más de 1000 MB de tráfico total. Herramientas más rápidas como Masscan o RustScan logran escanear rangos grandes mucho más rápido que Nmap, pero a costa de generar tráfico concurrente mucho más agresivo y ruidoso; Nmap, en cambio, aplica cierta limitación de velocidad por defecto, lo que lo hace más discreto pero más lento.

El nivel de sigilo necesario depende del tipo de ejercicio: en un pentest tradicional el foco suele estar en identificar vulnerabilidades y configuraciones erróneas, con menos énfasis en evadir detección; en un ejercicio de red team, en cambio, el sigilo es central porque el objetivo incluye evaluar la capacidad de detección y respuesta del SOC del cliente.

El escaneo de puertos es el proceso de inspeccionar puertos TCP o UDP en una máquina remota con la intención de detectar qué servicios se están ejecutando y qué posibles vectores de ataque pueden existir.

Nota: el escaneo de puertos no representa la actividad habitual de un usuario y podría considerarse ilegal en algunas jurisdicciones. No debe realizarse fuera de entornos de laboratorio sin autorización expresa y por escrito del propietario de la red objetivo.

Es fundamental comprender las implicaciones del escaneo de puertos y el impacto que pueden tener escaneos específicos. Debido a la cantidad de tráfico que algunos escaneos pueden generar, junto con su naturaleza intrusiva, ejecutar escaneos a ciegas puede tener efectos adversos en los sistemas objetivo (sobrecargar servidores/enlaces de red, o activar un IDS/IPS). Un escaneo incorrecto podría ocasionar interrupciones en el servicio del cliente.

Usar una metodología adecuada mejora la eficiencia y limita los riesgos: en vez de escanear la red completa de una vez, se puede empezar por los puertos 80/443, identificar posibles servidores web, y luego lanzar escaneos más completos en segundo plano mientras se sigue enumerando. El escaneo de puertos debe entenderse como un proceso dinámico: los resultados de un escaneo determinan el tipo y alcance del siguiente.

Netcat no es un escáner de puertos dedicado, pero al estar presente en la mayoría de los sistemas, puede reutilizarse para simular un escaneo básico cuando no se dispone de una herramienta completa como nmap.

Netcat como escáner de puertos

El escaneo de puertos es el proceso de inspeccionar puertos TCP o UDP en una máquina remota con la intención de detectar qué servicios se están ejecutando y qué posibles vectores de ataque pueden existir.

Nota: el escaneo de puertos no representa la actividad habitual de un usuario y podría considerarse ilegal en algunas jurisdicciones. No debe realizarse fuera de entornos de laboratorio sin autorización expresa y por escrito del propietario de la red objetivo.

Netcat no es un escáner de puertos dedicado, pero al estar presente en la mayoría de los sistemas, puede reutilizarse para simular un escaneo básico cuando no se dispone de una herramienta completa como Nmap.

Escaneo TCP con Netcat (CONNECT scan)

La técnica más simple de escaneo TCP se basa en el three-way handshake: el host envía un paquete SYN al puerto de destino; si el puerto está abierto, el servidor responde con SYN-ACK y el cliente completa el handshake con un ACK. Si el protocolo de enlace se completa, el puerto se considera abierto.

c
❯ nc -nvv -w 1 -z 172.16.50.28 3388-3390

(UNKNOWN) [172.16.50.28] 3390 (?) : Connection refused
(UNKNOWN) [172.16.50.28] 3389 (ms-wbt-server) open
(UNKNOWN) [172.16.50.28] 3388 (?) : Connection refused
 sent 0, rcvd 0
  • -w 1 : tiempo de espera de la conexión, en segundos.
  • -z : modo de E/S cero (zero-I/O), usado exclusivamente para escanear — no envía datos, solo comprueba si la conexión se establece.
  • -v / -vv : verbosidad (para ver también los puertos cerrados/rechazados, no solo los abiertos).

Según el resultado, el puerto 3389 está abierto, mientras que 3388 y 3390 fueron rechazados. En una captura de Wireshark de este mismo escaneo se vería: Netcat envía SYN a los tres puertos; el servidor responde con SYN-ACK solo desde el puerto 3389 (confirmando que está abierto); los otros dos puertos rechazan la conexión con un paquete RST-ACK; y finalmente Netcat cierra la conexión abierta enviando un FIN-ACK.

Escaneo UDP con Netcat

A diferencia de TCP, UDP no tiene estado y no requiere three-way handshake, por lo que el mecanismo de detección es distinto. Se usa la opción -u para indicar un escaneo UDP:

c
❯ nc -nv -u -z -w 1 172.16.50.30 120-123

(UNKNOWN) [172.16.50.30] 123 (ntp) open

Aquí se envía un paquete UDP vacío a cada puerto. Si el puerto está abierto, el paquete se pasa a la capa de aplicación, y la respuesta (si la hay) depende de cómo esté programada esa aplicación para reaccionar a paquetes vacíos — en este ejemplo, el puerto 123 (NTP) no envía ninguna respuesta, pero Netcat lo reporta como abierto porque no recibió un rechazo. Si el puerto UDP de destino está cerrado, el sistema normalmente responde con un mensaje ICMP port unreachable, enviado por la pila UDP/IP del target.

Limitaciones del escaneo UDP

  • Poco fiable: firewalls y routers suelen descartar paquetes ICMP, lo que genera falsos positivos (puertos reportados como abiertos cuando en realidad están filtrados/cerrados). La ausencia del mensaje ICMP de "puerto inalcanzable" se interpreta como "puerto abierto", pero también puede significar simplemente que el paquete fue silenciosamente descartado por un firewall.
  • Cobertura parcial: muchos escáneres UDP solo prueban una lista predefinida de "puertos de interés" en vez de todo el rango, por lo que puertos UDP abiertos pueden pasar desapercibidos.
  • Suele omitirse: es común que los pentesters se centren solo en puertos TCP por ser "más interesantes", dejando de lado vectores de ataque reales detrás de puertos UDP abiertos.
  • Mayor tráfico en TCP: un escaneo TCP genera bastante más tráfico que uno UDP, debido a la sobrecarga del handshake y las retransmisiones de paquetes — algo a tener en cuenta al planificar el escaneo según el ancho de banda disponible.

/dev/tcp

Para la enumeración de puertos, se puede hacer uso del recurso /dev/tcp, que aunque en la consola nos dirá que no existe, sí existe (o al menos entendiéndolo así; esto tiene otra explicación, pero esa no es la finalidad de este post).

Si enviamos un comando vacío a la ruta /dev/tcp/<IP>/<PUERTO>, no tendremos ningún output si el puerto está activo, pero podremos ver el código de estado de salida ($?). Este código nos servirá para saber si el puerto está o no abierto:

  • 0 → el puerto está abierto (conexión exitosa).
  • Distinto de 0 → el puerto está cerrado o filtrado (conexión rechazada).

Ejemplo de cuando el puerto 53 está activo:

c
❯ echo '' > /dev/tcp/192.168.98.1/53
❯ echo $?
0

Ejemplo de cuando el puerto 577 no está activo:

c
❯ echo '' > /dev/tcp/192.168.98.1/577
bash: connect: Conexión rehusada
bash: /dev/tcp/192.168.98.1/577: Conexión rehusada
❯ echo $?
1

Una vez entendido el concepto, podemos agregar 2>/dev/null para redirigir el output del stderr (los mensajes de error), y así quedarnos solo con el resultado que nos interesa (el código de salida). Entonces tendremos las dos formas:

  1. Cuando el puerto no está activo:
c
❯ echo '' > /dev/tcp/192.168.98.1/577 2>/dev/null; echo $?
1
  1. Cuando el puerto está activo:
c
❯ echo '' > /dev/tcp/192.168.98.1/53 2>/dev/null; echo $?
0

Escaneo de puertos con un bucle

Aprovechando lo anterior, se puede armar un escáner de puertos básico sin depender de herramientas externas como nmap, útil en entornos donde no está instalado:

c
for port in 21 22 23 25 53 80 110 143 443 445 3306 3389; do
    (echo '' > /dev/tcp/192.168.98.1/$port) 2>/dev/null && echo "Puerto $port abierto"
done
Puerto 22 abierto
Puerto 53 abierto
Puerto 80 abierto
  • Este método es más lento y menos fiable que nmap (no distingue puertos filtrados, no hace fingerprinting de servicios), pero es útil como alternativa rápida cuando solo se dispone de bash.