Active directory как найти контроллеры домена

Как найти все контроллеры домена

Как вы думаете, сколько есть способов получить список контроллеров домена? Давайте посчитаем. Для примера возьмет тестовый домен с оригинальным именем TEST.LOCAL, в котором есть один контроллер домена с еще более оригинальным 🙂 именем DC-TEST.

Первый способ, которым я обычно пользуюсь — утилита командной строки Netdom. Для получения списка контроллеров домена воспользуемся командой:

Netdom query DC

вывод списка контроллеров домена с помощью утилиты Netdom

Второй пойдет утилита Nltest. Выведем список контроллеров командой:

Nltest /dclist:test.local

вывод списка контроллеров домена с помощью утилиты Nltest

Способ третий — утилита DSQUERY, специально предназначенная для поиска объектов в Active Directory. Найти контроллеры домена с ее помощью можно так:

DSQUERY server -o rdn

или так:

DSQUERY server

вывод списка контроллеров домена с помощью утилиты DSQUERY

Перейдем к PowerShell. Поименно вывести контроллеры домена можно командой:

Get-ADDomainController -Filter * | select Name

вывод списка контроллеров домена с помощью PowerShell

Переходим к нестандартным методам поиска. Выведем список контроллеров с помощью утилиты Nslookup. Каждый контроллер домена регистрирует в DNS запись SRV вида _ldap._tcp.dc._msdcs.domain.com, по которой его и можно найти. Для поиск по DNS воспользуемся командой:

Nslookup -type=all _ldap._tcp.dc._msdcs.test.local

вывод списка контроллеров домена с помощью nslookup

С помощью WMI в Windows можно сделать практически все, в том числе и получить список контроллеров домена. Для этого нам потребуется класс Win32_NTDomain, в котором помимо прочего хранятся имена контроллеров домена. Получить их можно из командной строки:

wmic NTDOMAIN GET DomainControllerName

или из PowerShell:

Get-WmiObject -Class win32_NTDomain | ft -a DomainControllerName

вывод списка контроллеров домена с помощью WMI

Ну и последний из известных мне способов. Все домен контроллеры являются членами группы «Domain Controllers», и для их получения остается только вывести список членов этой группы. Сделать это можно из командной строки:

net group "Domain Controllers" /domain

или из PowerShell:

Get-ADGroupMember -Identity "Domain Controllers" | select Name

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

Всего получается семь способов. Если знаете еще, пишите.

DNS and DHCP are the best way to check since there can be Unix/Linux machines on the network managed by the AD domain controller or acting as the domain controller.

Plus, considering active directory is nothing more than Microsoft’s version of Kerberos, LDAP, dhcp and dns. It would be better to understand and debug things at lower layers than layer 7+. This is because the operating system would preform these same requests and the underlining RFC for each protocol actually operates at a OSI level not the “insert favorite tool here” level.

One can go a step further and query the dhcp for options 6, 15, and 44 to get the domain name, domain name server, and Wins/NetBIOS name server.

Then using dns to check for the _kerberos._tcp, _kpasswd._tcp, _LDAP._TCP.dc._msdcs, and _ldap._tcp SRV records:

nslookup -type=srv _kerberos._tcp.EXMAPLE.COM
nslookup -type=srv _kpasswd._tcp.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.dc._msdcs.EXAMPLE.COM

.EXAMPLE.COM ::= value returned from dhcp option-1

This breaks down into three areas, two are protocol supported DNS-SD records:

  • _kerberos._tcp and _kpasswd._tcp (also under UNIX/Linux/OSX+some windows networks has _kadmin._tcp) are for kerberos
  • _ldap._tcp is for ldap (openldap, opendc, sun/oracle directory, ms ad)
    _LDAP._TCP.dc._msdcs is the Microsoft only extension to ldap to map the domain controller.

Командлет Get-ADDomainController можно использовать для получения информации о контроллерах домена в Active Directory. Данный командлет входит в состав модуля Active Directory для PowerShell и требует установки отдельного компонента RSAT (в Windows 10 1809 и выше RSAT устанавливается по-новому).

Содержание:

  • Командлет Get-ADDomainController
  • Используем Get-ADDomainController для выборки контроллеров домена по условиям
  • PowerShell скрипт проверки доступности всех контроллеров домена

Командлет Get-ADDomainController

