
أداة مراقبة مستمرة سلبية للنطاقات الفرعية ذاتية الاستضافة.
أداة مراقبة نطاقات فرعية سريعة وسهلة الاستخدام لإدارة سطح الهجوم المستمر.

لماذا تختار sub.Monitor؟ يقدم هذا البرنامج إعدادًا سهلاً بسبب استخدامه لـ SQLite لتخزين جميع النطاقات المُكتشفة (مما يلغي الحاجة إلى إدارة قاعدة بيانات مسبقة). علاوة على ذلك، يتمتع بقابلية تخصيص عالية، حيث يحتاج المستخدمون فقط إلى إضافة بضعة أسطر من الكود إلى السكربت باستخدام أدواتهم المختارة. وعلى عكس الحلول الأخرى الموجودة التي تعتمد على قواعد بيانات مثل MySQL أو MongoDB، يمكن أن يصبح تشغيل السكربت مهمة شاقة.
أعلام sub.Monitor:
options:
--add ADD Domain to scan
--out-scope OUT_SCOPE
File with out-of-scope domains
--file FILE File with known subdomains
-D DOMAIN, --domain DOMAIN
Domain to scan
-H HOURS, --hours HOURS
Hours between scans
--dump Dump all subdomains for a specific domain
--list List all root domains in the database
-df DF File with domains to scan
--inscope Dump only in-scope domains
--notinscope Dump only out-of-scope domains
--dumpall Dump all subdomains with their details
--info Show discovery date for subdomains
-help, -? Show this help message and exit
تحتاج إلى كتابة مسارات ملفات التكوين (API) في ملف config.ini.
pip3 install -r requirements.txtيمكنك بسهولة تنفيذ أدواتك الخاصة في السكربت، فقط قم بتعديل أسطر الكود:
def run_tool(tool, domain, output_file):
print(f'[{datetime.datetime.now()}] - Running {tool} on {domain}')
if tool == 'assetfinder':
assetfinder_binary = config.get('Binary paths', 'assetfinder')
cmd = f'echo {domain} | {assetfinder_binary} -subs-only | grep -E "{domain}$" |grep -v "*" | grep -v "@"'
elif tool == 'subfinder':
subfinder_binary = config.get('Binary paths', 'subfinder')
subfinder_api = config.get('Api', 'subfinder_api')
cmd = f'{subfinder_binary} -d {domain} -silent -pc {subfinder_api} -all'
elif tool == 'amass':
amass_binary = config.get('Binary paths', 'amass')
amass_api = config.get('Api', 'amass_api')
cmd = f'{amass_binary} enum -passive -norecursive -noalts -d {domain} -config {amass_api}'
elif tool == 'my-custom-tool':
my-custom-tool-binary = config.get('Binary paths', 'my-custom-tool-binary-or-script')
cmd = f'{my-custom-tool-binary} -d {domain}'
من المهم ملاحظة أنه إذا أضفت أي أداة مخصصة، يجب أن يكون الإخراج النهائي هو نتائج النطاق لكي يقوم sub.Monitor بحفظها في قاعدة البيانات، على سبيل المثال طريقة استخدامها ستكون:
cmd = f'bash customtool.sh {domain}''
...
cat customtool.sh
mycustomtool -d $1 > /tmp/$1.txt &>/dev/null; cat /tmp/$1.txt | unfurl domains | anew; rm -r /tmp/$1.txt
أيضًا أضف اسم أداتك هنا:
for tool in ['subfinder', 'amass', 'assetfinder', 'my-custom-tool-name']:
run_tool(tool, domain, output_file)
أخيرًا، بالطبع، تحتاج إلى إضافة الأداة في ملف sub.monitor-config.ini لكي يتمكن سكربت بايثون من الحصول على الثنائي من ملف التكوين ذلك.
الشيء الوحيد المطلوب هو أنه بمجرد انتهاء الأمر، يجب أن يُظهر الإخراج جميع النطاقات المُكتشفة حتى يتمكن السكربت من حفظها في ملف السجلات وداخل قاعدة البيانات.
أولاً وقبل كل شيء، يحتاج sub.Monitor إلى قائمة بالنطاقات التي تم مسحها بالفعل:
➜ cat ibm_sorted_subdomains.txt
test1.ibm.com
test2.ibm.com
test3.ibm.com
subtest.testX.ibm.com
...
الآن، يمكن تمرير الملف الذي يحتوي على النطاقات الفرعية إلى sub.Monitor باستخدام الأمر التالي:
python3 monitor.py --add ibm.com --file ibm_sorted_subdomains.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:16:26.002521] - 538 subdomains were added to the local database.
يوجد أيضًا إمكانية لإضافة علامة خارج النطاق، على سبيل المثال، لنفترض أن برنامج Bug Bounty يحتوي على السياسة التالية:
*.ibm.com - in scope
super-admin.ibm.com - out of scope
*.super-admin.ibm.com - out of scope
من الممكن إنشاء ملف بهذه المحتويات:
cat outscope.txt
super-admin.ibm.com
*.super-admin.ibm.com
الآن، يمكنك إضافة جميع النطاقات التي اكتشفتها يدويًا إلى قاعدة البيانات (مع تصفية تلك الموجودة في النطاق):
python3 monitor.py --add ibm.com --file ibm_sorted_subdomains.txt --out-scope outscope.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador.sub.Monitor
[2023-06-06 18:16:26.002521] - 538 subdomains were added to the local database.
سيؤدي هذا إلى إضافة جميع النطاقات الفرعية إلى قاعدة البيانات، ولكنه سيضع علامة على جميع النطاقات خارج النطاق بـعلامة [Out of scope] (سنرى كيفية تصفية النطاقات داخل النطاق من قاعدة البيانات في قسم تفريغ النطاقات).
لتأكيد إضافة النطاق إلى قاعدة البيانات، قم بتنفيذ:
python3 monitor.py --list
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
ibm.com [9 subdomains added manually] [2 subdomains discovered] [11 total unique in database]
بمجرد تحميله بشكل صحيح، يمكن بدء عملية المراقبة. يُوصى باستخدام TMUX على VPS وتركه قيد التشغيل لفترة طويلة. باستخدام الأمر التالي، سيقوم السكربت بتشغيل أدوات تعداد النطاقات الفرعية وسيقارن النتائج الجديدة بالنتائج القديمة. إذا تم العثور على أي نطاق فرعي جديد، فسيقوم sub.Monitor أولاً بإضافته إلى قاعدة البيانات المحلية (لن يتم الإشعار مرة أخرى عن هذا الاكتشاف) ثم سيقوم بإخطار المستخدم عبر Slack/Telegram/Discord.
python3 monitor.py -D ibm.com -H 12 --out-scope outscope.txt
إذا تم العثور على أي نطاق فرعي، فسيظهر sub.Monitor الرسالة التالية في الإخراج:
➜ python3 monitor.py -D ibm.com -H 8 # لتصفية النطاقات الفرعية الموجودة في النطاق الحالي من تلك خارج النطاق، يمكنك استخدام:
# python3 monitor.py -D ibm.com -H 8 --out-scope outscope.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:07:25.191169] - New subdomain xxxx.ibm.com discovered
[2023-06-06 18:07:25.353156] - New subdomain xyxyxyxyxyx.ibm.com discovered
[2023-06-06 18:07:25.641082] - New subdomain x1.xxxx.ibm.com discovered
من الممكن أيضًا مراقبة أكثر من نطاق واحد، باستخدام الأمر التالي:
python3 monitor.py -df root-domains.txt -H 8
python3 monitor.py -df roots.txt -H 8 --out-scope outscope.txt
بعد الإبلاغ عن تلك الرسائل، في نفس الوقت سيتلقى المستخدم الإشعارات على Telegram

