
SAMR और LSARPC पर एक-पास अनाम Active Directory गणना — null session, कोई क्रेडेंशियल नहीं, संरचित पुनः प्रयोग योग्य आउटपुट के साथ।
एक anonymous (null) session के लिए single-pass Active Directory enumerator, जो \samr और \lsarpc named pipes का उपयोग करता है। किसी credentials की आवश्यकता नहीं।
यह वह कुछ नहीं करता जो classic tools नहीं कर सकते। यह जो करता है वह सब कुछ एक ही run में इकट्ठा करता है और परिणामों को साफ़-सुथरे ढंग से प्रस्तुत करता है। किसी engagement में जब आपके पास कोई domain account नहीं होता, DNS के माध्यम से DC मिल जाता है, और आप पूरी तस्वीर चाहते हैं — accounts, per-user detail, groups, policy, और LSA/DNS से जुड़ी जानकारी — बिना rpcclient sessions या कई अलग-अलग scripts को जोड़कर उनके stdout को हाथ से parse किए। यह आपके लिए वह pass करता है और structured, reusable output लिखता है:
manifest.json, उपयोग के लिए तैयार userlist.txt / computerlist.txt, और एक saved RID list जिसे आप दोबारा brute-force करने के बजाय reuse कर सकते हैं।कृपया इसे केवल उन systems पर चलाएँ जिनके आप मालिक हैं या जिन्हें test करने के लिए आपको स्पष्ट रूप से authorized किया गया है। किसी और की directory को बिना अनुमति enumerate करना ठीक नहीं है, और आप कहाँ हैं इसके आधार पर यह अवैध भी हो सकता है।
दो versions हैं जो एक जैसा व्यवहार करते हैं। जो library आपके पास हो वही उपयोग करें:
adnullenum.py — impacket पर आधारित।$ पर समाप्त होते हैं) को असली users से अलग किया जाता है।यह आपके लिए दिलचस्प accounts भी flag करता है: जैसे "password not required", "password never expires", AS-REP-roastable, unconstrained delegation, never logged on, या ऐसा description जिसमें password का ज़िक्र हो।
इससे स्वाभाविक रूप से कुछ चीज़ें निकलती हैं:
यहाँ सब कुछ standard anonymous SAMR/LSARPC है, और स्थापित tools पहले से ही वही data तक पहुँचते हैं। यह एक convenience wrapper है, कोई नई capability नहीं, इसलिए alternatives जानना उपयोगी है:
--rid-brute, --users, --pass-pol) वही enumeration एक बहुत बड़े framework के अंदर cover करता है।samrdump.py (users/groups/aliases + per-user detail) और lookupsid.py (LSA पर RID cycling)। कोई single run नहीं, कोई SAMR→LSA fallback नहीं, केवल stdout।rpcclient underlying calls (queryuser, enumdomusers, querydominfo, lsaquery, lookupsids, …) को expose करता है लेकिन interactively और केवल stdout। इसका standard users को नाम से list करता है, कोई machine () accounts नहीं, और पूरी detail के लिए एक-एक करके चलाना पड़ता है। कोई built-in RID-cycling loop न होने के कारण यह computers को recover नहीं कर सकता या restricted enumeration के आसपास काम नहीं कर सकता। देखें ।adnullenum जो जोड़ता है वह packaging है: कई tools के बजाय एक null-session run, SAMR-first with an opt-in LSA fallback, curated interesting-account flags, और साफ़ multi-format output जिसे आप सीधे अगले step को दे सकते हैं या बाद में फिर से खोल सकते हैं। यदि यह workflow आपके काम करने के तरीके से मेल खाता है, तो इसे उपयोग करें; यदि आप battle-tested tool पसंद करते हैं, तो enum4linux-ng या NetExec का सहारा लें।
आपको Python 3.9+ और एक SMB library चाहिए। एक virtual environment इसे साफ़-सुथरा रखता है:
# 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 के माध्यम से चलता है। default 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
यदि domain आपको सीधे users list करने नहीं देता (आम बात है), तो tool RID cycling पर fallback करता है: यह DC से account IDs को 1000 के batches में names में translate करने के लिए कहता है। default रूप से यह तब तक ऊपर की ओर sweep करता है जब तक वह वह सब कुछ नहीं खोज लेता जो DC कहता है मौजूद है, या जब तक लगातार 5000 IDs खाली वापस न आ जाएँ। आप इसे इसके बजाय एक सटीक range पर pin कर सकते हैं:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
कुछ DCs anonymous SAMR को पूरी तरह मना कर देते हैं (enumdomains और RID translation ACCESS_DENIED वापस आते हैं)। Run हार नहीं मानता:
\lsarpc से आते हैं, जो अक्सर तब जवाब देता है जब SAMR नहीं देता।--lsa-fallback पास करते हैं, तो tool domain SID का उपयोग करके LSA LsarLookupSids पर वही sweep दोबारा आज़माता है, जो अभी भी आपको account inventory (names और types, computers सहित) देता है। यह default रूप से off है क्योंकि यह एक दूसरा brute-force pass है; flag के बिना run recon पर रुक जाता है और ऐसा बताता है।Accounts खोजना slow हिस्सा है, इसलिए tool हर run के output folder में list (rids.txt) save करता है। बाद के run को --session के साथ उस folder पर point करें और यह brute को skip करके वही reuse करता है जो आपने पहले ही खोज लिया था:
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 पिछले run का folder लेता है। (--rid-file वही काम एक plain text file से करता है जिसमें प्रति line एक RID होती है।)
हर run output/ के नीचे एक timestamped folder छोड़ता है:
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/ folder के लिए --json जोड़ें।
lists/ folder में दो plain files होती हैं जो सीधे अन्य tools को feed करने के लिए बनाई गई हैं:
lists/userlist.txt — सीधे AS-REP roasting, password spraying, या किसी cracker की --users list में डालें। users/full mode में इसमें केवल enabled accounts होते हैं; rids mode में (कोई per-user detail नहीं) यह हर user है।lists/computerlist.txt — machine-account names $ सहित (sAMAccountName), pre-Windows 2000 machine-account checks के लिए।उन्हें देखना भूल गए, या केवल rids चलाया और अब lists चाहिए? Run के folder पर point करें और वे CSVs से rebuild हो जाती हैं, कोई network आवश्यक नहीं:
python3 adnullenum.py --lists-from output/20260917-1530_10.0.0.10_full
स्क्रीन पर आपको एक capped preview मिलता है ताकि बड़ा domain आपके terminal को flood न करे (--limit, default 100 प्रति section) — files में हमेशा पूरा data होता है। जब आप terminal पर हों तो colour on रहता है; --no-color इसे बंद कर देता है।
एक test DC (sanitized) के विरुद्ध एक full run। स्क्रीन पर आपको recon, RID sweep, interesting-account summary, और लिखी गई files की list मिलती है:
$ 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 से एक single record (primary group और direct groups names में resolved हैं):
[+] 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
यहाँ सब कुछ standard SAMR/LSARPC है, इसलिए आप Samba के rpcclient के साथ एक-एक call करके वही तथ्य निकाल सकते हैं। पहले anonymously connect करें:
rpcclient -U "" -N 10.0.0.10
enumdomusers standard user accounts को केवल नाम से लौटाता है; machine ($) accounts filtered out हो जाते हैं, और पूरी detail का मतलब है queryuser एक-एक account पर चलाना। rpcclient में कोई built-in RID-cycling loop नहीं है, इसलिए जब server-side enumeration restricted हो तो यह machine accounts (या कुछ और) recover नहीं कर सकता; आपको खुद एक range पर lookupsids script करना पड़ेगा। इसमें कोई lockout-policy command भी नहीं है और यह LSA DNS/forest/GUID या trusts वापस नहीं करता, यही कारण है कि यह tool सीधे PolicyDnsDomainInformation query करता है।
Scripted equivalents और यह tool उनसे कैसे संबंधित है, इसके लिए देखें How it compares।
यदि आप blue side पर हैं और इसे बंद करना चाहते हैं, तो anonymous path ही वह चीज़ है जिसे बंद करना है:
RestrictAnonymousSAM / RestrictAnonymous settings)।इनमें से कोई भी किसी logged-in user को वही data पढ़ने से नहीं रोकता — यह सामान्य और अपेक्षित है। यह केवल no-credentials path को बंद करता है।
\samr के विरुद्ध बहुत सारे account-ID lookups, या \lsarpc के विरुद्ध policy/lookup calls।--sleep और --jitter calls को फैला सकते हैं, इसलिए केवल rate पर नहीं बल्कि एक window में total count पर alert करें।LsarLookupSids आज़माने हेतु --lsa-fallback जोड़ें (देखें "When SAMR is locked down")। यदि LSA lookups भी blocked हों, तो केवल recon (domain name + SID) संभव है।MIT. देखें LICENSE।
enumdomusers$queryuser| Mode | आपको क्या मिलता है |
|---|
recon | Domain info, counts, password/lockout policy, और LSA/DNS details। कोई brute-forcing नहीं। बस एक नज़र। |
rids | पता लगाता है कि कौन से accounts मौजूद हैं और उन्हें users / computers / groups में छाँटता है। |
users | ऊपर वाला सब, साथ ही हर असली user पर पूरी detail और "interesting accounts" summary। हर user के groups भी list करने के लिए --include-groups जोड़ें। |
groups | Domain groups और builtin aliases उनके members के साथ। |
full | यह सब कुछ। |
| यह tool | rpcclient equivalent |
|---|
recon (domain info + counts) | querydominfo |
recon (password policy) | getdompwinfo |
recon (LSA domain + SID) | lsaquery, lsaenumsid |
rids (name/SID translation) | lookupnames <name>, lookupsids <SID> |
rids (server-side list) | enumdomusers (standard users only — no $ machine accounts) |
users (per-user detail) | queryuser <rid> or queryuser <name>, querydispinfo |
groups | enumdomgroups, querygroupmem <rid>, enumalsgroups builtin, queryaliasmem builtin <rid> |