LIMB
Вход Регистрация

тема

1 часть. Разбираемся с протоколом ldap и чекаем наши сетки на количество пк.

jugecomma · · 1 ответов · 373 просмотров

Здравствуйте господа и господанессы.Бывают ситуации когда неудобно самому проверять win сетки,или же вручную, на большом количестве, занимает слишком много времени.Эта проблема легко решается средствами python-ldap.
В первой части мы получим
названия пк+днсхост  
какие установлены операционные системы и их версии
Для удобства парсить данные для входа мы будем с файла,но сначала разберемся,как же делать запросы посредством ldap..

Для коммуникаций в ad используется протокол доступа к каталогам. В протоколе ldap для уникальной идентификации каждого объекта применяется отличительное имя (DN) 

Формат DN выглядит как список конструкций типОбъекта=имяОбъекта, разделённых запятыми. Например, домен dolol.local содержит два компонента: dc=dolol, dc=local

Базовый запрос (ldp.exe например)ldap состоит из:dN(dc=dolol, dc=local например) фильтр (objectCategory=computer) поиск только пк. attrList(какие колонки нам нужы)
Спойлер
Не удалось прогрузить медиа
как это выглядит
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 аналог ld в отрывке кода выше,он служит как объект для доступа к заданному серверу ldap. 
В строке             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()
и main,py
Python:
 from txtpars import parse_file
file_path = 'nup.txt'  #put' k file
parse_file(file_path)

С парсингом в принципе все и так понятно. Данные идут формата
Code:
domain.com:[email protected]:password


(без ldap:// он подставляется по ходу скрипта)
Не могу прикрепить фотку на форум,получается битой=( поэтому залил на хостинг
Не удалось прогрузить медиа

11231123 hosted at ImgBB

Изображение 11231123 размещено на ImgBB
Не удалось прогрузить медиа
ibb.co
Перед запуском
Code:
pip install python-ldap
Запуск через python3 main.py

архив с файлами https://send.exploit.biz/download/ec1ea586ffdf5e40/#1U1CxsNMGQ23wyI3gxzqdA
👍28 ❤️7 😮8

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