كيف أدير الإشعارات؟ لقد وجدت طريقة سهلة (وسهلة الإدارة) لرؤية جميع النطاقات المكتشفة حديثًا باستخدام Discord. لدي هذا (تم تعتيمه نظرًا لأنها جميعها برامج خاصة):

الفكرة هي أولاً إنشاء فئة تخص اسم البرنامج:
> Yahoo
--- yahoo.com
--- yahoo.net
--- إلخ ...
> IBM
--- ibm.com
--- whateverdomain.com
--- إلخ ...
هذا ما يبدو عليه ملف تكوين notify الخاص بي:

أوصي بفعل ذلك لكل نطاق (قد يكون الإعداد شاقًا بعض الشيء، لكنها طريقة رائعة لإدارة النتائج). سيقوم سكربت monitor.py بإرسال النتائج إلى webhook المحدد بناءً على المعرف (الذي يجب أن يكون مطابقًا لاسم النطاق المراد مسحه).
لنفترض أن السكربت كان يعمل لمدة شهرين وتريد الحصول على جميع النتائج (النطاقات الفرعية القديمة والمكتشفة حديثًا). مع sub.Monitor، من الممكن ذلك باستخدام علامة --dump:
python3 monitor.py -D ibm.com --dump
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
subdomain1.ibm.com
subdomain2.ibm.com
...
يمكنك أيضًا استخدام الأمر التالي لرؤية اليوم الذي تم اكتشاف النطاق فيه:
python3 monitor.py -D ibm.com --dump --info
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
test.ibm.com [discovered on 06/08/2023]
test2.ibm.com [discovered on 08/08/2023] [Out of scope]
نظرًا لأنه من المحتمل جدًا أن يتم وضع علامة على بعض النطاقات على أنها خارج النطاق باستخدام الأمر python3 monitor.py -d ibm.com --dump --info، لعرض النطاقات داخل النطاق فقط، من الممكن استخدام علامة --inscope:
python3 monitor.py -D ibm.com --dump --info --inscope
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
test.ibm.com [discovered on 06/08/2023]
test3.ibm.com [discovered on 08/08/2023]
شكرًا لـ:
إذا كانت لديك أي فكرة عن وظيفة جديدة، افتح طلب سحب (PR) على https://github.com/e1abrador/sub.Monitor/pulls.
حظ سعيد وصيد موفق! إذا كنت حقًا تحب الأداة (أو أي أدوات أخرى)، أو ساعدتك في العثور على مكافأة رائعة، فكر في شراء قهوة لي! ☕ (يمكنني استخدام الكافيين!)
⚪ e1abrador