При запуске
Get-ADDomainController
без параметров командлет выводит информацию о текущем контроллере домена (LogonServer), который используется данным компьютером для аутентификации (DC выбирается при загрузке в соответствии с топологией сайтов AD).

Get-ADDomainController информация о текущем контроллере домена

Командлет вернул все поля с информацией о контроллере домена, доступной в AD.

ComputerObjectDN : CN=mskDC01,OU=Domain Controllers,DC=corp,DC=winitpro,DC=ru DefaultPartition : DC=corp,DC=winitpro,DC=ru Domain : corp.winitpro.ru Enabled : True Forest : winitpro.ru HostName : mskDC01.corp.winitpro.ru InvocationId : 96234a-7fc6-4a32-9e62-3b32343ab4ad IPv4Address : 10.1.10.6 IPv6Address :  

IsGlobalCatalog : True IsReadOnly : False LdapPort : 389 Name : mskDC01 NTDSSettingsObjectDN : CN=NTDS Settings,CN=mskDC01,CN=Servers,CN=MskCenter,CN=Sites,CN=Configuration,DC=winitpro,DC =ru OperatingSystem : Windows Server 2008 R2 Standard OperatingSystemHotfix : OperatingSystemServicePack : Service Pack 1 OperatingSystemVersion : 6.1 (7601) OperationMasterRoles : {} Partitions : {DC=ForestDnsZones,DC=winitpro,DC=ru, DC=DomainDnsZones,DC=corp,DC=winitpro,DC=ru, CN=Schema,CN=Configuration,DC=winitpro,DC=ru...} ServerObjectDN : CN=mskDC01,CN=Servers,CN=MskCenter,CN=Sites,CN=Configuration,DC=winitpro,DC=ru ServerObjectGuid : 8052323-e294-4430-a326-9553234431d6 Site : MskCenter SslPort : 636

Также вы можете найти контроллер домена, к которому должен относится ваш компьютер через механизм DCLocator:

Get-ADDomainController –Discover

Вы можете найти ближайший доступный DC с активной ролью AD Web Services:

Get-ADDomainController –ForceDiscover -Discover -Service ADWS

Параметр Service можно использовать, чтобы найти PDC в домене:

Get-ADDomainController -Discover -Service PrimaryDC

Если ваш контроллер домена не найден или не отвечает, вы можете найти контроллер домена в ближайшем сайте AD (определяется по весу межсайтовых связей):

Get-ADDomainController –Discover –ForceDiscover -NextClosestSite

Чтобы вывести список все контроллеров домена в текущем домене, выполните:

Get-ADDomainController -Filter * | ft

Get-ADDomainController list

Посчитать количество контроллеров домена в AD можно с помощью команды:

Get-ADDomainController -Filter * | Measure-Object

кол-во контроллеров домена в ad

Выведем более удобную таблицу, в которой указаны все контроллеры домена с их именем, IP адресом, версией ОС и именем сайта AD:

Get-ADDomainController -Filter *| Select Name, ipv4Address, OperatingSystem, site | Sort-Object name

получить список DC с IP адресами и именами

Если вам нужно получить информацию о DC из другого домена, нужно указать имя любого доступного DC в стороннем домене с помощью параметра –Server (возможно при наличии доверительных отношений между доменами).

Get-ADDomainController -Filter * -server dc01.contoso.cpm | Select Name, ipv4Address, IsGlobalCatalog, Site

получить DC из стороннего домен

Используем Get-ADDomainController для выборки контроллеров домена по условиям

Рассмотрим несколько полезных командлетов, которые можно использовать для получения списка контролеров домена в AD по определенным критериям.

Найти контроллер домена по его IP адресу:

Get-ADDomainController -Identity "10.1.1.120"

Найти все DC, в имени которых есть символы DC04:

Get-ADDomainController -Filter { name -like "*dc04*"} | Select Name, ipv4Address, OperatingSystem, site

Поиск всех доступных DC в определенном сайте:

Get-ADDomainController -Discover -ForceDiscover -Site "Site-Name"

Вывести список DC в сайтах, имена которых начинаются с Mos*:

Get-ADDomainController -Filter {site -like "Mos*"} | Select Name, ipv4Address, OperatingSystem, site

Get-ADDomainController - получить список контроллеров домена в сайте AD

Вывести список всех Read Only контроллеров домена:

Get-ADDomainController -Filter { IsReadOnly -eq $true} | Select Name, ipv4Address, OperatingSystem, site

Найти DC в сайте “Site Name”, на которых включена роль Global Catalog:

Get-ADDomainController -Filter {site -eq "Site Name" -and IsGlobalCatalog -eq $true} | Select Name, ipv4Address, OperatingSystem, site

PowerShell скрипт проверки доступности всех контроллеров домена

Следующая конструкция позволяет перебрать все контроллеры домена в Active Directory и выполнить для каждого из них определенное действие:

$AllDCs = Get-ADDomainController -Filter *
ForEach($DC in $AllDCs)
{
do something
}

Ниже приведен пример простого PowerShell скрипта, который проверяет доступность LDAPS порта (TCP 636) на каждом DC в домене с помощью командлета Test-NetConnection. Если LDAPS порт на DC не доступен, появляется предупреждение.

$AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname,Ipv4address,isGlobalCatalog,Site,Forest,OperatingSystem
ForEach($DC in $AllDCs)
{
$PortResult=Test-NetConnection -ComputerName $DC.Hostname -Port 636 -InformationLevel Quiet
if ($PortResult -ne "$True"){
write-host $DC.Hostname " не доступен" -BackgroundColor Red -ForegroundColor White
}else {
write-host $DC.Hostname " доступен" }
}

скрипт проверки доступности всех DC в домене

Получился простой скрипт мониторинга доступности DC. Ест еще различные сценарии перебора всех DC в домене. В предыдущих статьях мы уже показывали, как использовать Get-ADDomainController для поиска определенного события в журналах на всех контролерах домена. Например, для: поиска события блокировки учетной записи пользователя, поиска событий NTLMv1 аутентификации, поиска событий добавления пользователя в группу AD и т.д.

Вы можете использовать командлет PowerShell Get-ADDomainController для получения информации о контроллерах домена в Active Directory. Этот командлет является частью модуля Active Directory для Windows PowerShell, который может быть установлен как на Windows Server, так и на рабочих станциях Windows. Подробности смотрите в статье «Как установить и использовать Модуль Active Directory для Windows PowerShell».

Командлет Get-ADDomainController

Get-ADDomainController выводит информацию об одном или нескольких контроллеров домена Active Directory на основе критериев обнаруживаемых служб, параметров поиска или путём предоставления идентификатора контроллера домена, например имени NetBIOS.

Командлет Get-ADDomainController получает контроллеры домена, указанные в параметрах. Вы можете получить контроллеры домена, используя опции -Identity, -Filter или -Discover.

При запуске Get-ADDomainController без каких-либо параметров командлет отображает информацию о текущем контроллере домена (LogonServer), используемом этим компьютером для проверки подлинности (контроллер домена выбирается в соответствии с топологией IP-подсети сайта AD):

Get-ADDomainController

Командлет вернул все поля с информацией о контроллере домена, доступной в базе данных Active Directory.

ComputerObjectDN           : CN=HACKWARE-SERVER,OU=Domain Controllers,DC=ds,DC=hackware,DC=ru
DefaultPartition           : DC=ds,DC=hackware,DC=ru
Domain                     : ds.hackware.ru
Enabled                    : True
Forest                     : ds.hackware.ru
HostName                   : HackWare-Server-2022.ds.hackware.ru
InvocationId               : bf704d68-01ea-4e3d-83fe-6f556ca09e14
IPv4Address                : 192.168.1.60
IPv6Address                : fd28:62f2:dde3:0:4def:bfd5:11ad:1fe2
IsGlobalCatalog            : True
IsReadOnly                 : False
LdapPort                   : 389
Name                       : HACKWARE-SERVER
NTDSSettingsObjectDN       : CN=NTDS Settings,CN=HACKWARE-SERVER,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ds,DC=hackware,DC=ru
OperatingSystem            : Windows Server 2022 Standard
OperatingSystemHotfix      :
OperatingSystemServicePack :
OperatingSystemVersion     : 10.0 (20348)
OperationMasterRoles       : {SchemaMaster, DomainNamingMaster, PDCEmulator, RIDMaster…}
Partitions                 : {DC=ForestDnsZones,DC=ds,DC=hackware,DC=ru, DC=DomainDnsZones,DC=ds,DC=hackware,DC=ru, CN=Schema,CN=Configuration,DC=ds,DC=hackware,DC=ru, CN=Configuration,DC=ds,DC=hackware,DC=ru…}
ServerObjectDN             : CN=HACKWARE-SERVER,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ds,DC=hackware,DC=ru
ServerObjectGuid           : 1eb9f6f2-1fcd-446f-a0db-80b356e27673
Site                       : Default-First-Site-Name
SslPort                    : 636

