
Consultas LDAP sem sofrimento
Esta ferramenta foi criada para resolver muitos dos problemas que eu estava enfrentando com o ldapsearch e a interação com AD em geral. Em particular, esta ferramenta aborda os seguintes problemas que eu experimentei:
Incapacidade de retornar mais de mil resultados do AD. Esta ferramenta suporta paginação de registros LDAP e contorna outros bugs do AD para permitir um número arbitrário de registros seja recuperado.
Incapacidade de usar credenciais NTLM de forma intuitiva para autenticar. Você pode fornecer o nome do domínio NETBIOS, nome de usuário e senha para autenticar em um DC Windows.
Incapacidade de controlar precisamente o número de registros retornados, a velocidade na qual eles são retornados e o número de registros puxados por vez. Esta ferramenta permite controlar todos esses itens, incluindo adicionar atrasos entre cada chamada paginada. Além disso, múltiplos DCs podem ser especificados para consultas round-robin.
Incapacidade de retornar os resultados em formas facilmente digeríveis. Esta ferramenta atualmente suporta três formatos:
Incapacidade de retornar apenas os atributos que você se importa. Esta ferramenta permite que você retorne todos os atributos, ou apenas os que desejar.
Incapacidade de ter uma lista de consultas pré-definidas comuns salvas.
git clone ...
pip install -r requirements.txt
# python3 ldapper.py
usage: ldapper.py [-h] --domain DOMAIN --user USER --password PASSWORD
--server SERVER [--basedn BASEDN] --search SEARCH
[--maxrecords MAXRECORDS] [--pagesize PAGESIZE]
[--delay DELAY] [--format {plain,json,json_tiny}]
[--encryption {1,2,3}]
[--advanced [ADVANCED [ADVANCED ...]]] [--outfile OUTFILE]
[--engine {ldap3,impacket}]
[attribute [attribute ...]]
AD LDAP Command Line Searching que não é ruim.
positional arguments:
attribute Atributos a retornar (Padrão é todos para consulta personalizada. Para consultas prontas, passe um "*" para obter todos os atributos em vez dos padrões.)
optional arguments:
-h, --help mostra esta mensagem de ajuda e sai
--domain DOMAIN, -D DOMAIN
Domínio
--user USER, -U USER Nome de usuário
--password PASSWORD, -P PASSWORD
Senha ou hash no formato LM:NTLM
--server SERVER, -S SERVER
IP do DC ou nome resolvível
--basedn BASEDN, -b BASEDN
Base DN normalmente deve ser "dc=", seguido pelo nome longo do domínio com pontos substituídos por ",dc=". Tentará derivá-lo se não for fornecido a partir do servidor LDAP.
--search SEARCH, -s SEARCH
String de pesquisa LDAP ou número indicando pesquisa personalizada da lista "Custom Searches". Use "-" para ler do stdin.
--maxrecords MAXRECORDS, -m MAXRECORDS
Número máximo de registros a retornar (Padrão é 100), 0 significa todos.
--pagesize PAGESIZE, -p PAGESIZE
Número de registros a retornar em cada puxada (Padrão é 10). Deve ser <= max records.
--delay DELAY, -d DELAY
Atraso em milissegundos entre requisições de paginação (Padrão é 0).
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
Formato da saída (Padrão é "plain"), pode ser: plain, json, json_tiny
--encryption {1,2,3}, -n {1,2,3}
3) Conectar à porta 636 TLS (Padrão); 2) Conectar à 389 Sem TLS, mas tentar STARTTLS e fallback conforme necessário (não disponível com impacket); 1) Conectar à 389, Forçar Texto Plano
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
Maneira avançada de passar opções para pesquisas prontas que solicitam entrada adicional (para múltiplos prompts, passe os argumentos na ordem do prompting)
--outfile OUTFILE, -o OUTFILE
Arquivo de saída (se especificado, a saída será direcionada aqui em vez do stdout [Pode prevenir erros de codificação no Windows])
--engine {ldap3,impacket}, -e {ldap3,impacket}
Escolha o motor a usar (Padrão é "ldap3"). VEJA NOTAS DE OPSEC!
Pesquisas Personalizadas:
1) Obter todos os usuários
1.1) Obter usuário específico (Você será solicitado pelo nome de usuário)
2) Obter todos os grupos (e seus membros)
2.1) Obter grupo específico (Você será solicitado pelo nome do grupo)
3) Obter todas as impressoras
4) Obter todos os computadores
4.1) Obter computador específico (Você será solicitado pelo nome do computador)
5) Obter Administradores de Domínio/Empresa
6) Obter Relações de Confiança de Domínio
7) Pesquisar por Delegações SPN Não Restritas (Potencial Escalação de Privilégios)
8) Pesquisar por Contas onde Pré-Autenticação não é necessária. (ASREPROAST)
9) Pesquisar por SPNs de Usuário (KERBEROAST)
9.1) Pesquisar por SPN de Usuário específico (Você será solicitado pelo Nome Principal do Usuário)
10) Mostrar Todas as Senhas LAPS LA (que você pode ver)
10.1) Pesquisar por Senha LAPS de Estação de Trabalho específica (Você será solicitado pelo Nome da Estação de Trabalho)
*11) Pesquisar por atributos comuns de senha em texto claro (UserPassword, UnixUserPassword, unicodePwd e msSFU30Password)
12) Mostrar Todas as Sementes de Dois Fatores Quest (se você tiver acesso)
13) Hash de senha SSO Oracle "orclCommonAttribute"
*14) Hash de senha SSO Oracle "userPassword"
15) Obter Servidores SCCM
16) Pesquisar por Contas onde a senha não é necessária. (PasswordNotRequired)
Itens com asterisco nunca foram testados em um ambiente onde pudessem ser verificados, então por favor me avise se funcionarem.
Para os propósitos destes exemplos, assuma o seguinte:
NOME NETBIOS: EMP
NOME COMPLETO DO DOMÍNIO: EXAMPLE.LOCAL
IPs do DC: 10.0.0.2, 10.0.0.3
NOME DE USUÁRIO: bob
SENHA: password
Recuperar todos os registros retornando apenas o atributo cn:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
Recuperar detalhes sobre um usuário específico (será solicitado pelo nome de usuário):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
Recuperar detalhes sobre um usuário específico (passe o nome de usuário para não ser solicitado):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1' -a 'alice'
Recuperar os top 100 SPNs Kerberos de usuários, no máximo cinco por vez, com dois segundos de atraso entre cada requisição de página no formato JSON compacto:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 100 -p 5 -d 2000 -f json_tiny -s '(&(objectcategory=user)(serviceprincipalname=*))' serviceprincipalname userprincipalname
Recuperar manualmente todos os registros de impressoras e mostrar todos os atributos relacionados:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
Pesquisar por Delegações SPN Não Restritas sem esforço:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
Ao usar o motor Impacket e não fornecer um baseDN, a ferramenta tentará uma autenticação SMB e conexão ao controlador de domínio para adquirir o nome NETBIOS do domínio, a fim de derivar o baseDN. Esse comportamento pode resultar em uma detecção em um ambiente altamente sensível. Ou não use Impacket em tal ambiente, ou sempre especifique o baseDN.
O Impacket fará uma conexão LDAPS completa ou uma conexão totalmente não criptografada. Ele não pode usar STARTTLS no momento, então se uma conexão LDAP em texto plano for detectada, ou tente apenas uma conexão TLS completa ou não use o motor Impacket.
O Impacket não fornece o maior controle sobre a velocidade com que os registros são puxados. Portanto, a opção "--delay" está apenas parcialmente implementada. Se atrasar a puxada de registros for crítico, não use o motor Impacket.
Kerberoast: https://adsecurity.org/?p=2293
ASREPRoast: http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
Abuso de Delegação Não Restrita: http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
Coisas da Oracle: https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password e http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
Dados de Token de Segundo Fator Qwest/Defender/Oneidentity: http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
Senhas comuns em texto claro: https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
Adicionado Impacket como alternativa ao LDAP3 porque LDAP3 nem sempre funciona (e Impacket também não).
Removida seleção múltipla de servidores LDAP, pois esse recurso não é realmente necessário e não existe no Impacket.
Refatorado tudo.
Adicionado recurso de Pesquisa SCCM.
Adicionada opção de arquivo de saída.
Corrigidas algumas coisas no formato de saída.
Adicionada capacidade de receber consulta LDAP do stdin.
Automaticamente envolver a consulta em colchetes se o usuário já não tiver feito isso.
Corrigido bug de suporte ao Python 2.
Se você tiver algumas enumerações de pesquisa comuns que usa, me avise para que eu possa adicioná-las à lista.
...
Escrito por Shelby Spencer (shellster). Entre em contato comigo para bugs ou solicitações de funcionalidades.