Как найти все контроллеры домена
Как вы думаете, сколько есть способов получить список контроллеров домена? Давайте посчитаем. Для примера возьмет тестовый домен с оригинальным именем TEST.LOCAL, в котором есть один контроллер домена с еще более оригинальным 🙂 именем DC-TEST.
Первый способ, которым я обычно пользуюсь — утилита командной строки Netdom. Для получения списка контроллеров домена воспользуемся командой:
Netdom query DC
Второй пойдет утилита Nltest. Выведем список контроллеров командой:
Nltest /dclist:test.local
Способ третий — утилита DSQUERY, специально предназначенная для поиска объектов в Active Directory. Найти контроллеры домена с ее помощью можно так:
DSQUERY server -o rdn
или так:
DSQUERY server
Перейдем к PowerShell. Поименно вывести контроллеры домена можно командой:
Get-ADDomainController -Filter * | select Name
Переходим к нестандартным методам поиска. Выведем список контроллеров с помощью утилиты Nslookup. Каждый контроллер домена регистрирует в DNS запись SRV вида _ldap._tcp.dc._msdcs.domain.com, по которой его и можно найти. Для поиск по DNS воспользуемся командой:
Nslookup -type=all _ldap._tcp.dc._msdcs.test.local
С помощью WMI в Windows можно сделать практически все, в том числе и получить список контроллеров домена. Для этого нам потребуется класс Win32_NTDomain, в котором помимо прочего хранятся имена контроллеров домена. Получить их можно из командной строки:
wmic NTDOMAIN GET DomainControllerName
или из PowerShell:
Get-WmiObject -Class win32_NTDomain | ft -a DomainControllerName
Ну и последний из известных мне способов. Все домен контроллеры являются членами группы «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).
Командлет вернул все поля с информацией о контроллере домена, доступной в 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
Посчитать количество контроллеров домена в AD можно с помощью команды:
Get-ADDomainController -Filter * | Measure-Object
Выведем более удобную таблицу, в которой указаны все контроллеры домена с их именем, IP адресом, версией ОС и именем сайта AD:
Get-ADDomainController -Filter *| Select Name, ipv4Address, OperatingSystem, site | Sort-Object name
Если вам нужно получить информацию о DC из другого домена, нужно указать имя любого доступного DC в стороннем домене с помощью параметра –Server (возможно при наличии доверительных отношений между доменами).
Get-ADDomainController -Filter * -server dc01.contoso.cpm | Select Name, ipv4Address, IsGlobalCatalog, Site
Используем 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
Вывести список всех 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 в домене. В предыдущих статьях мы уже показывали, как использовать 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-инфраструктуре – это быть уверенным в завтрашнем дне.
Для того, чтобы сделать заказ: