В Nmap есть сценарий NSE, ldap-search.nse, который позволяет выполнять запросы к службам LDAP (Lightweight Directory Access Protocol).
Цель этого поста - ввести в использование скрипта, а также пару практических примеров.
Содержание статьи
- Перед началом
- Основы
- Практика
- Сохранение выбранной информации обо всех компьютерах в CSV
- Извлечение паролей LAPS и сохранение в CSV
- Индивидуальный поиск
- Ограничение результатов определенными OU
Я настоятельно рекомендую вам использовать последнюю версию Nmap. Если вы хотите, чтобы были возвращены все атрибуты LDAP, вам может потребоваться использовать версию Nmap из репозитория кода Subversion [2],
поскольку он содержит исправление [3] для ошибки, которая вызвала сбой сценария ldap-search при обработке Active Атрибут objectSID каталога. Официальные выпуски Nmap после 7.50 будут содержать это исправление.
Кроме того, в приведенных ниже примерах я использую стандартный порт LDAP 389 / tcp. Если ваша цель реализовала LDAP через SSL (LDAPS), я настоятельно рекомендую вам использовать вместо этого порт 636 / tcp,
чтобы все запросы были зашифрованы с использованием TLS. Это конфигурация, отличная от конфигурации по умолчанию для Active Directory, и для нее необходимо установить сертификат на целевой машине.
Эти команды должны работать против LDAPS, даже если IP-адрес цели не был (с использованием опции -n Nmap) или не может быть преобразован в имя хоста.
Прежде чем начать, вы можете просмотреть страницу NSEDOC ldap-search. Это может быть полезно, но не обязательно.
Если у вас есть проблемы с параметром
–script-args в Nmap, вы можете прочитать об этом больше в книге Nmap. Если что-то неясно, дайте мне знать, отставив комментарий или отправив сообщение @TomSellers в Twitter.
Основы
Давайте посмотрим на минимальные требования для скрипта, посмотрев на пример ниже. Я использую продолжение строки * nix, чтобы сделать его более читаемым.
В Windows вам нужно будет удалить обратную косую черту в конце каждой строки и свернуть ее до одной строки.
Bash:
sudo nmap -p 389 --script ldap-search \
--script-args \
'ldap.username="CN=Administrator,CN=Users,DC=adlab,DC=pwnable", \
ldap.password="AdminPasswordHere", \
ldap.qfilter=computers' \
192.168.50.231
Чтобы использовать ldap-search, нам необходимо предоставить учетные данные с правами доступа к LDAP на цели. Мы указываем их с помощью
ldap.username и ldap.password в части команды script-args. Обратите внимание, что вы можете заключить значения в аргументы сценария в одинарные или двойные кавычки, но вам нужно обратить пристальное внимание на то, как они вложены, поскольку это может вызвать проблемы,
если не будет обработано должным образом. В своих примерах я буду использовать одинарные кавычки, чтобы заключить аргументы скрипта,
и двойные кавычки, чтобы заключить в них любые значения, такие как
ldap.username и ldap.password.Следующим аргументом скрипта является
ldap.qfilter, который определяет быстрый фильтр. В этом контексте быстрый фильтр можно рассматривать как «стандартную» строку поиска LDAP. Они необходимы, поскольку сценарий не поддерживает полный синтаксис LDAP. В приведенной выше команде этот аргумент не является технически необходимым, поскольку по умолчанию он будет иметь значение all,
но важно понимать что состявляет отправляемый вами запрос.
- all - возвращает все объекты
- ad_dcs - возвращает только контроллеры домена
- computers - Возвращает только компьютерные объекты
- users - возвращает объекты, у которых objectClass совпадает с «user», «posixAccount» или «person».
- custom - это позволяет пользователю указать атрибут и значение для поиска. Я расскажу об этом в разделе практического применения.
ldap.maxobjects. Установка этого значения на -1 полностью снимает ограничение.Практика - сохранение выбранной информации обо всех компьютерах в CSV
В этом примере мы собираемся исследовать использование в реальном мире. Взгляните на команду ниже.
Bash:
sudo nmap -p 389 --script ldap-search \
--script-args \
'ldap.username="CN=Administrator,CN=Users,DC=adlab,DC=pwnable", \
ldap.password="AdminPasswordHere", \
ldap.qfilter=computers,
ldap.attrib={name,dNSHostName,operatingSystem}, \
ldap.savesearch=test' \
192.168.50.231
Эта команда возвращает атрибуты «name», «dNSHostName» и «operatingSystem» для всех компьютеров, отображает их на экране и сохраняет в файл.
Для значения
ldap.qfilter мы используем значение «компьютеры», чтобы возвращать только компьютерные объекты, как обсуждалось в предыдущем разделе. Мы хотим возвращать только определенные атрибуты LDAP, поэтому мы передаем имена атрибутов в
ldap.attrib. Поскольку мы запрашиваем несколько атрибутов, нам необходимо использовать синтаксис таблицы Lua, который для простых таблиц представляет собой значения, разделенные запятыми, заключенные в фигурные скобки «{}». Если нам нужно только одно значение, нам не нужен синтаксис таблицы, например:
Код:
ldap.attrib=name,
Наконец, ldap.savesearch используется для сохранения вывода запроса в файл CSV в текущем каталоге. Значение этой опции, в данном случае «test», используется в качестве префикса в выходном имени файла.
Имя файла строится как [префикс] _ [ip_адрес] _ [порт] .csv. В данном случае это будет
test_192.168.50.231_389.csv. Если сканирование включает несколько хостов, которые возвращают данные, создается один файл для каждой цели. Отображаемый вывод команды выше выглядит примерно так:
Bash:
389/tcp open ldap
| ldap-search:
| Context: DC=adlab,DC=pwnable; QFilter: computers; Attributes: name,dNSHostName,operatingSystem
| dn: CN=PWNWINDC01,OU=Domain Controllers,DC=adlab,DC=pwnable
| name: PWNWINDC01
| operatingSystem: Windows Server 2012 R2 Datacenter Evaluation
| dNSHostName: PWNWINDC01.adlab.pwnable
| dn: CN=W12R2-SQL01,OU=Servers,DC=adlab,DC=pwnable
| name: W12R2-SQL01
| operatingSystem: Windows Server 2012 R2 Datacenter Evaluation
|_ dNSHostName: W12R2-SQL01.adlab.pwnable
Вывод CSV выглядит примерно так:
Bash:
"name","name","operatingSystem","dNSHostName"
"CN=W12R2-SQL01,OU=Servers,DC=adlab,DC=pwnable","W12R2-SQL01","Windows Server 2012 R2 Datacenter Evaluation","W12R2-SQL01.adlab.pwnable"
"CN=PWNWINDC01,OU=Domain Controllers,DC=adlab,DC=pwnable","PWNWINDC01","Windows Server 2012 R2 Datacenter Evaluation","PWNWINDC01.adlab.pwnable"
Практика - извлечение паролей LAPS и сохранение в CSV
Роб Фуллер (@mubix) опубликовал отличную запись в блоге о том, как использовать инструмент командной строки ldapsearch для доступа к обычным текстовым паролям, которые Microsoft Local Administrator Password Solution (LAPS)
хранит в Active Directory. Это также можно сделать с помощью сценария
NSE ldap-search.
Bash:
sudo nmap -p 389 --script ldap-search \
--script-args \
'ldap.username="CN=Administrator,CN=Users,DC=adlab,DC=pwnable", \
ldap.password="AdminPasswordHere", \
ldap.qfilter=computers, \
ldap.attrib=ms-Mcs-AdmPwd, \
ldap.savesearch=LAPS' \
192.168.50.231
Как видите, мы запрашиваем значение атрибута
ms-Mcs-AdmPwd для всех компьютеров в целевой среде Active Directory. Вот отображаемый результат:
Bash:
389/tcp open ldap syn-ack ttl 128
| ldap-search:
| Context: DC=adlab,DC=pwnable; QFilter: computers; Attributes: ms-MCS-AdmPwd
| dn: CN=PWNWINDC01,OU=Domain Controllers,DC=adlab,DC=pwnable
| dn: CN=W12R2-SQL01,OU=Servers,DC=adlab,DC=pwnable
|_ ms-Mcs-AdmPwd: 40_Y3Rx1oq3%lw$
А вот что будет сохранено в
LAPS_192.168.50.231_389.csv:
Bash:
"name","ms-Mcs-AdmPwd"
"CN=W12R2-SQL01,OU=Servers,DC=adlab,DC=pwnable","40_Y3Rx1oq3%lw$"
"CN=PWNWINDC01,OU=Domain Controllers,DC=adlab,DC=pwnable",""
Обратите внимание, что выходные данные CSV включают значение для «name», которое необходимо, но которое мы не включили в нашу команду. Кроме того, контроллер Active Directory PWNWINDC01 не имеет значения для ms-Mcs-AdmPwd,
потому что он не настроен на использование LAPS и, следовательно, не имеет его.
Практика - индивидуальный поиск
Как я уже упоминал ранее, вы можете создавать очень простые индивидуальные поисковые запросы с помощью «настраиваемого» быстрого фильтра. Этот фильтр позволяет вам использовать
ldap.searchattrib и ldap.searchvalue, чтобы указать атрибут LDAP и желаемое значение. Скрипт вернет атрибуты, указанные в
ldap.attrib для любых объектов, соответствующих этому фильтру. Например, приведенная ниже команда возвращает значения name и operatingSystem
Bash:
sudo nmap -p 389 --script ldap-search \
--script-args \
'ldap.username="CN=Administrator,CN=Users,DC=adlab,DC=pwnable", \
ldap.password="AdminPasswordHere", \
ldap.qfilter=custom, \
ldap.searchattrib="name", \
ldap.searchvalue="*SQL*", \
ldap.attrib={name,operatingSystem}' \
192.168.50.231
Обратите внимание, как вывод отличается от предыдущего вывода, поскольку он содержит только один хост, имя которого имеет «SQL».
Bash:
PORT STATE SERVICE
389/tcp open ldap
| ldap-search:
| Context: DC=adlab,DC=pwnable; QFilter: custom; Attributes: name,operatingSystem
| dn: CN=W12R2-SQL01,OU=Servers,DC=adlab,DC=pwnable
| name: W12R2-SQL01
|_ operatingSystem: Windows Server 2012 R2 Datacenter Evaluation
Чтобы перечислить только компьютеры, на которых установлена любая версия Windows Server, вы можете использовать следующую команду, которая соответствует фильтру LDAP «(operatingSystem = Windows * Server *)».
Bash:
sudo nmap -p 389 --script ldap-search \
--script-args \
'ldap.username="CN=Administrator,CN=Users,DC=adlab,DC=pwnable", \
ldap.password="AdminPasswordHere", \
ldap.qfilter=custom, \
ldap.searchattrib="operatingSystem", \
ldap.searchvalue="Windows*Server*", \
ldap.attrib=name' \
192.168.50.231
Практика - ограничение результатов определенными OU
В определенных ситуациях вы можете захотеть ограничить результаты определенным OU. Это можно сделать с помощью аргумента сценария
ldap.base, чтобы указать отличительное имя подразделения, которое вы хотите найти.
Bash:
sudo nmap -p 389 --script ldap-search \
--script-args \
'ldap.username="CN=Administrator,CN=Users,DC=adlab,DC=pwnable", \
ldap.password="AdminPasswordHere", \
ldap.qfilter=users, \
ldap.base="OU=Admins,DC=adlab,DC=pwnable", \
ldap.attrib={userPrincipalName, lastLogon,pwdLastSet, memberOf}' \
192.168.50.231
В приведенном выше примере мы ищем
OU = Admins, DC = adlab, DC = pwnable и все подразделения в нем для пользователей (ldap.qfilter = users) и возвращаем значения
userPrincipalName, lastLogon. , атрибуты pwdLastSet и memberOf.
Bash:
PORT STATE SERVICE
389/tcp open ldap
| ldap-search:
| Context: OU=Admins,DC=adlab,DC=pwnable; QFilter: users; Attributes: userPrincipalName,lastLogon,pwdLastSet,memberOf
| dn: CN=Totes Legit,OU=Admins,DC=adlab,DC=pwnable
| memberOf: CN=Domain Admins,CN=Users,DC=adlab,DC=pwnable
| lastLogon: 2017/07/08 21:03:16 UTC
| pwdLastSet: 2017/07/08 20:14:59 UTC
|_ userPrincipalName: TotesLegit@adlab.pwnable
Надеюсь, эта информация окажется для вас полезной. Как я уже упоминал ранее, не стесняйтесь обращаться ко мне, если что-то неясно.
Удачи!
– Tom Sellers ( @TomSellers )
От ТС
Ccылка на оригинал на en - вот
Кроме того, для тех кто хочет по больше разобраться в теме LDAP, или не может выбрать инструмент что-бы полазать по LDAP руками,
Существует статья на форуме, за моим авторством.
Перевод:
Azrv3l cпециально для xss.pro