Примеры использования Get-ADDomainController

Чтобы получить контроллер домена с помощью механизма обнаружения DCLocator, используйте опцию -Discover. Вы можете указать критерии поиска, задав такие опции, как -Service, -SiteName, -DomainName, -NextClosestSite, -AvoidSelf и -ForceDiscover.

Также вы можете найти контроллер домена, которому должен принадлежать ваш компьютер, через службу -DCLocator:

Get-ADDomainController -Discover

Следующая команда получит один доступный контроллер домена на указанном сайте:

Get-ADDomainController -Discover -Site "Default-First-Site-Name"

Опция -ForceDiscover указывает командлету очистить всю кэшированную информацию о контроллере домена и выполнить новое обнаружение. Если этот параметр не указан, командлет может возвращать кэшированные сведения о контроллере домена.

Get-ADDomainController -Discover -Site "Default-First-Site-Name" -ForceDiscover

Эта команда получает один доступный контроллер указанного домена в данном домене с помощью обнаружения.

Get-ADDomainController -Discover -Domain "user01.com"

Вы можете найти ближайший доступный контроллер домена с активной ролью веб-служб AD:

Get-ADDomainController -ForceDiscover -Discover -Service ADWS

Опция -Service задаёт типы получаемых контроллеров домена. Вы можете указать более одного типа, используя список, разделённый запятыми. Допустимые значения для этого параметра:

  • PrimaryDC или 1
  • GlobalCatalog или 2
  • KDC или 3
  • TimeService или 4
  • ReliableTimeService или 5
  • ADWS или 6

Пример использования опции -Service для поиска PDC (Primary Domain Controller Emulator) в вашем домене:

Get-ADDomainController -Discover -Service PrimaryDC

Эта команда ищет компьютер с функцией Глобального каталога в текущем лесу:

Get-ADDomainController -Discover -Service "GlobalCatalog"

Эта команда получает основной контроллер домена с помощью обнаружения и проверяет, используется ли он в качестве сервера времени.

Get-ADDomainController -Discover -Domain "corp.contoso.com" -Service "PrimaryDC","TimeService"

Если ваш контроллер домена не найден или не отвечает, вы можете найти его на ближайшем сайте AD (определяется весом межсайтовых ссылок):

Get-ADDomainController -Discover -ForceDiscover -NextClosestSite

Чтобы найти и получить более одного контроллера домена, используйте опцию -Filter.

Чтобы отобразить список всех контроллеров домена в текущем домене, выполните такую команду:

Get-ADDomainController -Filter * | Format-Table

Используя следующую команду, вы можете подсчитать количество контроллеров домена в AD:

Get-ADDomainController -Filter * | Measure-Object

Вы можете отобразить более удобную таблицу, в которой показаны все контроллеры домена, их имена хостов, IP-адреса, версии ОС и имена сайтов AD:

Get-ADDomainController -Filter *| Select-Object Name,ipv4Address,OperatingSystem,site | Sort-Object name

Если вы хотите получить некоторую информацию о DC из другого домена, укажите имя любого доступного DC в другом домене с помощью параметра -Server (это возможно в случае включения доверительных отношений между доменами).

Get-ADDomainController -Filter * -Server dc01.test.com | Select Name,ipv4Address, IsGlobalCatalog,Site

Использование Get-ADDomainController для поиска контроллеров домена по определенным критериям

Давайте рассмотрим несколько полезных команд, которые вы можете использовать для получения списка контроллеров домена в AD по определенным критериям.

Опция -Identity указывает контроллер домена, который нужно получить. Вы можете идентифицировать контроллер домена по его GUID, IPV4Address, глобальному IPV6Address или имени узла DNS.

Чтобы найти контроллер домена по его IP-адресу:

Get-ADDomainController -Identity "192.168.100.6"

Эта команда получает контроллер домена, используя его NetBIOS имя.

Get-ADDomainController -Identity "PDC-01"

Эта команда получает контроллер домена, используя его имя хоста DNS, в домене, указанном параметром -Site, указанным в параметре -Server, и с указанием учётных данных администратора.

Get-ADDomainController -Identity "TK5-CORP-DC-10.user01.com" -Server "user01.com" -Credential "corpadministrator"

Чтобы найти все контроллеры домена, в именах которых есть DC02:

