Tutorial de Zipping máquina Hackthebox
- Codigo Malicioso
- Maquinas Hackthebox
- 07 Jan, 2024
Al lanzar nmap nos encontramos con una web en el puerto 80 y un servidor ssh en el puerto 22.
Siguiendo la costumbre de otras máquinas, y para ahorrar tiempo pues estamos ante un CTF, lo lógico es pensar que debemos encontrar alguna vulnerabilidad en la parte web que nos permita ganar un usuario y acceder por ssh para escalar privilegios.
Así que inspeccionamos la web, la cual, presenta muy pocos links con opciones haciendo que todo sea más ágil.
Encontramos tres páginas interesantes:
- Página de tienda
- Página del carrito de compra
- Página de trabaja con nosotros
Página de tienda
Por una parte, tenemos una tienda que en la url, incluye otras paginas para mostrarlas. Así:
http://10.10.11.229/shop/index.php?page=products -> nos mostrará la pagina de productos
Además, la página “products” acepta otro parámetro adicional:
http://10.10.11.229/shop/index.php?page=products&id=3 para mostrar un producto.
Aquí ya podríamos tratar de buscar inyecciones, pero sobretodo lo veo interesante de cara a ejecutar algún payload que podamos subir a la web y tratestear en busca de LFI.
Página del carrito de compra
http://10.10.11.229/shop/index.php?page=cart -> nos mostrará la página del carrito de compra.
Esta página es interesante pues recibe productos y trabaja con la base de datos. Hay mucho que trabajar aquí.
Página de trabaja con nosotros
Lo segundo que nos llama la atención, es la página de trabaja con nosotros.
http://10.10.11.229/upload.php
En esta pagina, nos dice algunas que podemos subir un archivo en zip (con nuestro supuesto currículum) y que debe contener un pdf.
La máquina se llama zipping así que todo parece indicarnos que esta página debe darnos algún fruto y será el primer lugar donde vamos a iniciar nuestros pruebas y tests pues parece lo más obvio.
Así que tras una breve revisión del código fuente de la página para ver si encontramos algo que nos pueda dar más información sobre el sistema que va por debajo, iniciamos una búsqueda en google sobre vulnerabilidades zip en la web.
Aquí quiero hacer un stop, pues en el código fuente si encontramos un enlace al que parece, es el autor de la máquina. Quiero dejar aquí el link a su página para agradecerle el tiempo dedicado en la creación de la misma: https://xdann1.github.io/about/
Gracias xdann1 ;-)
Empezamos la búsqueda, y la primera página en la que aterrizo encuentro lo siguiente:
https://www.hackingloops.com/zip-slip-abusing-file-uploads-to-get-rce/
Dice así:
Zip Slip es una vulnerabilidad potencial dentro de las aplicaciones web donde una biblioteca utilizada para realizar la extracción de archivos no desinfecta adecuadamente los nombres de los archivos. Si se crea un archivo malicioso con un nombre de archivo transversal de directorio, utilizando caracteres como ../, una biblioteca vulnerable extraerá archivos fuera del directorio de destino donde deberían residir.
El impacto de una vulnerabilidad Zip Slip permitiría a un atacante crear o sobrescribir archivos existentes en el sistema de archivos. En el contexto de una aplicación web, se podría colocar un shell web dentro del directorio de la aplicación para lograr la ejecución del código.
Ya tenemos un primera parte. Podemos tratar de crear un archivo con un payload malicioso y subirlo. No obstante, puede que no sea tan fácil, pues solo nos permite usar pdf’s y si no conseguimos saltar este filtro, la vulnerabilidad no nos servirá.
En cambio, lo bueno es que la aplicación nos ofrece un link al archivo descomprimido subido:
Tras unas pruebas iniciales sin éxito, decido investigar más sobre las vulnerablidades con zip y hay una que me llama poderosamente la atención: zip symlink vulnerablidad, de la que puedes leer aquí:
https://effortlesssecurity.in/zip-symlink-vulnerability/
Con esta vulnerabildad, podemos crear un archivo pdf con un link simbolico a diferentes páginas de la aplicación y debería permitir que leyeramos su código.
Sabemos que estamos ante una máquina linux, así que vamos a probar si conseguimos que funcione tal y como esta explicado en la página mencionada, aunque nosotros añadiremos algo:
ln -s ../../../../../../../../../../../../../etc/passwd pass.pdf
zip -r --symlinks pass.zip pass.pdf
Con esto, obtenemos el archivo zip malicioso, lo subimos y accedemos al link que nos muestra un precioso pdf en blanco:
Sin embargo, nuestro burp, nos muestra un merecido /etc/passwd
Es momento de hacer un stop, y de empezar a investigar más sobre la aplicación descargando archivos y buscando información interesante para saber más de la aplicación. El archivo que carga los pdf’s debería importante para nosotros. La página que hemos visto antes que manejaba un parámetro id que tenemos pendiente de probar, también y en definitiva, cualquier archivo de configuración.
Así que vamos a hacer algo de fuerza bruta en los directorios para encontrar archivos que nos interesen y tratar de ir extrayendo información para encontrar otra vulnerabilidad, unas credenciales, y demás.
Para los archivos de la web, y viendo que la ruta al archivo pdf subido esta dos directorios por debajo de la principal, bastará con crear simlinks de tipo ../../upload.php para leerlos.
Otra cosa que podemos hacer, es indagar el archivo passwd y ver si encontramos algún flag directamente con los home de los usuarios que haya.
Al final consigo información, pero siempre usando la ruta entera: ../../../../../../../var/www/html para lo que sea del servidor. Por ejemplo, aquí tenemos el archivo cart.php
Al ver el ćodigo la página cart.php podemos ver que el parámetro id se pasa sin sanitizar cuando añadimos un producto al carro.
Esta sería la petición que POST que pasa los productos al carro:
Y este el código que la procesa.
Como podemos ver, la variable &_POST[‘product_id’] se pasa sin filtrar al construirse la query $sql:
if (isset($_POST['product_id'], $_POST['quantity'])) {
$product_id = $_POST['product_id'];
$quantity = $_POST['quantity'];
if(preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}\[\]\\|;:'\",.<>\/?]|[^0-9]$/", $product_id, $match) || preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}[\]\\|;:'\",.<>\/?]/i", $quantity, $match)) {
echo '';
} else {
// La variable $_POST['product_id'] se pasa sin filtrar.
$sql = "SELECT * FROM products WHERE id = '" . $_POST['product_id'] . "'";
$product = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
if ($product && $quantity > 0) {
if (isset($_SESSION['cart']) && is_array($_SESSION['cart'])) {
if (array_key_exists($product_id, $_SESSION['cart'])) {
$_SESSION['cart'][$product_id] += $quantity;
} else {
$_SESSION['cart'][$product_id] = $quantity;
}
} else {
$_SESSION['cart'] = array($product_id => $quantity);
}
}
header('location: index.php?page=cart');
exit;
}
}
Ahora pues, no toca trabajar con las inyecciones sql. Una que sería especialmente útil sería si puideramos crear un archivo php malicioso en la web que nos devolvíera un shell reverso.