O LDAP é um provedor ADSI (Active Directory Service Interfaces) - essencialmente uma API - que oferece suporte à funcionalidade de pesquisa em um Active Directory. Isso nos permite interagir com o Domain Controller e extrair informações não privilegiadas sobre os objetos no domínio.
O protótipo do caminho completo do provedor LDAP (que é necessário para realizar as consultas), segue a base do exemplo abaixo:
LDAP://HostName[:PortNumber][/DistinguishedName]
Para descobrirmos qual sabermos qual o caminho do nosso AD, basta executar os comandos abaixos no Powershell:
O LDAP é configurado para autenticar credenciais no AD usando uma operação "BIND" para definir o estado de autenticação para uma sessão LDAP. Existem dois tipos de autenticação LDAP.
Simple Authentication = Isso inclui autenticação anônima, autenticação não autenticada e autenticação de nome de usuário/senha. Autenticação simples significa que um nome de usuário e uma senha criam uma solicitação BIND para autenticação no servidor LDAP.
SASL Authentication = A estrutura Simple Authentication and Security Layer (SASL) usa outros serviços de autenticação, como Kerberos, para vincular-se ao servidor LDAP e, em seguida, usa esse serviço de autenticação (Kerberos neste exemplo) para autenticar no LDAP. O servidor LDAP usa o protocolo LDAP para enviar uma mensagem LDAP ao serviço de autorização, que inicia uma série de mensagens de desafio/resposta resultando em autenticação bem-sucedida ou malsucedida. O SASL pode fornecer segurança adicional devido à separação dos métodos de autenticação dos protocolos de aplicação.
As mensagens de autenticação LDAP são enviadas em texto simples por padrão para que qualquer pessoa possa detectar mensagens LDAP na rede interna. Recomenda-se usar criptografia TLS (LDAPS - Porta 636) ou similar para proteger essas informações em trânsito.
Enumeração
LDP
Abra o ldp, vá na aba Connection > connect e digite o IP do servidor AD. A porta por padrão vem a 389 (LDAP), mas se quiser pode também utilizar a porta 3268 para pegar o Global Catalog do AD.
Depois de estabelecer uma conexão, você pode conectar com alguma conta de usuário em Connection > Bind.
Agora que já tem uma sessão LDAP autenticada, vá na aba View > Tree e digite a DN. Ex.: Se o domínio for "alvo.com", digite: dc=alvo,dc=com. Observe que agora há uma "árvore" no lado esquedo com o nome da pesquisa que acabou de fazer. Vá na árvore e expanda em CN=Users, CN=Builtin e CN=Computers para ver todos os usuários, grupos do AD e Computadores.
OBS.: Talvez também seja possível realizar autenticação com o usuário Guest (Convidado).
# AND(& (..condition_1..) (..condition_2..))(& (..condition_1..) (..condition_2..) (..condition_3..))# OR(| (..condition_1..) (..condition_2..))(| (..condition_1..) (..condition_2..) (..condition_3..))# AND e OR = Equivalente a (condition_1 AND condition_2) OR (condition_3 AND condition_4)(|(& (..condition_1..) (..condition_2..))(& (..condition_3..) (..condition_4..)))
Retorna todas as contas de usuário desabilitadas administrativamente ou ACCOUNTDISABLE
Get-ADObject-LDAPFilter'(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))'Get-ADUser-LDAPFilter'(userAccountControl:1.2.840.113556.1.4.803:=2)'|select name
Procurando por todos os computadores do AD
# Listagem completaGet-ADObject-LDAPFilter'(&(objectCategory=computer))'# Somente a quantidadeGet-ADObject-LDAPFilter'(&(objectCategory=computer))'|Measure-Object|select count
Procurando todos os usuários com o atributo adminCount definido como 1, cujo atributo useraccountcontrol esteja definido com o sinalizador "PASSWD_NOTREQD". Isso significa que a conta pode ter uma senha em branco
Vendo todos os grupos que um usuários pertence, incluindo grupos aninhados. Isso também pode ser útil para pesquisar em qual grupo, um determinado grupo está aninhado. O campo DistinguishedName irá mostrar o nome do grupo que ele está aninhado.
Get-ADGroup-Filter'member -RecursiveMatch "CN=<user>,OU=<ou>,DC=<domain>,DC=<local>"'|select nameGet-ADGroup-LDAPFilter'(member:1.2.840.113556.1.4.1941:=CN=<user>,OU=<ou>,DC=<domain>,DC=<local>)'|select Name# Pegando informações sobre qual o grupo, que determinado grupo está aninhadoGet-ADGroup-Filter'member -RecursiveMatch "CN=<name>,OU=<ou>,DC=<domain>,DC=<local>"'|select name# Pegando nome de grupos que estão aninhados a um determinado grupoGet-ADGroup-Filter'memberof -RecursiveMatch "CN=<name>,CN=<name>,DC=<domain>,DC=<local>"'# Pegando o nome de um usuário que está em um determinado grupo, através de um anihamentoGet-ADUser-Filter'memberof -RecursiveMatch "CN=<name>,CN=<name>,DC=<domain>,DC=<local>"'
Windapsearch é um script Python usado para realizar a enumeração LDAP anônima e autenticada de usuários, grupos e computadores do AD usando consultas LDAP.
# LDAP queries relacionadas a computadores do ADhttps://ldapwiki.com/wiki/Active%20Directory%20Computer%20Related%20LDAP%20Query# LDAP queries relacionadas a usuários do ADhttps://ldapwiki.com/wiki/Active%20Directory%20User%20Related%20Searches# LDAP queries relacionadas a grupos do ADhttps://ldapwiki.com/wiki/Active%20Directory%20Group%20Related%20Searches# LdapSearchhttps://linux.die.net/man/1/ldapsearch# WindapSearchhttps://github.com/ropnop/windapsearch# LdapSearch-AD.pyhttps://github.com/yaap7/ldapsearch-ad