
Однопроходное анонимное перечисление Active Directory через SAMR и LSARPC — null-сессия, без учётных данных, со структурированным переиспользуемым выводом.
Однопроходный перечислитель Active Directory для анонимной (null) сессии,
использующий именованные каналы \samr и \lsarpc. Учётные данные не требуются.
Он не делает ничего, чего не умеют классические инструменты. Он собирает всё за
один запуск и аккуратно раскладывает результаты. На пентесте вы приходите без
доменной учётной записи, находите контроллер домена через DNS и хотите получить
полную картину: учётные записи, детали по каждому пользователю, группы, политику
и данные LSA/DNS — без склейки сессий rpcclient или нескольких отдельных скриптов
и последующего ручного разбора их stdout. Этот инструмент выполняет такой проход за
вас и записывает структурированный, пригодный для повторного использования вывод:
manifest.json,
готовые к использованию userlist.txt / computerlist.txt и сохранённый список
RID, который можно переиспользовать вместо повторного брутфорса.Пожалуйста, запускайте это только против систем, которыми вы владеете или которые вам явно разрешено тестировать. Перечисление чужого каталога без разрешения недопустимо и, в зависимости от вашего местоположения, может быть незаконным.
Есть две версии, которые ведут себя одинаково. Используйте ту, для которой у вас есть библиотека:
adnullenum.py — построен на impacket.$) отделяются от реальных пользователей.Он также помечает интересные учётные записи для вас: такие как «пароль не требуется», «пароль никогда не истекает», AS-REP-roastable, unconstrained delegation, никогда не входил в систему или описание, упоминающее пароль.
Пара вещей, которые естественно следуют из этого:
Всё здесь — стандартный анонимный SAMR/LSARPC, и устоявшиеся инструменты уже получают те же данные. Это удобная обёртка, а не новая возможность, поэтому стоит знать об альтернативах:
--rid-brute, --users,
--pass-pol) покрывает то же перечисление внутри гораздо более крупного
фреймворка.samrdump.py
(пользователи/группы/алиасы + детали по каждому пользователю) и lookupsid.py
(RID cycling через LSA). Ни одного единого запуска, ни fallback SAMR→LSA, только
stdout.rpcclient предоставляет доступ к нижележащим вызовам (queryuser,
enumdomusers, querydominfo, lsaquery, lookupsids, …), но интерактивно и
только в stdout. Его enumdomusers перечисляет стандартных пользователей по
имени, без учётных записей машин ($), а полные детали — это queryuser по
одному за раз. Без встроенного цикла RID cycling он не может восстановить
компьютеры или обойти ограниченное перечисление. См.
Как сделать это вручную.Что добавляет adnullenum — это упаковку: один запуск null-сессии вместо нескольких инструментов, SAMR в первую очередь с опциональным fallback на 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, это безопасная вещь,
которую стоит запускать первой.
| Режим | Что вы получаете |
|---|---|
recon | Информация о домене, счётчики, политика паролей/блокировки и детали LSA/DNS. Без брутфорса. Просто осмотреться. |
rids | Находит, какие учётные записи существуют, и сортирует их на пользователей / компьютеры / группы. |
users | Всё вышеперечисленное плюс полные детали по каждому реальному пользователю и сводка «интересных учётных записей». Добавьте --include-groups, чтобы также перечислить группы каждого пользователя. |
groups | Доменные группы и встроенные алиасы с их участниками. |
full | Всё это. |
# 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 cycling: он просит контроллер домена преобразовать идентификаторы учётных записей в имена пакетами по 1000. По умолчанию он сканирует вверх, пока не найдёт всё, что, по словам контроллера домена, существует, или пока 5000 идентификаторов подряд не вернутся пустыми. Вместо этого вы можете задать точный диапазон:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
Некоторые контроллеры домена полностью отказывают в анонимном SAMR (enumdomains
и преобразование RID возвращают ACCESS_DENIED). Запуск не сдаётся:
\lsarpc, который часто отвечает, когда SAMR — нет.--lsa-fallback, инструмент повторяет тот же
проход через LSA LsarLookupSids, используя SID домена, что всё ещё даёт вам
инвентарь учётных записей (имена и типы, включая компьютеры). По умолчанию это
выключено, потому что это второй проход брутфорса; без флага запуск
останавливается на 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 roasting, password spraying
или списка --users для крэкера. В режиме users/full он содержит только
включённые учётные записи; в режиме rids (без деталей по каждому
пользователю) — всех пользователей.lists/computerlist.txt — имена учётных записей машин с сохранённым $
(sAMAccountName), для проверок учётных записей машин pre-Windows 2000.Забыли посмотреть на них или запустили только rids и теперь хотите списки?
Укажите на папку запуска, и они будут пересобраны из CSV, сеть не нужна:
python3 adnullenum.py --lists-from output/20260917-1530_10.0.0.10_full
На экране вы получаете ограниченный предпросмотр, чтобы большой домен не затопил
ваш терминал (--limit, по умолчанию 100 на секцию) — в файлах всегда полные
данные. Цвет включён, когда вы в терминале; --no-color отключает его.
Запуск 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, так что вы можете вытащить те же факты по
одному вызову за раз с помощью rpcclient из Samba. Сначала подключитесь
анонимно:
rpcclient -U "" -N 10.0.0.10
| Этот инструмент | Эквивалент в 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> |
enumdomusers возвращает стандартные учётные записи пользователей только по
имени; учётные записи машин ($) отфильтровываются, а полные детали означают
запуск queryuser по одной учётной записи за раз. У rpcclient нет встроенного
цикла RID cycling, поэтому он не может восстановить учётные записи машин (или
что-либо ещё), когда серверное перечисление ограничено; вам пришлось бы
самостоятельно написать скрипт с lookupsids по диапазону. У него также нет
команды политики блокировки и он не возвращает LSA DNS/forest/GUID или доверия,
поэтому этот инструмент запрашивает PolicyDnsDomainInformation напрямую.
О скриптовых эквивалентах и о том, как этот инструмент соотносится с ними, см. Как это соотносится с другими.
Если вы на синей стороне и хотите это закрыть, анонимный путь — то, что нужно закрыть:
RestrictAnonymousSAM / RestrictAnonymous).Ничто из этого не мешает вошедшему в систему пользователю читать те же данные — это нормально и ожидаемо. Это закрывает только путь без учётных данных.
\samr или вызовов политики/поиска к \lsarpc за короткое время.--sleep и --jitter могут растянуть вызовы во времени, оповещайте
об общем количестве за окно, а не только о скорости.--lsa-fallback, чтобы попробовать LSA LsarLookupSids для инвентаря (см.
«Когда SAMR заблокирован»). Если LSA-запросы тоже заблокированы, возможен только
recon (имя домена + SID).MIT. См. LICENSE.