Bookstore

20231010180345.png

Metodología

  • Escaneo de red

  • Enumeración

    • Enumeración del servicio HTTP en el puerto 80

    • Enumeración del sercicio HTTP en el puerto 5000

    • Fuerza bruta de directorios

    • Fuzzing de la API

    • LFI

  • Explotación

    • Explotación del LFI

    • Desbloqueo de la consoloa de Python

    • Obtener una shell

  • Escalar Privilegios

    • Ingeniería inversa y obtención del numero mágico

    • Obtención de la shell como root

Walkthrough

Empezamos haciendo un ping para verificar la canectividad con la maquina y tambien tener en cuenta el tipo de sistema operativo al que nos enfrentamos

A través del ttl podemos saber que es una maquina linux.

Enumeración de red

Realizamos un sacaneo con nmap -sC: scripts por defecto de nmap -sV: enumeración de servicios

La herramienta de nmap reporta tres puerto abiertos de los cuales uno parece ser una api

Enumeración

Puerto 80

En el puerto 80 tenemos lo siguiente:

20230920005343.png

Puerto 5000

En el puerto 5000 tenemos una REST API, en la cual enumeraremos con fuzzing

Fuzzing de directorios

wfuzz reporta dos directorios:

  • api

  • console

20230920011242.png

Abrimos el navegador web con la ruta que encontramos y nos encontramos lo siguiente:

20230920012506.png

Fuzzing de la Api

Vemos una ruta /api/v2 en la que podemos inferir que v2 es la version de la api, asi que creamos una lista con numeros con el siguiente comando:

Una vez creado la lista, vamos a realizar fuzzing.

En el fuzzing nos reporta v1, la cual la usaremos

20230922114507.png

Ahora vamos a realizar otro fuzzing para buscar los posibles parametros los cuales podemos usar para seguir enumerando

Encontramos un parametro diferente a los que ya nos habiamos encontrado anteriormente, el cual es show

20230923010401.png

Con la siguiente url vamos a ir al navegador

Al ingresar al navegador a url, obtenemos la siguiente respuesta

20230923013239.png

LFI

Al ingresar el parametro la ruta de un arcchivo, este nos permite leer el contenido de dicho fichero.

20230923013457.png

Explotación

Explotación del LFI

Ahora vamos a intentar leer algunos archivos del sistema que puedem ser interesantes y que contengan credenciales, uno de estos es el /etc/passwd/

20230923013524.png

Después de estar buscando archivos que puedan tener alguna credencial o información valiosa para tener acceso al servidor, nos encontramos con lo siguiente:

Pudimos leer el archivo .bash_history, el cual contiene un PIN que podemos probar en otra ruta de la pagina web.

20230924003154.png

Desbloqueo de la consola de Python

20230924003526.png

Obteniendo una shell

Tenemos una manera de ejecutar comandos y poder enviarnos una shell desde la máquina víctima

Con el siguiente codigo en python nos enviaremos una shell a nuestra máquina revershell

Ejecutamos el comado:

20230924004010.png

En una termial nos ponemos con ncat a la escucha para recibir la shell

Escalar Privilegios

Logramos conectarnos a la máquina victima.

20230924004350.png

Usuario sid

En la carpeta del usuario podemos encontrar un binario, para entender el funcionamiento de este binario necesitamos ejecutarlo. Al ejecutar dicho binario nos pide un numero, el cual no sabemos

  • binario : try-harder

Ghidra

Con la herramienta ghidra vamos a ejecutar y cargar el binario. Realizamos el análisis del binario try_harder y en un apartado podemos observar lo siguiente 20230925225015.png

Tenemos la validación del número el cual se ingresa:

20230925225040.png

Esta parte del código es que se valida

Entendemos parte del codigo y la explicamos un poco:

  1. long in_FS_OFFSET; y long local_10;: Estas son declaraciones de variables. in_FS_OFFSET y local_10 son de tipo long, que generalmente se utiliza para representar números enteros largos.

  2. uint local_1c;, uint local_18;, uint local_14;: Estas son otras declaraciones de variables. local_1c, local_18, y local_14 son de tipo uint, que generalmente se usa para representar números enteros sin signo (positivos).

  3. local_10 = *(long *)(in_FS_OFFSET + 0x28);: Esto parece ser una operación que establece el valor de local_10 tomando el valor almacenado en la dirección de memoria (in_FS_OFFSET + 0x28). Esto puede estar relacionado con la gestión de excepciones o la estructura de la pila en un programa.

  4. setuid(0);: Esta función establece el ID de usuario efectivo del proceso en 0, lo que significa que el proceso se ejecutará con privilegios de superusuario (root).

  5. local_18 = 0x5db3;: Esto asigna el valor hexadecimal 0x5db3 a la variable local_18.

  6. puts("What\'s The Magic Number?!");: Esta línea imprime la cadena "What's The Magic Number?!" en la salida estándar.

  7. __isoc99_scanf(&DAT_001008ee, &local_1c);: Esta función lee un valor desde la entrada estándar y lo almacena en la variable local_1c.

  8. local_14 = local_1c ^ 0x1116 ^ local_18;: Esto realiza operaciones de bits XOR en las variables local_1c, 0x1116 y local_18 y almacena el resultado en local_14.

  9. if (local_14 == 0x5dcd21f4) { ... }: Esto compara el valor de local_14 con el valor hexadecimal 0x5dcd21f4. Si son iguales, se ejecutará el código en el bloque { ... }, que en este caso ejecuta un shell de Bash con privilegios (system("/bin/bash -p")).

Lo que necesitamos es obtener el número para poder ejecutar system("/bin/bash -p"). Entendiendo el anterior codigo podemos realizar una ecuación

La ecuación quedaría de la siguiente manera

Reemplazando los valores se tendria lo siguiente:

Usuario Root

Una vez teniendo el número podemos ingesar y ejecutar bash -p para elevar nuestro privilegios y ser el usuario root 20230926003143.png

pwned :P

Last updated