Всем привет. Хотелось бы начать цикл статей по погружению в пентест AD. Эта тема для меня новая, активно начал курить ее всего пару недель назад. Поэтому если вы новичок, то можно сказать мы будем обучаться с вами совместно)))
Поэтому если, вы давно хотели, но не решлись взяться за это дело, то самое время) Так как наш путь только начинается, то возможно я буду допускать ошибки, неточности и т.д, поэтому прошу более опытных людей писать об этом в комментариях.
Моя главная цель не научить кого-то(потому что я сам еще почти ничего не знаю), а научиться самому. Так или иначе здесь могут попадаться отрывки из других общедоступных источников, по типу zer1t0 . Но я постараюсь представить контент через призму своего понимания, осветить вопросы, которые возникали и возникают у меня по мере изучения. Ладно, харош пиздеть ближе к делу.
И так, я предполагаю, что у вас установлена небольшая AD лаборатория (2-4 машины). И вы уже знаете для чего нужна сама Active Directory. Тут нет ничего сложного, если еще нет, то сделайте это сейчас.
AD это достаточно сложная и централизованная система. В ее основе лежит база данных. Она распологается на контроллерах домена по пути %windir%\NTDS\ntds.dit, пример (C:\Windows\NTDS\ntds.dit).
База данных одна, но при ее изменении ее у одного DC(контроллер домена), он рассылает информацию другим, тоесть информация во всех ntds.dit, на разных DC станет одинаковой.
По сути база содержит в себе всю информацию об объектах и их свойствах. И пользователи домена могут свободно запрашивать ее(например по протоколу LDAP, но о нем позже).
Есть много инструментов, чтобы делать такие запросы. Мы даже можно написать свой! Но предлагаю для начала остановится на официальном модуле для powershell'a
Покажет установлен ли модуль. Эта команда требует админских прав. Если их нет, то просто введите Get-ADDomain. Если видим, как на скриншоте - модуль не установлен.
Если нет, то установим его
Если я все правильно помню, то на серверных ОС он установлен по дефолту.
Но так как мы пришли сюда за пентестом (а не просто поадминить), то нам нужно получить к нему доступ более скрытно. Для этого мы можем либо
1)Установить его на свою машину, перенести C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ActiveDirectory.Management.dll на скомпрометированную и импортировать (Import-Module). Но такой подход у меня работает не всегда...
2)Использовать github.com/samratashok/ADModule - позволяет в одну команду получить модуль. 4 детекта на VT
Отлично, приступим к разведке.
Здесь много непонятной информации, но важно понять что в базе хранятся объекты и у них есть свойства.
Посмотреть какие бывают типы объектов (или говоря языком майкрософта classes) - https://docs.microsoft.com/en-us/windows/win32/adschema/classes-all
Теперь когда мы узнали какие вообще бывают объекты самое время глянуть на их свойства. Тут и ниже, если используются более 1 варианта команды, значит с ней проблемы. Если 1 не работает у вас, пробуйте другие. Здесь показываются не все свойства, лучше глянуть на сайте майкрософта. https://docs.microsoft.com/en-us/windows/win32/adschema/classes-all
Здесь например показаны свойства объекта юзера, как видно, здесь много полезного по типу badPwdCount,Description,lastLogoff,pwdLastSet и т.д. Думаю по названию понятно что они означают.
На первый взгляд может быть непонятно какая нам от них польза. Но pwdlastset может помочь нам при проведении password spraying. А в описании(Description) часто хранится полезная информация, возможно даже пароли. Я верю в такое мало, но т.к. еще не имею опыт боевого пентеста, то пускай лучше знающие люди напишут в комментариях.
Теперь, когда для нас перестало быть магией то, как хранится информация об объектах в AD пришло время найти более удобный способ ее запрашивать.
Есть достаточно много тулзов, который требуют от нас всего пару кликов для получения исчерпывающей информации об окружении (да-да я про бладхаунд), но для понимая следует(наверное) уметь все делать ручками.
Поэтому вот небольшой список самых базовых команд для первоначального перечисления.
А посмотреть полный список экспортируемых команд из AD модуля можно так.
Рекомендую самостоятельно разобраться какую информацию может предоставить нам каждая из команд.
Важно понимать, что все, что происходит при использовании этих команд - лишь запрос к базе. Например Get-ADComputer. Мы делаем LDAP запрос к базе и нам возвращаются куча компьютеров. Но не факт, что они все сейчас включены или даже существуют физически. Это всего лишь строчки в БД. Даже мы сами можем добавить их в базу.
Конечно, это даст только первоначальное представление о сети, но я думаю все согласятся, что все не может так просто)))
Плюсы такого подхода, что мы используем легитимный подписанный модуль и эти запросы выполяются в большинстве своем через не менее легитимный ldap протокол. Минусы, что возможностей для маневра( в сравнении с тем же powerview, про него напишу отдельно) не очень много.
Но я думаю, что EDR заметит что-то странное, если вдруг с обычного ПК начнут поступать множественные запросы по перечеслению сети. В общем, ждем от более опытных ответа палится ли такой подход или нет.
Так же, если мы хотим разведать все пошустрей(а не грузить модули и вот это вот все) есть несколько замечательных комманд.
Начнем с net
Сразу предостерегу вас, что она использует SAMR (а не ldap) протокол для некоторых запросов, что должно быть палевным(вроде как).
Еще команды
Вышеперечисленные команды надо исполнять если мы каким-то образом оказались на доменной машине. Но что если мы просто оказались в одной сети, но у нас нет доменного юзера.
Тут все несколько сложнее. Сначала стоит включить акулу и посмотреть что вообще вокруг нас.
Далее сканируем сеть. У доменных машин по дефолту слушается SMB(поправьте если не прав), тоесть сканируем диапазоны, полученные из команды route print на порту 445.
Вот несколько интересных скриптов для nmap'a. Они выдают информацию не всегда. Почему именно я сейчас сказать не могу. Возможно нужно заходить с кредами юзера...
smb-os-discovery.nse
smb-security-mode.nse
smb-system-info.nse
Следующий порт 3389. Скрпипт - rdp-ntlm-info.nse. У меня всегда показыват имя машины, имя домена.
Далее 5985,5986 - PsRemoting. Насколько я помню по дефолту включен на серверных ОС.
137 - nbtns - если открыт данный порт то можем запросить NetBios имя машины, использую nbtscan.
80,443,8443,8080,8081 - Вебчик
На контроллерах скорее всего будут открыты следующие порты 88, 389, 464, 53
На этом первая часть закончена. Писать статьи сильно сложнее чем я ожидал))Мы разобрали как хранится информация об объектах в AD, как ее запрашивать, а так же некоторые полезные команды для разведки. Все советы\ошибки\неточности\дополнения жду в комментариях!
Поэтому если, вы давно хотели, но не решлись взяться за это дело, то самое время) Так как наш путь только начинается, то возможно я буду допускать ошибки, неточности и т.д, поэтому прошу более опытных людей писать об этом в комментариях.
Моя главная цель не научить кого-то(потому что я сам еще почти ничего не знаю), а научиться самому. Так или иначе здесь могут попадаться отрывки из других общедоступных источников, по типу zer1t0 . Но я постараюсь представить контент через призму своего понимания, осветить вопросы, которые возникали и возникают у меня по мере изучения. Ладно,
И так, я предполагаю, что у вас установлена небольшая AD лаборатория (2-4 машины). И вы уже знаете для чего нужна сама Active Directory. Тут нет ничего сложного, если еще нет, то сделайте это сейчас.
AD это достаточно сложная и централизованная система. В ее основе лежит база данных. Она распологается на контроллерах домена по пути %windir%\NTDS\ntds.dit, пример (C:\Windows\NTDS\ntds.dit).
База данных одна, но при ее изменении ее у одного DC(контроллер домена), он рассылает информацию другим, тоесть информация во всех ntds.dit, на разных DC станет одинаковой.
По сути база содержит в себе всю информацию об объектах и их свойствах. И пользователи домена могут свободно запрашивать ее(например по протоколу LDAP, но о нем позже).
Есть много инструментов, чтобы делать такие запросы. Мы даже можно написать свой! Но предлагаю для начала остановится на официальном модуле для powershell'a
Get-WindowsCapability -Name RSAT* -Online | Select-Object name,stateПокажет установлен ли модуль. Эта команда требует админских прав. Если их нет, то просто введите Get-ADDomain. Если видим, как на скриншоте - модуль не установлен.
Если нет, то установим его
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 "Если я все правильно помню, то на серверных ОС он установлен по дефолту.
Get-ComputerInfo | Select WindowsProductName - посмотреть какая у нас версия.Но так как мы пришли сюда за пентестом (а не просто поадминить), то нам нужно получить к нему доступ более скрытно. Для этого мы можем либо
1)Установить его на свою машину, перенести C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ActiveDirectory.Management.dll на скомпрометированную и импортировать (Import-Module). Но такой подход у меня работает не всегда...
2)Использовать github.com/samratashok/ADModule - позволяет в одну команду получить модуль. 4 детекта на VT
Отлично, приступим к разведке.
Get-ADObject -Filter * - покажет список всех объектов в базе
Здесь много непонятной информации, но важно понять что в базе хранятся объекты и у них есть свойства.
Посмотреть какие бывают типы объектов (или говоря языком майкрософта classes) - https://docs.microsoft.com/en-us/windows/win32/adschema/classes-all
Get-ADObject | Select ObjectClass -Unique - это команда покажет какие типы объектов есть сейчас в вашей базе
Теперь когда мы узнали какие вообще бывают объекты самое время глянуть на их свойства. Тут и ниже, если используются более 1 варианта команды, значит с ней проблемы. Если 1 не работает у вас, пробуйте другие. Здесь показываются не все свойства, лучше глянуть на сайте майкрософта. https://docs.microsoft.com/en-us/windows/win32/adschema/classes-all
Код:
(Get-ADObject -Filter * -Properties * | Where-Object {$_.ObjectClass -like "user"})[0].PropertyNames
(Get-ADObject -LDAPFilter "(objectClass=User)" -Properties *)[0] | Get-member
Здесь например показаны свойства объекта юзера, как видно, здесь много полезного по типу badPwdCount,Description,lastLogoff,pwdLastSet и т.д. Думаю по названию понятно что они означают.
На первый взгляд может быть непонятно какая нам от них польза. Но pwdlastset может помочь нам при проведении password spraying. А в описании(Description) часто хранится полезная информация, возможно даже пароли. Я верю в такое мало, но т.к. еще не имею опыт боевого пентеста, то пускай лучше знающие люди напишут в комментариях.
Код:
Get-ADObject -LDAPFilter "(objectClass=user)" -Properties Description - Так можно посмотреть конкретное свойство
Get-ADObject -LDAPFilter "(objectClass=user)" -Properties Description | Where-Object {$_.Description } | select name,Description - показать всех пользователей с непустым описанием
Теперь, когда для нас перестало быть магией то, как хранится информация об объектах в AD пришло время найти более удобный способ ее запрашивать.
Есть достаточно много тулзов, который требуют от нас всего пару кликов для получения исчерпывающей информации об окружении (да-да я про бладхаунд), но для понимая следует(наверное) уметь все делать ручками.
Поэтому вот небольшой список самых базовых команд для первоначального перечисления.
Код:
Get-ADDomain
Get-ADDomainController
Get-ADComputer
Get-ADGroup
Get-ADGroupMember
Get-ADUser
Get-ADTrust
А посмотреть полный список экспортируемых команд из AD модуля можно так.
Код:
Get-Module
Get-Command -Module *имя вашего модуля*
Рекомендую самостоятельно разобраться какую информацию может предоставить нам каждая из команд.
Важно понимать, что все, что происходит при использовании этих команд - лишь запрос к базе. Например Get-ADComputer. Мы делаем LDAP запрос к базе и нам возвращаются куча компьютеров. Но не факт, что они все сейчас включены или даже существуют физически. Это всего лишь строчки в БД. Даже мы сами можем добавить их в базу.
Конечно, это даст только первоначальное представление о сети, но я думаю все согласятся, что все не может так просто)))
Плюсы такого подхода, что мы используем легитимный подписанный модуль и эти запросы выполяются в большинстве своем через не менее легитимный ldap протокол. Минусы, что возможностей для маневра( в сравнении с тем же powerview, про него напишу отдельно) не очень много.
Но я думаю, что EDR заметит что-то странное, если вдруг с обычного ПК начнут поступать множественные запросы по перечеслению сети. В общем, ждем от более опытных ответа палится ли такой подход или нет.
Так же, если мы хотим разведать все пошустрей(а не грузить модули и вот это вот все) есть несколько замечательных комманд.
Начнем с net
Сразу предостерегу вас, что она использует SAMR (а не ldap) протокол для некоторых запросов, что должно быть палевным(вроде как).
Код:
net user - глянуть ЛОКАЛЬНЫХ пользователей на машине. Тоесть это не AD юзеры, их нет в базе(может быть пользователь с таким же именем, но это 2 разных пользователя - один локальный, другой доменный)
net user /domain - пользователи домена
net group /domain - посмотреть группы домена
net group "Domain Admins" /domain - посмотреть админов домена, вместо Domain Admins можно подставить любое имя группы в домене(получили его командой выше).
net localgroup - группы на ЛОКАЛЬНОМ ПК
net share - список локальных шар
net view \\aдрес /All - список шар на удаленном хосте
Еще команды
Код:
ipconfig /all - позволяет посмотреть в каком домене находится машина, и DNS сервер, который может быть контроллером домена.
whoami /groups - покажет в каких группах состоит наш пользователь, если видим "BUILTIN\Administrators" - радуемся
whoami - Первоначально я не мог понять почему (почему бл#ть) при логоне локального пользователя пишется какой-то непонятный домен и откуда он вообще взялся. Эта команда выводит информацию в формате ДОМЕН\имя_в_домене либо ИМЯХОСТА\имя_локального_юзера. Надеюсь я сейчас понимаю все верно.
hostname - имя хоста
arp -a - покажет какие хосты есть в АРП кеше, поможет не сканировать всю сеть а сразу получить часть живых в данный момент хостов
netstat -a - покажет открытые порты и подключения на нашей машине.
nltest /dclist:*имя_домена*
route print - покажет таблицы маршутов, это важно для понимая того, как устроена наша сеть, при этом важно понимать, что это скорее всего не вся сеть, а лишь ее сегмент. Вообще рекомендую прочитать про таблицу маршрутиризации и для чего она нужна.
systeminfo - соберет много инфы о ПК, этy инфу так же можно использовать для понимания как CVE-шки мы можем заюзать на данном хосте.
Вышеперечисленные команды надо исполнять если мы каким-то образом оказались на доменной машине. Но что если мы просто оказались в одной сети, но у нас нет доменного юзера.
Тут все несколько сложнее. Сначала стоит включить акулу и посмотреть что вообще вокруг нас.
Далее сканируем сеть. У доменных машин по дефолту слушается SMB(поправьте если не прав), тоесть сканируем диапазоны, полученные из команды route print на порту 445.
Вот несколько интересных скриптов для nmap'a. Они выдают информацию не всегда. Почему именно я сейчас сказать не могу. Возможно нужно заходить с кредами юзера...
smb-os-discovery.nse
smb-security-mode.nse
smb-system-info.nse
Следующий порт 3389. Скрпипт - rdp-ntlm-info.nse. У меня всегда показыват имя машины, имя домена.
Далее 5985,5986 - PsRemoting. Насколько я помню по дефолту включен на серверных ОС.
137 - nbtns - если открыт данный порт то можем запросить NetBios имя машины, использую nbtscan.
80,443,8443,8080,8081 - Вебчик
На контроллерах скорее всего будут открыты следующие порты 88, 389, 464, 53
На этом первая часть закончена. Писать статьи сильно сложнее чем я ожидал))Мы разобрали как хранится информация об объектах в AD, как ее запрашивать, а так же некоторые полезные команды для разведки. Все советы\ошибки\неточности\дополнения жду в комментариях!
Последнее редактирование: