Bookstore

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:

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

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

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

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

Con la siguiente url vamos a ir al navegador
Al ingresar al navegador a url, obtenemos la siguiente respuesta

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

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/

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.

Desbloqueo de la consola de Python

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:

En una termial nos ponemos con ncat a la escucha para recibir la shell
Escalar Privilegios
Logramos conectarnos a la máquina victima.

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 
Tenemos la validación del número el cual se ingresa:

Esta parte del código es que se valida
Entendemos parte del codigo y la explicamos un poco:
long in_FS_OFFSET;ylong local_10;: Estas son declaraciones de variables.in_FS_OFFSETylocal_10son de tipolong, que generalmente se utiliza para representar números enteros largos.uint local_1c;,uint local_18;,uint local_14;: Estas son otras declaraciones de variables.local_1c,local_18, ylocal_14son de tipouint, que generalmente se usa para representar números enteros sin signo (positivos).local_10 = *(long *)(in_FS_OFFSET + 0x28);: Esto parece ser una operación que establece el valor delocal_10tomando 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.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).local_18 = 0x5db3;: Esto asigna el valor hexadecimal0x5db3a la variablelocal_18.puts("What\'s The Magic Number?!");: Esta línea imprime la cadena "What's The Magic Number?!" en la salida estándar.__isoc99_scanf(&DAT_001008ee, &local_1c);: Esta función lee un valor desde la entrada estándar y lo almacena en la variablelocal_1c.local_14 = local_1c ^ 0x1116 ^ local_18;: Esto realiza operaciones de bits XOR en las variableslocal_1c,0x1116ylocal_18y almacena el resultado enlocal_14.if (local_14 == 0x5dcd21f4) { ... }: Esto compara el valor delocal_14con el valor hexadecimal0x5dcd21f4. 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 
pwned :P
Last updated