一个针对匿名(null)会话的单次遍历 Active Directory 枚举器,
使用 \samr 和 \lsarpc 命名管道。无需凭据。
它做的事情经典工具都能做。它所做的就是把所有信息集中在
一次运行中收集,并清晰地呈现结果。在一次渗透中,你没有域账户就进入,
通过 DNS 找到 DC,然后想要获得全貌——账户、
每个用户的详细信息、组、策略以及 LSA/DNS 相关信息——而不必拼凑
rpcclient 会话或几个独立的脚本,然后手动解析它们的 stdout。这个工具为你完成这一遍
并写出结构化、可复用的输出:
manifest.json、可直接使用的 userlist.txt /
computerlist.txt,以及一个保存的 RID 列表,你可以复用它,而不必暴力枚举
两次。请仅在你拥有或明确授权测试的系统上运行此工具。 未经许可枚举他人的目录是不对的, 而且根据你所在的地区,这可能违法。
有两个行为完全相同的版本。使用你拥有的那个库:
adnullenum.py — 基于 impacket 构建。$ 结尾的那些)被
与真实用户分开。它还会为你标记有趣的账户:例如“不需要密码”、“密码永不过期”、可进行 AS-REP 烘焙、无约束委派、 从未登录过,或描述中提到了密码。
由此自然得出的几件事:
这里的一切都是标准的匿名 SAMR/LSARPC,现有工具 已经能获取相同的数据。这是一个便利封装,而不是新能力, 所以值得了解替代方案:
--rid-brute、--users、
--pass-pol)在更大的框架内覆盖相同的枚举。samrdump.py(用户/组/别名 +
每个用户详细信息)和 lookupsid.py(通过 LSA 进行 RID 循环)。没有单次运行,没有
SAMR→LSA 回退,仅 stdout。rpcclient 暴露底层调用(queryuser、enumdomusers、
querydominfo、lsaquery、lookupsids……),但是交互式的且仅 stdout。
它的 enumdomusers 按名称列出标准用户,没有机器($)账户,而
完整详细信息需要一次一个 。没有内置的 RID 循环,它
无法恢复计算机或绕过受限枚举。参见
。adnullenum 增加的是打包:一次 null 会话运行而不是多个工具, SAMR 优先并可选 LSA 回退,精选的有趣账户标志,以及 整洁的多格式输出,你可以直接交给下一步或稍后重新打开。 如果这个工作流适合你的工作方式,就用它;如果你更想要一个久经考验的工具, 就用 enum4linux-ng 或 NetExec。
你需要 Python 3.9+ 和一个 SMB 库。虚拟环境可以保持整洁:
# 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
就这样。运行 python3 adnullenum.py --help 查看所有内容。
一切都通过单个 --mode 运行。默认是 recon,这是
首先运行的安全选择。
# 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
如果域不允许你直接列出用户(很常见),该工具会回退到 RID 循环:它要求 DC 以 1000 个为一批将账户 ID 转换为名称。默认情况下,它会 向上扫描,直到找到 DC 声称存在的所有内容,或者直到连续 5000 个 ID 返回空。你可以将其固定到精确 范围:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
一些 DC 完全拒绝匿名 SAMR(enumdomains 和 RID 转换返回
ACCESS_DENIED)。运行不会放弃:
\lsarpc,它经常在 SAMR 不响应时响应。--lsa-fallback,该工具会使用域 SID 通过 LSA
LsarLookupSids 重试相同的扫描,这仍然给你账户
清单(名称和类型,包括计算机)。它默认关闭,因为
这是第二次暴力枚举;没有该标志,运行会在 recon 停止并
说明原因。查找账户是慢的部分,所以该工具在
每次运行的输出文件夹中保存列表(rids.txt)。用 --session 将后续运行指向该文件夹,
它会跳过暴力枚举并复用你已经找到的内容:
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 接受上一次运行的文件夹。(--rid-file 从每行一个 RID 的纯文本文件做同样的事。)
每次运行都会在 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 和 csv 始终写入;添加 --json 还会生成 json/ 文件夹。
lists/ 文件夹包含两个纯文本文件,用于直接提供给其他工具:
lists/userlist.txt — 直接用于 AS-REP 烘焙、密码喷洒,
或破解器的 --users 列表。在 users/full 模式下,它包含仅启用的
账户;在 rids 模式下(没有每个用户详细信息),它是每个用户。lists/computerlist.txt — 机器账户名称保留 $(
sAMAccountName),用于 Windows 2000 之前机器账户检查。忘了查看它们,或者只运行了 rids 现在想要列表?指向
运行的文件夹,它们会从 CSV 重建,无需网络:
python3 adnullenum.py --lists-from output/20260917-1530_10.0.0.10_full
在屏幕上你会得到一个有上限的预览,这样大域不会淹没你的终端
(--limit,默认每节 100)——文件始终包含完整数据。
当你在终端时颜色开启;--no-color 关闭它。
针对测试 DC 的 full 运行(已脱敏)。在屏幕上你会得到 recon、RID
扫描、有趣账户摘要以及写入的文件列表:
$ 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
来自 txt/users.txt 的单条记录(主要组和直接组被
解析为名称):
[+] 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
这里的一切都是标准 SAMR/LSARPC,所以你可以用 Samba 的 rpcclient 一次一个调用地提取相同的事实。首先匿名连接:
rpcclient -U "" -N 10.0.0.10
enumdomusers 仅按名称返回标准用户账户;机器($)账户
被过滤掉,完整详细信息意味着一次一个账户地运行 queryuser。
rpcclient 没有内置的 RID 循环,所以当服务器端枚举受限时,它无法恢复机器
账户(或其他任何东西);你需要自己在一个范围上编写 lookupsids 脚本。它也没有锁定策略命令
并且不返回 LSA DNS/林/GUID 或信任,这就是为什么此工具
直接查询 PolicyDnsDomainInformation。
有关脚本化等价物以及此工具与它们的关系,参见 如何比较。
如果你在蓝队一方并想关闭这个,匿名路径是 需要关闭的东西:
RestrictAnonymousSAM / RestrictAnonymous
设置)。这些都不能阻止已登录用户读取相同的数据——这是正常 且预期的。它只关闭无凭据路径。
\samr 的大量账户 ID 查找,或对 \lsarpc 的策略/查找调用。--sleep 和 --jitter 可以将调用分散开,所以对
一个窗口内的总数发出警报,而不是仅对速率发出警报。--lsa-fallback 尝试
LSA LsarLookupSids 获取清单(参见“当 SAMR 被锁定时”)。如果 LSA
查找也被阻止,则只能进行 recon(域名 + SID)。MIT。参见 LICENSE。
queryuser| 模式 | 你得到什么 |
|---|
recon | 域信息、计数、密码/锁定策略以及 LSA/DNS 详细信息。不进行暴力枚举。只是四处看看。 |
rids | 找出哪些账户存在,并将它们分类为用户 / 计算机 / 组。 |
users | 上述内容,加上每个真实用户的完整详细信息以及“有趣账户”摘要。添加 --include-groups 还会列出每个用户的组。 |
groups | 域组和内置别名及其成员。 |
full | 全部内容。 |
| 此工具 | rpcclient 等价物 |
|---|
recon(域信息 + 计数) | querydominfo |
recon(密码策略) | getdompwinfo |
recon(LSA 域 + SID) | lsaquery、lsaenumsid |
rids(名称/SID 转换) | lookupnames <name>、lookupsids <SID> |
rids(服务器端列表) | enumdomusers(仅标准用户——没有 $ 机器账户) |
users(每个用户详细信息) | queryuser <rid> 或 queryuser <name>、querydispinfo |
groups | enumdomgroups、querygroupmem <rid>、enumalsgroups builtin、queryaliasmem builtin <rid> |