Lightweight Directory Access Protocol

LDAP is an open- an cross-platform Protocol which provides means of communication between applications like Outlook and directory services like Active Directory. By default it is running on TCP Ports 389 and 636 if you use the more secure varient which uses TLS LDAPS.

A good example of LDAP would be Microsofts Active Directory (also called AD) which is relying on LDAP to function. Whenever a client performs a search an LDAP Query is utilized to query relevant objects and return the correct results. Microsoft Outlook for example is an LDAP-enabled windows program that sends queries automaticaly to get the information the user wants. Here are some statements that might help you understand better what LDAP is.

LDAP is a way of speaking to Active Directory.
LDAP is a protocol that many different directory services and access management solutions can understand.

The relationship between AD and LDAP is much like the relationship between Apache and HTTP:
- HTTP is a web protocol.
- Apache is a web server that uses the HTTP protocol.
- LDAP is a directory services protocol.
- Active Directory is a directory server that uses the LDAP protocol.

Occasionally you’ll hear someone say, “We don’t have Active Directory, but we have LDAP.” What they probably mean is that they have another product, such as OpenLDAP, which is an LDAP server.  
It’s kind of like someone saying “We have HTTP” when they really meant “We have an Apache web server.”

LDAP is a protocol, and Active Directory is a server. LDAP authenticates Active Directory – it’s a set of guidelines to send and receive information (like usernames and passwords) to Active Directory.

What does LDAP do?

LDAPs primary functionality is to enable users to find data about organizations, persons, files and more. It does that by storing data in the LDAP directory (basically a database) and allowing authorized users to access the directory. Not only that but it also organizes objects in the directory such as users, computers and general organizational units. A popular way of implementing LDAP is to leave authentication to Kerberos, see Security for more info. From my understanding the best course of action is leaving group-based authorization to LDAP and everything else to Kerberos since this protocol is more focused on security and will put less strain on the LDAP network.

How does LDAP work?

Basically the LDAP server which authenticates the clients and replies to the LDAP queries the clients send is directly connected to a database aka the LDAP directory.

Directory Information Tree

This directory has a hierarchy also called the Directory Information Tree (DIT) of all the entries inside. Here you can see a simple hierarchy. Each of the boxes is an entry.

LDAP Entries and Attributes

Each of the entries in the DIT has a distinguished name, a collection of attributes, and a collection of object classes. For example the entry for user John has the attribute cn (stands for common name) which has the value John Doe. This is called an RDN or a relative distinguished name. Every attribute can be found by it’s DN or distinguished name which is a sequence of RDNs. For example here is the DN for Johns common name or cn: CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM. Here are some typical RDN attribute types

AcronymLong FormExplanationExample
DCDomain ComponentI.e. if the AD DNS name is company.com, there would be two domain components. One would be Company and the other com.company
cCountryThe entry is a countryDE
oOrganizationThe entry is an organzationCorp
ouOrganizational UnitMost of the time this is a group in an organizationSales
uidUser IDThe ID of a user i.e. in an organizational uni1000
cnCommon NameI.e. instead of using the uid this is the persons nameJohn Doe

DC can also mean Domain Controller

A Domain Controller is in Active Directory’s terminology a server that manages network and identity security.

Here is how you would access an attribute with an LDAP URL

LDAP://HostName[:PortNumber][/DistinguishedName]

LDIF - LDAP Data Interchange Format

LDIF is an ASCII format to exchange data and enable synchronazation between different LDAP servers. Here is an example of an LDIF file.

dn: o=burlesontech.com
objectclass: top
objectclass: organization
o: burlesontech.com

dn: ou=People, o=burlesontech.com
objectclass: organizationalUnit
ou: people

dn: ou=marketing, o=burlesontech.com
objectclass: organizationalUnit
ou: marketing

dn: cn=Cody Burleson, ou=people, o=burlesontech.com
objectclass: top  
objectclass: organizationalPerson  
cn: Cody Burleson  
sn: Burleson  
givenname: Cody  
uid: cburleson  
ou: marketing

Accessing LDAP

How do I access information on an LDAP server? Generally speaking it is pretty simple and all you need is connect with your credentials and start retrieving files. To do that I recommend the Python module LDAP3. Here you can see how to connect to a server.

>>> import ldap3
>>> server = ldap3.Server('<IP>', get_info = ldap3.ALL, port = <PORT>, use_ssl = True/False)
>>> connection = ldap3.Connection(server)
>>> connection.bind()
True                             # If the response is true you can start enumerating the server
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts: 
dc=DOMAIN,dc=DOMAIN

You can use the search_filter argument in the connection.search function to specify what you are looking and to filter you results. See here for documentation and here for examples.

Security

Authentication

LDAP offers two main methods of Authentication: simple authentication and simple authentication secure layer (SASL). Alternatevly to help LDAP you can use the more secure Protocol Kerberos. Kerberos will authenticate users which later can be authorized by LDAP to access certain information. There is also Anonymous authentication and Unauthenticated Authentication which is for logging purposes only and should not grant access to a client.

Simple Authentication

Simple authentication is quite simple to use, all it requires is the client to send a fully qualified and distinguished name to the server along with a clear text password in what’s called a bind request for authentication from the server. This is quite unsecure if implemented without an encrypted tunnel and can lead to attackers Snooping the traffic and capturing the credentials.

Simple Authentication Secure Layer

In short SASL is a Framework for Authentication and data security. It allows the authentication method to be decoupled from the application protocol, in our case LDAP. Depending on the application protocol used with SASL you can use protocols like TLS to encrypt the traffic sent. For more information please check the SASL note.

Anonymous Authentication

As an anonymous use you could have access to some LDAP resources. See here to find out how to do it.

LDAP with Kerberos

LDAP and Kerberos together make for a great combination. Kerberos is used to manage credentials securely (Authentication) while LDAP is used for holding authoritative information about the accounts, such as what they’re allowed to access (Authorization), the user’s full name and uid. To learn more, see the Kerberos note.

Authorization

LDAP offers a way to authorize users using group-based authorization. To do that the administrator has to assign users to specific groups which determine to which resources in the LDAP directory those users have access to.

Hacking

Generally having access to LDAP is very good since it allows the attacker to retrieve all kinds of information like passwords and usernames. This for example will retrieve all userPassword attributes of the objectClass=person. Basically dumping all the passwords of all users. (See Accessing LDAP to know how to get here)

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

If you have valid credentials you can use LDAPDomainDump to dump all the information about the domain admin.

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

You can also use LDAPSearch to search LDAP. Here is how to check if you can use null credentials aka as an [[LDAP#|Anonymous User]] followed by a situation where you have credentials.

ldapsearch -x -h <IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TDL>"
ldapsearch -x -h <IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TDL>"

Here is how to extract Users, Enterprise Admins and Administrators.

Users:
ldapsearch -x -h <IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TDL>"
#Example: ldapsearch -x -h <IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"

Enterprise Admins:
ldapsearch -x -h <IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TDL>"

Adminstrators:
ldapsearch -x -h <IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TDL>"

For more information and general help refer to: Hacktricks

LAPS - Local Administrator Password Solution

LAPS is a solution from microsoft to manage local account passwords. For more information see the LAPS note. Here is a quick Python script LAPSDumper that will retrieve LAPS passwords over LDAP. Here is the command to use it.

python laps.py -u user -p password[can be a hash too] -d domain.local

Useful Sources

Hacktricks Python LDAP3 Library Python LDAP3 Library - SEARCH operation LDAP + Kerberos What is LDAP, Kerberos, Active Directory Entries, Attributes and Values Basic LDAP Concepts LDIF Distinguished Names Directory Information Tree