
ماسح منافذ TCP، يرسل حزم SYN بشكل غير متزامن، لمسح الإنترنت بالكامل في أقل من 5 دقائق.
هذا ماسح منافذ على نطاق الإنترنت. يمكنه مسح الإنترنت بأكمله في أقل من 5 دقائق، بإرسال 10 ملايين حزمة في الثانية، من جهاز واحد.
طريقة استخدامه (المعاملات، المخرجات) تشبه nmap، أشهر ماسح منافذ.
في حالة الشك، جرب إحدى هذه الميزات – الميزات التي تدعم المسح الواسع
للعديد من الأجهزة مدعومة، بينما المسح المتعمق لجهاز واحد غير مدعوم.
داخليًا، يستخدم الإرسال غير المتزامن، المشابه لماسحات المنافذ مثل
scanrand وunicornscan وZMap. إنه أكثر مرونة، حيث يسمح
بنطاقات المنافذ والعناوين الاعتباطية.
ملاحظة: يستخدم masscan حزمة TCP/IP مخصصة خاصة به. أي شيء غير
مسح المنافذ البسيط قد يسبب تعارضًا مع حزمة TCP/IP المحلية. هذا يعني أنك
تحتاج إلى استخدام الخيار --src-ip للتشغيل من عنوان IP مختلف، أو
استخدام --src-port لتحديد منافذ المصدر التي يستخدمها masscan، ثم أيضًا
تكوين جدار الحماية الداخلي (مثل pf أو iptables) لعزل تلك المنافذ
عن باقي نظام التشغيل.
هذه الأداة مجانية، لكن فكر في المساهمة بمال لتطويرها: عنوان محفظة البيتكوين: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T
على Debian/Ubuntu، يكون الأمر كالتالي تقريبًا. لا يعتمد
على أي تبعيات أخرى غير مترجم C (مثل gcc
أو clang).
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
هذا يضع البرنامج في المجلد الفرعي masscan/bin.
لتثبيته (على Linux) شغّل:
make install
تتكون الشيفرة المصدرية من العديد من الملفات الصغيرة، لذا يصبح البناء أسرع بكثير
باستخدام البناء متعدد الخيوط. هذا يتطلب أكثر من 2 جيجابايت على
Raspberry Pi (وينهار)، لذا قد تستخدم رقمًا أصغر، مثل -j4 بدلاً من
جميع الخيوط الممكنة.
make -j
بينما Linux هو النظام الأساسي المستهدف الرئيسي، تعمل الشيفرة جيدًا على العديد من الأنظمة الأخرى (Windows وmacOS وما إلى ذلك). إليك بعض معلومات البناء الإضافية:
makemakegmakecc src/*.c -o bin/masscanعلى macOS، يبدو أن الثنائيات x86 تعمل بنفس السرعة تحت محاكاة ARM.
الاستخدام مشابه لـ nmap. لمسح قطاع شبكة لبعض المنافذ:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
سيقوم هذا بـ:
10.x.x.x، والشبكات الفرعية 2603:3001:2d00:da00::x<stdout> التي يمكن توجيهها إلى ملفلرؤية القائمة الكاملة للخيارات، استخدم ميزة --echo. هذه
تقوم بإلقاء الإعدادات الحالية والخروج. يمكن استخدام هذا المخرج كمدخل مرة أخرى
للبرنامج:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
يمكن لـ Masscan القيام بأكثر من مجرد اكتشاف ما إذا كانت المنافذ مفتوحة. يمكنه أيضًا إكمال اتصال TCP والتفاعل مع التطبيق على ذلك المنفذ لالتقاط معلومات "الشعار" البسيطة.
يدعم Masscan فحص الشعارات على البروتوكولات التالية:
المشكلة في ذلك هي أن masscan يحتوي على حزمة TCP/IP خاصة به منفصلة عن النظام الذي تقوم بتشغيله عليه. عندما يستقبل النظام المحلي SYN-ACK من الهدف المفحوص، فإنه يستجيب بحزمة RST تقتل الاتصال قبل أن يتمكن masscan من التقاط الشعار.
أسهل طريقة لمنع هذا هي تخصيص عنوان IP منفصل لـ masscan. سيبدو هذا مثل أحد الأمثلة التالية:
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
يجب أن يكون العنوان الذي تختاره على الشبكة الفرعية المحلية وألا يستخدم من قبل نظام آخر. سيحذرك Masscan أنك ارتكبت خطأ، لكن قد تكون أربكت اتصالات الجهاز الآخر لعدة دقائق، لذا كن حذرًا.
في بعض الحالات، مثل WiFi، هذا غير ممكن. في تلك الحالات، يمكنك عزل المنفذ الذي يستخدمه masscan عبر جدار الحماية. هذا يمنع حزمة TCP/IP المحلية من رؤية الحزمة، لكن masscan لا يزال يراها لأنه يتجاوز الحزمة المحلية. بالنسبة لـ Linux، سيبدو هذا كالتالي:
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
ربما تريد اختيار منافذ لا تتعارض مع المنافذ التي قد يختارها Linux للمنافذ المصدر. يمكنك رؤية النطاق الذي يستخدمه Linux، وإعادة تكوين ذلك النطاق، من خلال النظر في الملف:
/proc/sys/net/ipv4/ip_local_port_range
على أحدث إصدار من Kali Linux (أغسطس 2018)، هذا النطاق هو 32768 إلى 60999، لذا يجب عليك اختيار منافذ أقل من 32768 أو 61000 وما فوق.
إعداد قاعدة iptables يستمر فقط حتى إعادة التشغيل التالية. تحتاج إلى معرفة كيفية
حفظ الإعدادات حسب توزيعتك، مثل استخدام iptables-save
و/أو iptables-persistent.
على Mac OS X وBSD، توجد خطوات مشابهة. لمعرفة النطاقات التي يجب تجنبها، استخدم أمرًا مثل التالي:
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
على FreeBSD وMacOS الأقدم، استخدم أمر ipfw:
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
على MacOS الأحدث وOpenBSD، استخدم أداة ترشيح الحزم pf.
قم بتحرير الملف /etc/pf.conf لإضافة سطر مثل التالي:
block in proto tcp from any to any port 40000:40015
ثم لتفعيل جدار الحماية، قم بتشغيل الأمر:
# pfctl -E
إذا كان جدار الحماية قيد التشغيل بالفعل، فإما أعد التشغيل أو أعد تحميل القواعد بالأمر التالي:
# pfctl -f /etc/pf.conf
Windows لا يستجيب بحزم RST، لذا ليست هناك حاجة لأي من هاتين التقنيتين. ومع ذلك، صمم masscan ليعمل بشكل أفضل باستخدام عنوان IP الخاص به، لذا يجب عليك تشغيله بهذه الطريقة عندما يكون ذلك ممكنًا، حتى عندما لا يكون ضروريًا بشكل صارم.
نفس الشيء مطلوب لفحوصات أخرى، مثل فحص --heartbleed،
الذي هو مجرد شكل من أشكال فحص الشعارات.
على الرغم من فائدته للشبكات الداخلية الأصغر، فإن البرنامج مصمم حقًا مع وضع الإنترنت بأكمله في الاعتبار. قد يبدو الأمر كما يلي:
# masscan 0.0.0.0/0 -p0-65535
مسح الإنترنت بأكمله أمر سيء. لأحد الأسباب، تتفاعل أجزاء من الإنترنت بشكل سيء مع المسح. لسبب آخر، تتتبع بعض المواقع عمليات المسح وتضيفك إلى قائمة الحظر، مما سيجعلك محظورًا من أجزاء مفيدة من الإنترنت. لذلك، تريد استبعاد الكثير من النطاقات. لاستبعاد النطاقات، تريد استخدام الصيغة التالية:
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
هذا يطبع النتائج فقط إلى سطر الأوامر. ربما تريدها محفوظة في ملف بدلاً من ذلك. لذلك، تريد شيئًا مثل:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
هذا يحفظ النتائج في ملف XML، مما يسمح لك بسهولة تفريغ النتائج في قاعدة بيانات أو شيء من هذا القبيل.
لكن، هذا يعمل فقط بمعدل 100 حزمة/ثانية الافتراضي، مما سيستغرق وقتًا طويلاً لمسح الإنترنت. تحتاج إلى تسريعه كما يلي:
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
هذا يزيد المعدل إلى 100,000 حزمة/ثانية، مما سيمسح الإنترنت بأكمله (باستثناء المستبعدات) في حوالي 10 ساعات لكل منفذ (أو 655,360 ساعة إذا تم مسح جميع المنافذ).
الشيء الذي يجب ملاحظته حول سطر الأوامر هذا هو أن هذه كلها خيارات
متوافقة مع nmap. بالإضافة إلى ذلك، يتم تعيين خيارات "غير مرئية" متوافقة
مع nmap لك: -sS -Pn -n --randomize-hosts --send-eth. وبالمثل،
تنسيق ملف XML مستوحى من nmap. هناك، بالطبع، الكثير
من الاختلافات، لأن الطبيعة غير المتزامنة للبرنامج
تؤدي إلى نهج مختلف جوهريًا للمشكلة.
سطر الأوامر أعلاه مرهق بعض الشيء. بدلاً من وضع كل شيء في سطر الأوامر، يمكن تخزينه في ملف بدلاً من ذلك. الإعدادات أعلاه ستبدو كالتالي:
# الفحص الخاص بي
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
لاستخدام ملف الإعدادات هذا، استخدم -c:
# masscan -c myscan.conf
هذا أيضًا يجعل الأمور أسهل عندما تكرر الفحص.
بشكل افتراضي، يقوم masscan أولاً بتحميل ملف الإعدادات
/etc/masscan/masscan.conf. أي معلمات إعدادات لاحقة تتجاوز ما هو
في ملف الإعدادات الافتراضي هذا. هناك أضع معامل "excludefile" الخاص بي
حتى لا أنساه أبدًا. إنه يعمل تلقائيًا فقط.
بشكل افتراضي، ينتج masscan ملفات نصية كبيرة إلى حد ما، لكن من السهل تحويلها إلى أي تنسيق آخر. هناك خمسة تنسيقات مخرجات مدعومة:
xml: فقط استخدم المعامل -oX <اسم الملف>.
أو استخدم المعاملات --output-format xml و --output-filename <اسم الملف>.
binary: هذا هو التنسيق المدمج لـ masscan. ينتج ملفات أصغر بكثير بحيث
عندما أمسح الإنترنت لا يمتلئ قرصي. يجب تحليلها،
رغم ذلك. الخيار --readscan سيقرأ ملفات الفحص الثنائية.
استخدام --readscan مع الخيار -oX سينتج نسخة XML من
ملف النتائج.
grepable: هذا هو تطبيق لمخرجات Nmap -oG
التي يمكن تحليلها بسهولة بواسطة أدوات سطر الأوامر. فقط استخدم
المعامل -oG <اسم الملف>. أو استخدم المعاملات --output-format grepable و
--output-filename <اسم الملف>.
json: هذا يحفظ النتائج بتنسيق JSON. فقط استخدم
المعامل -oJ <اسم الملف>. أو استخدم المعاملات --output-format json و
--output-filename <اسم الملف>.
حيثما كان معقولاً، تم بذل كل جهد لجعل البرنامج مألوفًا
لمستخدمي nmap، على الرغم من أنه مختلف جوهريًا. Masscan مضبوط
للمسح الواسع النطاق للعديد من الأجهزة، بينما nmap مصمم لـ
المسح المكثف لجهاز واحد أو نطاق صغير.
هناك اختلافان مهمان:
-p <منافذ>nmap استخدامها (مثل 10.0.0-255.0-255).يمكنك التفكير في masscan على أنه يحتوي على الإعدادات التالية بشكل دائم
ممكّنة:
-sS: يقوم بمسح SYN فقط (حاليًا، سيتغير في المستقبل)-Pn: لا يقوم بتفحص المضيفين أولاً، وهو أساسي للتشغيل غير المتزامن-n: لا يحدث تحليل DNS--randomize-hosts: المسح عشوائي تمامًا، دائمًا، لا يمكنك تغيير هذا--send-eth: يرسل باستخدام libpcap الخامإذا كنت تريد قائمة بإعدادات nmap الإضافية المتوافقة، استخدم الأمر
التالي:
# masscan --nmap
هذا البرنامج يبث حزمًا بسرعة كبيرة. على Windows، أو من الأجهزة الافتراضية، يمكنه إرسال 300,000 حزمة/ثانية. على Linux (بدون افتراضية) سيفعل 1.6 مليون حزمة في الثانية. هذا سريع بما يكفي لإذابة معظم الشبكات.
لاحظ أنه سيتسبب فقط في إذابة شبكتك الخاصة. إنه يعشوائي عناوين IP المستهدفة بحيث لا يجب أن يطغى على أي شبكة بعيدة.
بشكل افتراضي، يتم تعيين المعدل إلى 100 حزمة/ثانية. لزيادة المعدل إلى
مليون استخدم شيئًا مثل --rate 1000000.
عند مسح الإنترنت IPv4، ستقوم بمسح العديد من الشبكات الفرعية، لذلك على الرغم من وجود معدل عالٍ من الحزم الصادرة، فإن كل شبكة فرعية مستهدفة ستتلقى معدلًا صغيرًا من الحزم الواردة.
ومع ذلك، مع مسح IPv6، ستميل إلى التركيز على شبكة فرعية واحدة مستهدفة بمليارات العناوين. وبالتالي، فإن سلوكك الافتراضي سيطغى على الشبكة المستهدفة. غالبًا ما تتعطل الشبكات تحت الحمل الذي يمكن أن يولده masscan.
يصف هذا القسم قضايا التصميم الرئيسية للبرنامج.
يحتوي الملف main.c على الدالة main()، كما تتوقع. كما يحتوي أيضًا
على الدالتين transmit_thread() و receive_thread(). هذه
الدوال تم تسطيحها عمدًا والتعليق عليها بشكل كبير بحيث يمكنك
قراءة تصميم البرنامج ببساطة عن طريق التنقل سطرًا سطرًا عبر كل
منها.
هذا تصميم غير متزامن. بعبارة أخرى، هو لـ nmap مثلما
خادم الويب nginx لـ Apache. له خيوط إرسال واستقبال منفصلة
مستقلة إلى حد كبير عن بعضها البعض. إنه نفس النوع من التصميم
الموجود في scanrand و unicornscan و ZMap.
لأنه غير متزامن، فإنه يعمل بأسرع ما يسمح به إرسال الحزم الأساسي.
الفرق الرئيسي بين Masscan والماسحات الأخرى هو الطريقة التي يعشوائي بها الأهداف.
المبدأ الأساسي هو وجود متغير فهرس واحد يبدأ من صفر ويزيد بمقدار واحد لكل فحص. في شيفرة C، يتم التعبير عن هذا على النحو التالي:
for (i = 0; i < range; i++) {
scan(i);
}
يجب علينا تحويل الفهرس إلى عنوان IP. لنفترض أنك تريد مسح جميع عناوين IP "الخاصة". سيكون ذلك جدول النطاقات مثل:
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
في هذا المثال، يتم إلحاق أول 64 ألف فهرس بـ 192.168.x.x لتكوين العنوان الهدف. بعد ذلك، يتم إلحاق الـ 16 مليون التالية بـ 10.x.x.x. يتم تطبيق الفهارس المتبقية في النطاق على 172.16.x.x.
في هذا المثال، لدينا فقط ثلاثة نطاقات. عند مسح الإنترنت بأكمله، لدينا عمليًا أكثر من 100 نطاق. وذلك لأنه يجب عليك القائمة السوداء أو استبعاد الكثير من النطاقات الفرعية. هذا يقطع النطاق المطلوب إلى مئات من النطاقات الأصغر.
هذا يؤدي إلى أحد أبطأ أجزاء الشيفرة. نرسل 10 ملايين حزمة في الثانية ويجب علينا تحويل متغير فهرس إلى عنوان IP لكل فحص. نحل هذا عن طريق إجراء "بحث ثنائي" في كمية صغيرة من الذاكرة. عند معدل الحزمة هذا، تبدأ كفاءات التخزين المؤقت في الهيمنة على كفاءات الخوارزمية. هناك الكثير من التقنيات الأكثر كفاءة من الناحية النظرية، لكنها جميعًا تتطلب الكثير من الذاكرة لدرجة أنها تكون أبطأ في الممارسة.
نسمي الدالة التي تترجم من فهرس إلى عنوان IP
دالة pick(). في الاستخدام، تبدو كالتالي:
for (i = 0; i < range; i++) {
ip = pick(addresses, i);
scan(ip);
}
لا يدعم Masscan نطاقات عناوين IP فحسب، بل أيضًا نطاقات المنافذ. هذا يعني نحن بحاجة إلى الاختيار من متغير الفهرس كل من عنوان IP ومنفذ. هذا مباشر إلى حد ما:
range = ip_count * port_count;
for (i = 0; i < range; i++) {
ip = pick(addresses, i / port_count);
port = pick(ports, i % port_count);
scan(ip, port);
}
هذا يؤدي إلى جزء آخر مكلف من الشيفرة. تعليمات القسمة/المعامل هي حوالي 90 دورة ساعة، أو 30 نانو ثانية، على معالجات x86. عند الإرسال بمعدل 10 ملايين حزمة/ثانية، لدينا فقط 100 نانو ثانية لكل حزمة. لا أرى طريقة لتحسين هذا بشكل أفضل. لحسن الحظ ، يمكن تنفيذ عمليتين من هذا القبيل في وقت واحد، لذا فإن القيام باثنتين من هذه، كما هو موضح أعلاه، ليس أكثر تكلفة من القيام بواحدة.
هناك في الواقع بعض التحسينات السهلة لمشاكل الأداء المذكورة أعلاه،
لكنها جميعًا تعتمد على i++، حقيقة أن متغير الفهرس يزيد واحدًا
تلو الآخر خلال المسح. في الواقع، نحتاج إلى جعل هذا المتغير عشوائيًا. نحن
نحتاج إلى جعل ترتيب عناوين IP التي نمسحها عشوائيًا وإلا فسنقصف
شبكات الهدف التي لم تُبنَ لهذا المستوى من السرعة. نحن
نحتاج إلى توزيع حركة المرور الخاصة بنا بالتساوي على الهدف.
الطريقة التي نعشوائي بها هي ببساطة عن طريق تشفير متغير الفهرس. حسب التعريف، التشفير عشوائي ويخلق تطابقًا واحدًا لواحد بين متغير الفهرس الأصلي والمخرج. هذا يعني أنه بينما نمر خطيًا عبر النطاق، فإن عناوين IP الناتجة عشوائية تمامًا. في الشيفرة، يبدو هذا كالتالي:
range = ip_count * port_count;
for (i = 0; i < range; i++) {
x = encrypt(i);
ip = pick(addresses, x / port_count);
port = pick(ports, x % port_count);
scan(ip, port);
}
هذا أيضًا له تكلفة كبيرة. نظرًا لأن النطاق بحجم غير متوقع بدلاً من قوة زوجية جميلة للرقم 2، لا يمكننا استخدام تقنيات ثنائية رخيصة مثل AND (&) و XOR (^). بدلاً من ذلك، يجب علينا استخدام عمليات مكلفة مثل MODULUS (%). في معاييري الحالية، يستغرق تشفير المتغير 40 نانو ثانية.
هذه البنية تسمح بالكثير من الميزات الرائعة. على سبيل المثال، تدعم
"الأجزاء". يمكنك إعداد 5 آلات كل منها يقوم بخُمس المسح أو
range / shard_count. يمكن أن تكون الأجزاء آلات متعددة، أو ببساطة محولات
شبكة متعددة على نفس الجهاز، أو حتى (إذا أردت) عناوين IP مصدر متعددة
على نفس محول الشبكة.
أو، يمكنك استخدام 'بذرة' أو 'مفتاح' لدالة التشفير، بحيث تحصل على
ترتيب مختلف في كل مرة تقوم فيها بالمسح، مثل x = encrypt(seed, i).
يمكننا أيضًا إيقاف المسح مؤقتًا عن طريق الخروج من البرنامج، وببساطة
تذكر القيمة الحالية لـ i، وإعادة تشغيلها لاحقًا. أفعل ذلك كثيرًا
أثناء التطوير. أرى شيئًا يحدث بشكل خاطئ في مسح الإنترنت الخاص بي، لذلك
أضغط لإيقاف المسح، ثم أعيد تشغيله بعد إصلاح الخطأ.
ميزة أخرى هي إعادة الإرسال/المحاولات. يتم أحيانًا إسقاط الحزم على
الإنترنت، لذا يمكنك إرسال حزمتين متتاليتين. ومع ذلك، فإن الشيء الذي
يسقط حزمة واحدة قد يسقط الحزمة التي تليها مباشرة. لذلك، تريد
إرسال النسخة بعد حوالي ثانية واحدة. هذا بسيط. لدينا بالفعل
متغير 'rate'، وهو عدد الحزم في الثانية التي نرسلها
بها، لذا فإن وظيفة إعادة الإرسال هي ببساطة استخدام i + rate
كفهرس. في يوم من الأيام سأقوم بدراسة الإنترنت،
وتمييز إعادة الإرسال "المتتالي"، "ثانية واحدة"، "10 ثوانٍ"، و"دقيقة واحدة"
بهذه الطريقة لمعرفة ما إذا كان هناك أي اختلاف في ما
يتم إسقاطه.
التقنية غير المتزامنة معروفة كحل لـ "مشكلة c10k". تم تصميم Masscan للمستوى التالي من قابلية التوسع، "مشكلة C10M".
حل C10M هو تجاوز النواة. هناك ثلاثة تجاوزات رئيسية للنواة في Masscan:
يمكن لـ Masscan استخدام مشغل PF_RING DNA. هذا المشغل يقوم بنقل DMA للحزم مباشرة من ذاكرة وضع المستخدم إلى مشغل الشبكة بدون تدخل من النواة على الإطلاق. هذا يسمح للبرامج، حتى مع وحدة معالجة مركزية بطيئة، بإرسال الحزم بأقصى معدل يسمح به الأجهزة. إذا وضعت 8 بطاقات شبكة 10 جيجابت/ثانية في كمبيوتر، هذا يعني أنه يمكنه إرسال 100 مليون حزمة/ثانية.
لدى Masscan حزمة TCP مدمجة خاصة به لالتقاط الشعارات من اتصالات TCP. هذا يعني أنه يمكنه بسهولة دعم 10 ملايين اتصال TCP متزامن، بافتراض بالطبع أن الكمبيوتر لديه ذاكرة كافية.
ليس لدى Masscan أي "mutex". تكون الـ mutexes الحديثة (المعروفة باسم futexes) في الغالب في وضع المستخدم، لكن لديها مشكلتان. المشكلة الأولى هي أنها تتسبب في ارتداد خطوط التخزين المؤقت بسرعة ذهابًا وإيابًا بين وحدات المعالجة المركزية. المشكلة الثانية هي أنه عندما يكون هناك تنافس، فإنها ستقوم باستدعاء نظام في النواة، مما يقتل الأداء. الـ mutex على المسار السريع لبرنامج يحد بشدة من قابلية التوسع. بدلاً من ذلك، يستخدم Masscan "حلقات" لمزامنة الأشياء، مثل عندما تحتاج حزمة TCP في وضع المستخدم في خيط الاستقبال إلى إرسال حزمة دون التداخل مع خيط الإرسال.
لم يتم ضبط Windows وMac لنقل الحزم، ويحصلان على حوالي 300,000 حزمة في الثانية فقط، بينما يمكن لـ Linux القيام بـ 1,500,000 حزمة/ثانية. من المحتمل أن يكون هذا أسرع مما تريد على أي حال.
يُقدم مكافأة لاستغلال الثغرات، راجع ملف VULNINFO.md لمزيد من المعلومات.
يستخدم هذا المشروع دوال آمنة مثل safe_strcpy() بدلاً من الدوال غير الآمنة مثل strcpy().
يحتوي هذا المشروع على اختبارات انحدار وحدة آلية (make regress).
تم بذل الكثير من الجهد لجعل الإدخال/الإخراج يشبه nmap، الذي يعرفه (أو يجب أن يعرفه) كل من يقوم بفحص المنافذ.
يدعم Masscan IPv6، ولكن لا يوجد وضع خاص، كلاهما مدعومان في نفس الوقت. (لا يوجد خيار -6 – إنه متاح دائمًا).
في أي مثال تراه لاستخدام masscan، ما عليك سوى وضع عنوان IPv6 حيث ترى عنوان IPv4. يمكنك تضمين عناوين IPv4 وIPv6 في نفس الفحص. يتضمن الإخراج العنوان المناسب في نفس الموقع، دون أي علامة خاصة.
فقط تذكر أن مساحة عنوان IPv6 كبيرة جدًا. ربما لا ترغب في فحص نطاقات كبيرة، إلا ربما العناوين 64k الأولى من شبكة فرعية تم تعيينها عبر DHCPv6.
بدلاً من ذلك، ربما ترغب في فحص قوائم كبيرة من العناوين المخزنة في ملف (--include-file filename.txt) حصلت عليها من مصادر أخرى. كما في أي مكان آخر، يمكن أن يحتوي هذا الملف على قوائم بعناوين IPv4 وIPv6. ملف الاختبار الذي أستخدمه يحتوي على 8 ملايين عنوان. تحتاج الملفات بهذا الحجم إلى بضع ثوانٍ إضافية لقراءتها عند بدء التشغيل (يقوم masscan بفرز العناوين وإزالة المكررات قبل الفحص).
تذكر أن masscan يحتوي على مكدس الشبكة الخاص به. وبالتالي، لا يحتاج الجهاز المحلي الذي تشغل منه masscan إلى تمكين IPv6 - على الرغم من أن الشبكة المحلية تحتاج إلى القدرة على توجيه حزم IPv6.
لتجاوز 2 مليون حزمة/ثانية، تحتاج إلى محول Ethernet Intel بسرعة 10 جيجابت/ثانية وبرنامج تشغيل خاص يُعرف باسم "PF_RING ZC" من ntop. لا يحتاج Masscan إلى إعادة البناء لاستخدام PF_RING. لاستخدام PF_RING، تحتاج إلى بناء المكونات التالية:
libpfring.so (مثبت في /usr/lib/libpfring.so)pf_ring.ko (برنامج تشغيل kernel الخاص بهم)ixgbe.ko (نسختهم من برنامج تشغيل Ethernet Intel 10-Gbps)لا تحتاج إلى بناء نسختهم من libpcap.so.
عندما يكتشف Masscan أن المحول يُسمى شيئًا مثل zc:enp1s0 بدلاً من شيء مثل enp1s0، فإنه يتحول تلقائيًا إلى وضع PF_RING ZC.
يمكن العثور على مناقشة أكثر تفصيلاً في PoC||GTFO 0x15.
يحتوي المشروع على اختبار وحدة مدمج:
$ make test
bin/masscan --selftest
selftest: success!
يختبر هذا الكثير من الأجزاء الصعبة من الكود. يجب عليك القيام بذلك بعد البناء.
لاختبار الأداء، قم بتشغيل شيء مثل التالي إلى عنوان مؤقت، لتجنب تحميل جهاز التوجيه المحلي الخاص بك:
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11
يعمل --router-mac المزيف على إبقاء الحزم في مقاطع الشبكة المحلية حتى لا تخرج إلى الإنترنت.
يمكنك أيضًا الاختبار في وضع "غير متصل"، وهو مدى سرعة تشغيل البرنامج دون حمل الإرسال:
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline
يظهر هذا المعيار الثاني تقريبًا مدى سرعة تشغيل البرنامج إذا كان يستخدم PF_RING، والذي يكون حمله قريبًا من الصفر.
بالمناسبة، تستخدم خوارزمية التوزيع العشوائي بشكل كبير "الحساب الصحيح"، وهي عملية بطيئة بشكل مزمن على وحدات المعالجة المركزية. تضاعفت سرعة وحدات المعالجة المركزية الحديثة في أداء هذه العملية الحسابية، مما يجعل masscan أسرع بكثير.
تم إنشاء هذه الأداة بواسطة Robert Graham: البريد الإلكتروني: [email protected] تويتر: @ErrataRob
حقوق الطبع والنشر (c) 2013 Robert David Graham
هذا البرنامج هو برنامج مجاني: يمكنك إعادة توزيعه و/أو تعديله بموجب شروط رخصة جنو أفيرو العمومية العامة (GNU Affero General Public License) كما نشرتها مؤسسة البرمجيات الحرة، الإصدار 3 من الرخصة.
يتم توزيع هذا البرنامج على أمل أن يكون مفيدًا، ولكن دون أي ضمان؛ حتى بدون الضمان الضمني للتسويق أو الملاءمة لغرض معين. راجع رخصة جنو أفيرو العمومية العامة لمزيد من التفاصيل.
يجب أن تكون قد تلقيت نسخة من رخصة جنو أفيرو العمومية العامة مع هذا البرنامج. إذا لم يكن الأمر كذلك، فانظر https://www.gnu.org/licenses/.
list: هذه قائمة بسيطة مع زوج مضيف ومنفذ واحد
لكل سطر. فقط استخدم المعامل -oL <اسم الملف>. أو استخدم المعاملات
--output-format list و --output-filename <اسم الملف>. التنسيق هو:
<حالة المنفذ> <بروتوكول> <رقم المنفذ> <عنوان IP> <طابع زمني POSIX>
open tcp 80 XXX.XXX.XXX.XXX 1390380064