Здравствуйте господа и господанессы.Бывают ситуации когда неудобно самому проверять win сетки,или же вручную, на большом количестве, занимает слишком много времени.Эта проблема легко решается средствами python-ldap.
В первой части мы получим
Для коммуникаций в ad используется протокол доступа к каталогам. В протоколе ldap для уникальной идентификации каждого объекта применяется отличительное имя (DN)
Формат DN выглядит как список конструкций типОбъекта=имяОбъекта, разделённых запятыми. Например, домен dolol.local содержит два компонента: dc=dolol, dc=local
Базовый запрос (ldp.exe например)ldap состоит из:dN(dc=dolol, dc=local например) фильтр (objectCategory=computer) поиск только пк. attrList(какие колонки нам нужы)
как это выглядит
В запросе есть пока что неизвестные нам данные о чем мы поговорим прямо сейчас!
Начинаем писать наш код
Создаем строку фильтр и список атрибутов
Дальше создаем класс в котором будем работать с ldap
network аналог ld в отрывке кода выше,он служит как объект для доступа к заданному серверу ldap.
В строке network.set_option(ldap.OPT_REFERRALS, 0) мы запрещаем прыгать на другие DC в поиске результатов,только один домен(с которого мы подключились будет использован для поиска).
Строка result = network.search_s(self.dn, ldap.SCOPE_SUBTREE,filter, attr)
Эквивалентна запросу что мы выдели выше,SCOPE_SUBTREE - поиск везде.
Парсим через entry.get атрибуты и записываем все в список computers каждый проход цикла.
Выводим данные которые получили.в случае если какие то данные не смогут пройти скрипт продолжит работу. Берет он данные из текстового файла.
и main,py
С парсингом в принципе все и так понятно. Данные идут формата
(без ldap:// он подставляется по ходу скрипта)
Не могу прикрепить фотку на форум,получается битой=( поэтому залил на хостинг
Перед запуском
Запуск через python3 main.py
архив с файлами https://send.exploit.biz/download/ec1ea586ffdf5e40/#1U1CxsNMGQ23wyI3gxzqdA
В первой части мы получим
Для удобства парсить данные для входа мы будем с файла,но сначала разберемся,как же делать запросы посредством ldap..названия пк+днсхост
какие установлены операционные системы и их версии
Для коммуникаций в ad используется протокол доступа к каталогам. В протоколе ldap для уникальной идентификации каждого объекта применяется отличительное имя (DN)
Формат DN выглядит как список конструкций типОбъекта=имяОбъекта, разделённых запятыми. Например, домен dolol.local содержит два компонента: dc=dolol, dc=local
Базовый запрос (ldp.exe например)ldap состоит из:dN(dc=dolol, dc=local например) фильтр (objectCategory=computer) поиск только пк. attrList(какие колонки нам нужы)
Спойлер
Не удалось прогрузить медиа
Active Directory: LDAP Syntax Filters
learn.microsoft.com
Code:
ldap_search_s(ld, "DC=dolol,DC=local", 2, "objectCategory=computer", attrList, 0, &msg)
В запросе есть пока что неизвестные нам данные о чем мы поговорим прямо сейчас!
Начинаем писать наш код
Python:
filter = '(objectCategory=computer)'
attr = [ 'cn', 'dNSHostName', 'operatingSystem', 'operatingSystemVersion' ]
Дальше создаем класс в котором будем работать с ldap
Python:
class LdapConnector:
def __init__(self,domain,user,password,dn):
self.domain = "ldap://" + domain
self.user = user
self.password = password
self.dn = dn
def connect(self):
try:
network = ldap.initialize(self.domain)
network.set_option(ldap.OPT_REFERRALS, 0)
network.simple_bind_s(self.user,self.password)
print("[+] work")
result = network.search_s(self.dn, ldap.SCOPE_SUBTREE,filter, attr)
self.computers(result)
except Exception as e:
print("[-] ошибка : ", e)
В строке network.set_option(ldap.OPT_REFERRALS, 0) мы запрещаем прыгать на другие DC в поиске результатов,только один домен(с которого мы подключились будет использован для поиска).
Строка result = network.search_s(self.dn, ldap.SCOPE_SUBTREE,filter, attr)
Эквивалентна запросу что мы выдели выше,SCOPE_SUBTREE - поиск везде.
Python:
def computers(self,result):
try:
computers = []
for res,entry in result:
if entry is None or not isinstance(entry, dict):
continue
namePc = entry.get('cn', [b'-'])[0].decode('utf-8', 'ignore')
dnshost = entry.get('dNSHostName', [b'-'])[0].decode('utf-8', 'ignore')
os = entry.get('operatingSystem', [b'-'])[0].decode('utf-8', 'ignore')
osversion = entry.get('operatingSystemVersion', [b''])[0].decode('utf-8', 'ignore')
computers.append((namePc,dnshost,os,osversion))
self.printad(computers)
except Exception as e:
print("[-] ошибка : ", e)
Парсим через entry.get атрибуты и записываем все в список computers каждый проход цикла.
Python:
def printad(self,computers):
print("\n-------------------------------------------------")
print(f"domain {self.domain}")
print(f"{'name pc':<20} {'dnshost':<25} {'os':<20} {'osversion':<20}")
for namePc,dnshost,os,osversion in computers:
print(f"{namePc:<20} {dnshost:<25} {os:<20} {osversion:<20}")
print(f"\n всего пк в домене {len(computers)}")
print("\n--------------------------------------------------")
Выводим данные которые получили.в случае если какие то данные не смогут пройти скрипт продолжит работу. Берет он данные из текстового файла.
Python:
from ldapx import LdapConnector
def parse_file(file_path):
parsed_data = []
with open(file_path, 'r') as file:
for line in file:
line = line.strip()
if line:
parts = line.split(':')
if len(parts) == 3:
domain, user, password = parts
parsed_data.append((domain, user, password))
else:
print(f"не удалось распарсить {line}")
for domain, user, password in parsed_data:
# preobrazuem domain v format dn
domain_parts = domain.split('.')
dn = ','.join([f"DC={part}" for part in domain_parts])
ldapconn = LdapConnector(domain, user, password, dn)
ldapconn.main()
Python:
from txtpars import parse_file
file_path = 'nup.txt' #put' k file
parse_file(file_path)
С парсингом в принципе все и так понятно. Данные идут формата
Code:
domain.com:[email protected]:password
(без ldap:// он подставляется по ходу скрипта)
Не могу прикрепить фотку на форум,получается битой=( поэтому залил на хостинг
Не удалось прогрузить медиа
Code:
pip install python-ldap
архив с файлами https://send.exploit.biz/download/ec1ea586ffdf5e40/#1U1CxsNMGQ23wyI3gxzqdA
👍28
❤️7
😮8
LIMB