Bookstore
Last updated
Last updated
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
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.
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
En el puerto 80
tenemos lo siguiente:
En el puerto 5000
tenemos una REST API
, en la cual enumeraremos con fuzzing
wfuzz
reporta dos directorios:
api
console
Abrimos el navegador web con la ruta que encontramos y nos encontramos lo siguiente:
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
Al ingresar el parametro la ruta de un arcchivo, este nos permite leer el contenido de dicho fichero.
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.
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
Logramos conectarnos a la máquina victima.
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
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;
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.
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).
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.
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 hexadecimal 0x5db3
a la variable local_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 variable local_1c
.
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
.
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:
pwned :P
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
Una vez teniendo el número podemos ingesar y ejecutar bash -p
para elevar nuestro privilegios y ser el usuario root