• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Поиск в LDAP с помощью nse скрипта ldap-search.nse

Azrv3l

win32kfull
Эксперт
Регистрация
30.03.2019
Сообщения
215
Реакции
539
https://mk0xinixqa8hvq91jqt.kinstacdn.com/wp-content/uploads/2020/06/LDAP-logo.png


В 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-search возвращает только 20 результатов. Это можно изменить с помощью аргумента сценария 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
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх