Consigues un reverse shell pero es inestable. ¿Cómo lo mejoras?
Respuesta breve
Se lanza un pseudoterminal (normalmente python -c 'import pty; pty.spawn("/bin/bash")'), se envía a segundo plano con Ctrl-Z, se ejecuta stty raw -echo en el lado local, se trae al primer plano y se reinician TERM y el número de filas/columnas. Así obtienes un TTY completo con control de trabajos, autocompletado con tabulador y editores funcionales.
Un reverse shell en crudo obtenido con nc es un shell «rudimentario»: sin control de trabajos, sin autocompletado con tabulador, sin teclas de flecha, y Ctrl-C mata toda la sesión en lugar del comando en ejecución. Herramientas como su, ssh, sudo y los editores de texto se niegan a ejecutarse porque no hay un terminal real adjunto. Pasar a un TTY adecuado es casi obligatorio antes de la escalada de privilegios.
El procedimiento estándar
La secuencia más habitual:
- Lanzar un PTY en el objetivo:
python3 -c 'import pty; pty.spawn("/bin/bash")'. Esto asigna un pseudoterminal para que los programas crean tener un terminal real. - Enviar el shell a segundo plano con
Ctrl-Z. - Corregir tu terminal local:
stty raw -echo; fg. El modo raw transmite las pulsaciones directamente (así Ctrl-C llega al proceso remoto y no a tu nc), y desactivar el eco evita los caracteres duplicados. - Restaurar el entorno:
export TERM=xtermy fijar el tamaño de la ventana constty rows <r> cols <c>para que los editores se muestren correctamente.
Después obtienes autocompletado con tabulador, historial de comandos, un Ctrl-C que solo interrumpe el trabajo en primer plano y las herramientas a pantalla completa.
Cuando falta python
Recurre a script -qc /bin/bash /dev/null, o usa socat para un PTY plenamente interactivo en un solo paso si logras llevar el binario al host. expect y ciertos entornos de ejecución (perl, ruby) también pueden lanzar un PTY.
Por qué importa
Sin un TTY no puedes hacer su a otro usuario, ejecutar sudo ni usar las herramientas interactivas de escalada de privilegios que tumban las máquinas. Esta mejora es el puente entre «tengo ejecución de código» y «puedo trabajar de verdad».
Qué buscan los entrevistadores
Quieren el conjuro exacto —pty.spawn, Ctrl-Z, stty raw -echo, fg y la corrección de TERM— además de la razón de ser de cada paso, y una alternativa para cuando python no está presente.
Posibles preguntas de seguimiento
- ¿Por qué Ctrl-C mata todo tu shell antes de mejorarlo?
- ¿Qué haces si python no está instalado en el objetivo?