
تعداد Active Directory مجهول در یک پاس از طریق SAMR و LSARPC — نشست null، بدون اعتبارنامه، با خروجی ساختاریافته قابل استفاده مجدد.
مُعدِّد Active Directory بتمريرة واحدة لجلسة مجهولة (null)،
باستخدام الأنابيب المُسمّاة \samr و\lsarpc. لا يتطلب أي بيانات اعتماد.
لا يفعل شيئًا لا تستطيع الأدوات الكلاسيكية فعله. ما يفعله هو جمع كل شيء في
تشغيل واحد وعرض النتائج بشكل مرتب. في مهمة اختبار اختراق تبدأ بدون حساب نطاق،
وتجد وحدة التحكم بالمجال (DC) عبر DNS، وتريد الصورة الكاملة، الحسابات،
وتفاصيل كل مستخدم، والمجموعات، والسياسات، وأجزاء LSA/DNS، دون تجميع جلسات
rpcclient أو عدة نصوص منفصلة ثم تحليل مخرجاتها يدويًا. هذا يفعل ذلك نيابة عنك
ويكتب مخرجات منظمة وقابلة لإعادة الاستخدام:
manifest.json، وuserlist.txt / computerlist.txt جاهزة
للاستخدام، وقائمة RID محفوظة يمكنك إعادة استخدامها بدلًا من القوة الغاشمة
مرتين.يُرجى تشغيل هذا فقط ضد الأنظمة التي تملكها أو المصرّح لك صراحةً باختبارها. تعداد دليل شخص آخر دون إذن غير مقبول، وقد يكون غير قانوني حسب موقعك.
هناك نسختان تتصرفان بشكل متطابق. استخدم أي مكتبة متوفرة لديك:
adnullenum.py — مبني على impacket.$)
مفصولة عن المستخدمين الحقيقيين.كما يميّز الحسابات المثيرة للاهتمام نيابة عنك: أشياء مثل "كلمة المرور غير مطلوبة"، و"كلمة المرور لا تنتهي أبدًا"، وقابلة لـ AS-REP roasting، وتفويض غير مقيّد، ولم تسجّل الدخول أبدًا، أو وصف يذكر كلمة مرور.
هناك أمران ينبعان بشكل طبيعي من هذا:
كل شيء هنا هو SAMR/LSARPC مجهول قياسي، والأدوات الراسخة تصل بالفعل إلى نفس البيانات. هذا غلاف للراحة، وليس قدرة جديدة، لذا يجدر معرفة البدائل:
--rid-brute، --users،
--pass-pol) يغطي نفس التعداد داخل إطار عمل أكبر بكثير.samrdump.py (المستخدمون/المجموعات/الأسماء المستعارة +
تفاصيل كل مستخدم) وlookupsid.py (تدوير RID عبر LSA). لا تشغيل واحد، ولا
تراجع من 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. افتراضيًا تمسح تصاعديًا حتى تجد كل ما يقول DC إنه موجود، أو حتى تعود 5000 معرّف متتالية فارغة. يمكنك تثبيتها على نطاق محدد بدلًا من ذلك:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
بعض وحدات DC ترفض SAMR المجهول تمامًا (تعود enumdomains وترجمة RID بـ
ACCESS_DENIED). لا يستسلم التشغيل:
\lsarpc، الذي يستجيب كثيرًا عندما لا يستجيب SAMR.--lsa-fallback، تعيد الأداة محاولة نفس المسح عبر LSA
LsarLookupSids باستخدام SID النطاق، مما يمنحك جرد الحسابات (الأسماء
والأنواع، بما في ذلك أجهزة الكمبيوتر). إنه معطّل افتراضيًا لأنه تمريرة قوة
غاشمة ثانية؛ بدون العلامة يتوقف التشغيل عند الاستطلاع ويذكر ذلك.العثور على الحسابات هو الجزء البطيء، لذا تحفظ الأداة القائمة (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، أو رشّ كلمات المرور،
أو قائمة --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 يوقفها.
تشغيل full ضد DC اختباري (مُنقّح). على الشاشة تحصل على الاستطلاع، ومسح 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
يعيد enumdomusers حسابات المستخدمين القياسيين بالاسم فقط؛ تُستبعد حسابات
الأجهزة ($)، والتفاصيل الكاملة تعني تشغيل queryuser حسابًا واحدًا في كل
مرة. لا يملك rpcclient حلقة تدوير RID مدمجة، لذا لا يمكنه استعادة حسابات
الأجهزة (أو أي شيء آخر) عندما يكون التعداد من جهة الخادم مقيّدًا؛ ستحتاج إلى
كتابة نص برمجي لـ lookupsids على نطاق بنفسك. كما أنه لا يملك أمر سياسة قفل
ولا يعيد LSA DNS/forest/GUID أو علاقات الثقة، ولهذا تستعلم هذه الأداة عن
PolicyDnsDomainInformation مباشرةً.
للمكافئات البرمجية وكيفية ارتباط هذه الأداة بها، انظر How it compares.
إذا كنت في الجانب الأزرق وتريد إيقاف هذا، فالمسار المجهول هو ما يجب إغلاقه:
RestrictAnonymousSAM / RestrictAnonymous).لا شيء من هذا يمنع مستخدمًا مسجّل الدخول من قراءة نفس البيانات — هذا طبيعي ومتوقع. إنه فقط يغلق المسار بدون بيانات اعتماد.
\samr، أو استدعاءات السياسة/البحث ضد \lsarpc، في وقت قصير.--sleep و--jitter يمكنهما توزيع الاستدعاءات، نبّه على العدد الإجمالي
خلال نافذة بدلًا من المعدل وحده.--lsa-fallback لتجربة
LSA LsarLookupSids للجرد (انظر "When SAMR is locked down"). إذا كانت عمليات
بحث LSA محظورة أيضًا، فلا يمكن سوى الاستطلاع (اسم النطاق + 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> |