
Enumeração anônima de Active Directory em uma única passagem via SAMR e LSARPC — sessão nula, sem credenciais, com saída estruturada reutilizável.
Um enumerador de Active Directory de passagem única para uma sessão anônima (nula),
usando os named pipes \samr e \lsarpc. Nenhuma credencial necessária.
Ele não faz nada que as ferramentas clássicas não consigam. O que ele faz é reunir tudo em
uma única execução e apresentar os resultados de forma limpa. Em um engajamento você chega sem
nenhuma conta de domínio, encontra o DC via DNS e quer o quadro completo: contas,
detalhes por usuário, grupos, política e as partes de LSA/DNS, sem precisar juntar
sessões do rpcclient ou vários scripts separados e depois analisar manualmente a saída padrão.
Isto faz essa passagem por você e grava uma saída estruturada e reutilizável:
manifest.json, userlist.txt / computerlist.txt prontos para uso,
e uma lista de RIDs salva que você pode reutilizar em vez de forçar duas vezes.Por favor, execute isto apenas contra sistemas que você possui ou está explicitamente autorizado a testar. Enumerar o diretório de outra pessoa sem permissão não é aceitável, e dependendo de onde você estiver pode ser ilegal.
Existem duas versões que se comportam de forma idêntica. Use a biblioteca que você tiver:
adnullenum.py — construído sobre impacket.$) são
separadas dos usuários reais.Ele também sinaliza contas interessantes para você: coisas como "senha não obrigatória", "senha nunca expira", AS-REP-roastable, delegação irrestrita, nunca fez logon, ou uma descrição que menciona uma senha.
Algumas coisas que decorrem naturalmente disto:
Tudo aqui é SAMR/LSARPC anônimo padrão, e as ferramentas estabelecidas já alcançam os mesmos dados. Este é um invólucro de conveniência, não uma nova capacidade, então vale a pena conhecer as alternativas:
--rid-brute, --users,
--pass-pol) cobre a mesma enumeração dentro de um framework muito maior.samrdump.py (usuários/grupos/aliases +
detalhes por usuário) e lookupsid.py (RID cycling sobre LSA). Sem execução única, sem
fallback SAMR→LSA, apenas saída padrão.rpcclient expõe as chamadas subjacentes (queryuser, enumdomusers,
querydominfo, lsaquery, lookupsids, …) mas de forma interativa e apenas saída padrão.
Seu enumdomusers lista usuários padrão por nome, sem contas de máquina ($), e
os detalhes completos são queryuser um de cada vez. Sem um loop de RID cycling embutido, ele
não consegue recuperar computadores ou contornar enumeração restrita. Veja
Fazendo manualmente.O que o adnullenum acrescenta é o empacotamento: uma execução de sessão nula em vez de várias ferramentas, SAMR primeiro com um fallback LSA opcional, sinalizadores curados de contas interessantes e saída organizada em múltiplos formatos que você pode entregar diretamente ao próximo passo ou reabrir depois. Se esse fluxo de trabalho se encaixa em como você trabalha, use-o; se você prefere uma ferramenta testada em batalha, recorra ao enum4linux-ng ou ao NetExec.
Você precisa do Python 3.9+ e de uma biblioteca SMB. Um ambiente virtual mantém tudo organizado:
# clone / copy the files, then from the project folder:
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install impacket # for adnullenum.py
É isso. Execute python3 adnullenum.py --help para ver tudo.
Tudo é executado através de um único --mode. O padrão é recon, que é a
coisa segura de executar primeiro.
| Modo | O que você obtém |
|---|---|
recon | Informações de domínio, contagens, política de senha/bloqueio e os detalhes de LSA/DNS. Sem força bruta. Apenas uma olhada ao redor. |
rids | Descobre quais contas existem e as classifica em usuários / computadores / grupos. |
users | O acima, mais detalhes completos sobre cada usuário real e o resumo de "contas interessantes". Adicione --include-groups para também listar os grupos de cada usuário. |
groups | Grupos de domínio e aliases internos com seus membros. |
full | Tudo. |
# 1. Is anonymous access open, and how big is this domain?
python3 adnullenum.py 10.0.0.10
# 2. Grab everything
python3 adnullenum.py 10.0.0.10 --mode full
# 3. Just the account inventory, wider net for a big domain
python3 adnullenum.py 10.0.0.10 --mode rids --start-rid 1000 --max-rid 200000
# 4. Go slower to stay quiet
python3 adnullenum.py 10.0.0.10 --mode users --sleep 1 --jitter 40
# 5. Also write JSON (txt and csv are always written)
python3 adnullenum.py 10.0.0.10 --mode full --json
Se o domínio não permitir listar usuários diretamente (comum), a ferramenta recorre ao RID cycling: ela pede ao DC para traduzir IDs de conta em nomes em lotes de 1000. Por padrão, ela varre para cima até ter encontrado tudo o que o DC diz que existe, ou até que 5000 IDs seguidos retornem vazios. Você pode fixá-la a um intervalo exato:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
Alguns DCs recusam completamente o SAMR anônimo (enumdomains e a tradução de RID retornam
ACCESS_DENIED). A execução não desiste:
\lsarpc, que frequentemente responde quando o SAMR não responde.--lsa-fallback, a ferramenta repete a mesma varredura sobre o LSA
LsarLookupSids usando o SID do domínio, o que ainda fornece o inventário
de contas (nomes e tipos, incluindo computadores). Está desativado por padrão porque
é uma segunda passagem de força bruta; sem o sinalizador, a execução para no recon e
informa isso.Encontrar as contas é a parte lenta, então a ferramenta salva a lista (rids.txt) na
pasta de saída de cada execução. Aponte uma execução posterior para essa pasta com --session e
ela pula a força bruta e reutiliza o que você já encontrou:
python3 adnullenum.py 10.0.0.10 --mode rids
# -> output/20260917-1530_10.0.0.10_rids/
python3 adnullenum.py 10.0.0.10 --mode users \
--session output/20260917-1530_10.0.0.10_rids
--session recebe a pasta de uma execução anterior. (--rid-file faz o mesmo
a partir de um arquivo de texto simples com um RID por linha.)
Cada execução cria uma pasta com carimbo de data/hora em output/:
output/20260917-1530_10.0.0.10_full/
├── rids.txt # the account IDs found (reuse with --session)
├── manifest.json # summary: counts, interesting accounts, run details
├── access_denied.txt # only if something was denied/restricted (with a timestamp)
├── output
├──── lists/ # ready-to-use lists (see below)
├──── txt/ # easy to read
└──── csv/ # easy to grep / open in a spreadsheet
txt e csv são sempre gravados; adicione --json para uma pasta json/ também.
A pasta lists/ contém dois arquivos simples feitos para alimentar outras ferramentas diretamente:
lists/userlist.txt — coloque diretamente em AS-REP roasting, password spraying,
ou na lista --users de um quebrador de senhas. No modo users/full ele contém apenas
contas habilitadas; no modo rids (sem detalhes por usuário) é todo usuário.lists/computerlist.txt — nomes de contas de máquina com o $ mantido (o
sAMAccountName), para verificações de contas de máquina pré-Windows 2000.Esqueceu de olhá-los, ou executou apenas rids e agora quer as listas? Aponte para a
pasta da execução e elas são reconstruídas a partir dos CSVs, sem necessidade de rede:
python3 adnullenum.py --lists-from output/20260917-1530_10.0.0.10_full
Na tela você obtém uma prévia limitada para que um domínio grande não inunde seu terminal
(--limit, padrão 100 por seção) — os arquivos sempre têm os dados completos.
A cor está ativada quando você está em um terminal; --no-color a desativa.
Uma execução full contra um DC de teste (sanitizada). Na tela você obtém o recon, a varredura
de RID, o resumo de contas interessantes e a lista de arquivos gravados:
$ python3 adnullenum.py 10.0.0.10 --mode full
[*] Connecting to 10.0.0.10:445 anonymously ...
[+] SAM domain: CORP (S-1-5-21-1111111111-2222222222-3333333333)
...
[ COUNTS ]
Users: 43
Groups: 0
Aliases: 17
[ PASSWORD POLICY ]
Min length: 7
Max age: 42 days
Properties: COMPLEX
[*] Bruting RIDs via SAMR (chunk=1000, open-ended 500-100000, stop-after 5000)
[*] up to RID 1498: 31 resolved, gap=0
[*] stop: 5000 consecutive empty RIDs (--stop-after 5000)
[+] Resolved: 5 users, 4 computers, 22 groups, 0 other
[*] Deep-querying 5 users (skipping 4 computers)
[!] Administrator (RID 500) PWD_NEVER_EXPIRES
[!] Guest (RID 501) (disabled) PWD_NOT_REQUIRED, PWD_NEVER_EXPIRES
[!] svc_sql (RID 1104) ASREP_ROASTABLE
[+] 5 users: 3 enabled, 2 disabled, 3 interesting (full detail in the users file)
[ FILES WRITTEN in output/20260101-120000_10.0.0.10_full ]
txt/recon.txt / csv/recon.csv domain info + password/lockout policy
txt/inventory.txt / csv/inventory.csv all resolved accounts
txt/users.txt / csv/users.csv full per-user detail
txt/groups.txt / csv/groups.csv groups + aliases with members
rids.txt existing RIDs (reuse with --session)
lists/userlist.txt usernames, one per line
lists/computerlist.txt machine accounts (with $)
manifest.json run metadata + counts
Um único registro de txt/users.txt (o grupo primário e os grupos diretos são
resolvidos para nomes):
[+] RID 500
Enabled: True
SamAccountName: Administrator
SID: S-1-5-21-1111111111-2222222222-3333333333-500
Description/AdminComment: Built-in account for administering the computer/domain
Last Logon: 2026-09-03 17:58:26+09:00
Password Last Set: 2026-01-23 05:14:35+09:00
Primary Group: Domain Users (513)
Account Control: NORMAL_ACCOUNT | PASSWORD_NEVER_EXPIRES
Logon Count: 92
Direct Domain Groups: Domain Users; Administrators; Domain Admins
>> INTERESTING: PWD_NEVER_EXPIRES
Tudo aqui é SAMR/LSARPC padrão, então você pode extrair os mesmos fatos uma chamada
de cada vez com o rpcclient do Samba. Conecte-se anonimamente primeiro:
rpcclient -U "" -N 10.0.0.10
| Esta ferramenta | equivalente no rpcclient |
|---|---|
recon (informações de domínio + contagens) | querydominfo |
recon (política de senha) | getdompwinfo |
recon (domínio LSA + SID) | lsaquery, lsaenumsid |
rids (tradução nome/SID) | lookupnames <name>, lookupsids <SID> |
rids (lista do lado do servidor) | enumdomusers (apenas usuários padrão — sem contas de máquina $) |
users (detalhes por usuário) | queryuser <rid> ou queryuser <name>, querydispinfo |
groups | enumdomgroups, querygroupmem <rid>, enumalsgroups builtin, queryaliasmem builtin <rid> |
enumdomusers retorna contas de usuário padrão apenas por nome; contas de máquina ($)
são filtradas, e detalhes completos significam executar queryuser uma conta de cada vez.
O rpcclient não tem um loop de RID cycling embutido, então não consegue recuperar as contas de máquina
(ou qualquer outra coisa) quando a enumeração do lado do servidor é restrita; você teria que
scriptar lookupsids em um intervalo por conta própria. Ele também não tem comando de política de bloqueio
e não retorna o LSA DNS/forest/GUID ou relações de confiança, razão pela qual esta ferramenta
consulta PolicyDnsDomainInformation diretamente.
Para equivalentes scriptados e como esta ferramenta se relaciona com eles, veja Como se compara.
Se você está do lado azul e quer desativar isto, o caminho anônimo é o que deve ser fechado:
RestrictAnonymousSAM / RestrictAnonymous).Nada disso impede que um usuário autenticado leia os mesmos dados — isso é normal e esperado. Apenas fecha o caminho sem credenciais.
\samr, ou chamadas de política/consulta contra \lsarpc, em pouco tempo.--sleep e --jitter podem distribuir as chamadas, alerte sobre a contagem
total em uma janela em vez de apenas sobre a taxa.--lsa-fallback para tentar
o LSA LsarLookupSids para o inventário (veja "Quando o SAMR está bloqueado"). Se as consultas
LSA também estiverem bloqueadas, apenas o recon (nome do domínio + SID) é possível.MIT. Veja LICENSE.