Get-ADDomainController -Filter {name -like "*dc02*"} | Select Name,ipv4Address,OperatingSystem,site

Чтобы отобразить список контроллеров домена на сайтах, имена которых начинаются с «Mun*»:

Get-ADDomainController -Filter {site -like "Mun*"} | Select Name,ipv4Address,OperatingSystem,site

Чтобы отобразить список всех контроллеров домена только для чтения (RODC):

Get-ADDomainController -Filter {IsReadOnly -eq $true} | Select-Object Name,ipv4Address,OperatingSystem,site

Чтобы найти контроллеры домена на сайте «Rome» с включённой ролью глобального каталога:

Get-ADDomainController -Filter {site -eq "Rome" -and IsGlobalCatalog -eq $true} | Select-Object Name,ipv4Address,OperatingSystem,site

Скрипт PowerShell для проверки доступности всех контроллеров домена

Следующий скрипт PowerShell позволяет поочерёдно проверять контроллеры домена и выполнять для каждого из них определённые действия:

$DCs = Get-ADDomainController -Filter *
ForEach-Object($DC in $DCs)
{
	действия
}

Вот пример простого скрипта PowerShell, который проверяет доступность порта LDAPS (TCP 636) на каждом контроллере домена в вашем домене с помощью командлета Test-NetConnection. Если порт LDAPS недоступен, появится предупреждение.

$DCs = Get-ADDomainController -Filter * | Select-Object Hostname,Ipv4address,isGlobalCatalog,Site,Forest,OperatingSystem
ForEach($DC in $DCs)
{
	$PortResult=Test-NetConnection -ComputerName $DC.Hostname -Port 636 -InformationLevel Quiet
	if ($PortResult -ne "$True"){
		write-host $DC.Hostname " не доступен" -BackgroundColor Red -ForegroundColor White
	}else {
	write-host $DC.Hostname " доступен" -BackgroundColor Green -ForegroundColor White}
}

Получился простой скрипт для отслеживания доступности всех контроллеров домена в вашем домене.

Также существуют разные сценарии для проверки всех контроллеров домена по очереди.

Связанные статьи:

  • Как установить Active Directory Domain Services с помощью PowerShell (100%)
  • Как установить и использовать Модуль Active Directory для Windows PowerShell (100%)
  • Как настроить Windows Server 2022 с помощью PowerShell (50%)
  • Управление ролями и функциями Windows Server с помощью PowerShell (50%)
  • Аналог Add-Computer в PowerShell 7 (50%)
  • Устранение неполадок: групповая политика (GPO) не применяется (RANDOM – 50%)

При проведении внутреннего тестирования на проникновение требуется определить цели атаки.
Одними из главных целей являются контроллеры домена Active Directory. Найти контроллеры домена можно множеством способов.

Получение имени домена

Для начала нам нужно узнать имя домена. Как правило оно передается в параметрах DHCP сервера domain-name (5) и или domain-search (119). Посмотреть значения этих параметров можно в файле /etc/resolv.conf.

Пример файла resolv.conf:

# Generated by NetworkManager
search pentestlab.lan
nameserver 192.168.1.1
nameserver 192.168.1.2
nameserver 172.16.2.2

соответствено, скорее всего, имя домена – pentestlab.lan.

После получения имени домена, мы можем запросить у DNS сервера список всех контроллеров домена.

Первый способ

Запрос ldap SRV записей.

nslookup -type=srv _ldap._tcp.dc._msdcs.

Пример:

nslookup -type=srv _ldap._tcp.dc._msdcs.pentestlab.lan

Второй способ

Запрос kerberos записей.

dig any _kerberos._tcp.полное_имя_домена

Пример:

dig any _kerberos._tcp.pentestlab.lan

Третий способ

Запрос A записей.

dig полное_имя_домена

Пример:

dig pentestlab.lan

Четвертый способ

Запрос c использованием nltest.
Данный способ работает только с АРМ, который уже входит в состав домена.

nltest /dclist:полное_имя_домена

Пример:

nltest /dclist:pentestlab.lan

Не все способы применимы ко всем доменам, но один из них сработает точно.

Заказать Аудит Безопасности или Пентест Вашей IT-инфраструктуры

Быть уверенным в своей IT-инфраструктуре – это быть уверенным в завтрашнем дне.

Для того, чтобы сделать заказ:

Безопасные и надежные IT решения

Добавить комментарий