MASSCAN(8) MASSCAN(8)

masscan - اسکنر سریع و انبوه پورت‌های شبکه TCP/IP

masscan <ip addresses/ranges> -p ports options

دستور masscan یک اسکنر پورت در مقیاس اینترنت است که برای ارزیابی‌ها و پیمایش‌های بزرگ‌مقیاس اینترنت یا شبکه‌های داخلی بسیار کاربرد دارد. اگرچه نرخ ارسال پیش‌فرض آن تنها ۱۰۰ بسته در ثانیه است، اما به‌صورت اختیاری می‌تواند تا ۲۵ میلیون بسته در ثانیه سرعت داشته باشد؛ سرعتی که برای اسکن کل اینترنت روی یک پورت تنها در مدت ۳ دقیقه کافی است.

  • <ip/range>: هر چیزی در خط فرمان که با علامت «-» شروع نشود، به عنوان یک آدرس یا بازه IP در نظر گرفته می‌شود. سه قالب معتبر وجود دارد: اولی یک آدرس IPv4 منفرد مانند "192.168.0.1" است؛ دومی یک بازه مانند "10.0.0.1-10.0.0.100" است؛ سومی یک آدرس CIDR مانند "0.0.0.0/0" است. حداقل باید یک هدف مشخص شود. می‌توان چندین هدف را مشخص کرد؛ این کار می‌تواند با فاصله‌گذاری بین چند ورودی یا با استفاده از ویرگول به عنوان یک گزینه واحد انجام شود، مانند 10.0.0.0/8,192.168.0.1.
  • --range <ip/range>: همانند مشخصات بازه هدف که در بالا توضیح داده شد، با این تفاوت که به جای یک پارامتر بی‌نام، به صورت یک پارامتر نام‌دار مشخص می‌شود.
  • -p <ports, --ports <ports>: پورت یا پورت‌های مورد نظر برای اسکن را مشخص می‌کند. می‌توان یک پورت تکی مانند -p80، یک بازه از پورت‌ها مانند -p 20-25، یا فهرستی از پورت‌ها و بازه‌ها مانند -p80,20-25 را تعیین کرد. پورت‌های UDP نیز قابل تعیین هستند، مانند --ports U:161,U:1024-1100.
  • --banners: مشخص می‌کند که بنرها (مانند نسخه سرورهای HTTP، فیلدهای عنوان HTML و مواردی از این دست) دریافت شوند. تنها تعداد معدودی از پروتکل‌ها پشتیبانی می‌شوند.
  • --rate <packets-per-second>: نرخ مطلوب برای ارسال بسته‌ها را مشخص می‌کند. این مقدار می‌تواند اعداد بسیار کوچکی باشد، مانند 0.1 برای ارسال یک بسته در هر ۱۰ ثانیه، یا مقادیر بسیار بزرگی مانند 10000000 که تلاش می‌کند ۱۰ میلیون بسته در ثانیه ارسال کند. طبق تجربه نویسنده، ویندوز می‌تواند حدود ۲۵۰ هزار بسته در ثانیه ارسال کند و نسخه‌های جدید لینوکس تا ۲٫۵ میلیون بسته در ثانیه را پردازش می‌کنند. برای رسیدن به ۲۵ میلیون بسته در ثانیه، درایور PF_RING مورد نیاز است.
  • -c <filename>, --conf <filename>: یک فایل پیکربندی را می‌خواند. ساختار فایل پیکربندی در ادامه توضیح داده شده است.
  • --resume <filename>: مشابه گزینه --conf است، با این تفاوت که چند گزینه به‌طور خودکار تنظیم می‌شوند، مانند --append-output. ساختار فایل پیکربندی در ادامه توضیح داده شده است.
  • --echo: اسکن را اجرا نمی‌کند، بلکه پیکربندی فعلی را در یک فایل خروجی ذخیره می‌کند. این فایل می‌تواند بعداً همراه با گزینه -c استفاده شود. قالب این خروجی در زیربخش «ساختار فایل پیکربندی» توضیح داده شده است.
  • -e <ifname>, --adapter <ifname>: استفاده از رابط شبکه خام مشخص‌شده، مانند "eth0" یا "dna1". در صورت مشخص نشدن، از اولین رابط شبکه‌ای که دارای دروازه پیش‌فرض (gateway) باشد استفاده می‌شود.
  • --adapter-ip <ip-address>: ارسال بسته‌ها با استفاده از این آدرس IP. در صورت تعیین نشدن، از اولین آدرس IP متصل‌شده به رابط شبکه استفاده می‌شود. به جای یک آدرس IP تکی، می‌توان یک بازه را مشخص کرد. نکته: اندازه بازه باید توانی از عدد ۲ باشد، مانند ۱، ۲، ۴، ۸، ۱۶، ۱۰۲۴ و غیره آدرس.
  • --adapter-port <port>: ارسال بسته‌ها با استفاده از این شماره پورت به عنوان پورت مبدأ. در صورت عدم تعیین، یک پورت تصادفی در بازه ۴۰۰۰۰ تا ۶۰۰۰۰ انتخاب خواهد شد. این پورت باید توسط فایروال میزبان (مانند iptables) فیلتر شود تا از تداخل پشته شبکه میزبان با بسته‌های دریافتی جلوگیری گردد. به جای یک پورت تکی، می‌توان یک بازه را تعیین کرد، مانند 40000-40003. نکته: اندازه بازه باید توانی از عدد ۲ باشد، مانند مثال بالا که شامل مجموعاً ۴ پورت است.
  • --adapter-mac <mac-address>: ارسال بسته‌ها با استفاده از این آدرس به عنوان آدرس MAC مبدأ. در صورت مشخص نشدن، از نخستین آدرس MAC متصل به رابط شبکه استفاده خواهد شد.
  • --router-mac <mac address>: ارسال بسته‌ها به این آدرس MAC به عنوان مقصد. در صورت تعیین نشدن، آدرس دروازه (gateway) رابط شبکه با استفاده از ARP شناسایی و تعیین می‌شود.
  • --ping: مشخص می‌کند که اسکن شامل درخواست ICMP echo نیز باشد. این گزینه می‌تواند همراه با اسکن TCP و UDP مورد استفاده قرار گیرد.
  • --exclude <ip/range>: قرار دادن یک آدرس یا بازه IP در لیست سیاه برای جلوگیری از اسکن شدن آن. این گزینه بر هرگونه مشخصات هدف دیگر اولویت دارد و تضمین می‌کند که این آدرس یا بازه اسکن نخواهد شد. قالب آن مشابه قالب مشخصات عادی هدف است.
  • --excludefile <filename>: فهرستی از بازه‌های مستثنی‌شده را با همان قالب هدف شرح‌داده‌شده در بالا از یک فایل می‌خواند. این بازه‌ها بر تمام اهداف اولویت دارند و مانع از اسکن شدن آن‌ها می‌شوند.
  • --append-output: باعث می‌شود خروجی به انتهای فایل افزوده شود، به جای اینکه فایل رونویسی و بازنویسی شود.
  • --iflist: فهرست رابط‌های شبکه موجود را نمایش می‌دهد و سپس خارج می‌شود.
  • --retries: تعداد دفعات تلاش مجدد برای ارسال با فواصل ۱ ثانیه‌ای. توجه داشته باشید که به دلیل بدون‌وضعیت (stateless) بودن این اسکنر، تلاش‌های مجدد بدون توجه به اینکه آیا پاسخی از قبل دریافت شده است یا خیر ارسال می‌شوند.
  • --nmap: چاپ راهنمای مربوط به گزینه‌های جایگزین سازگار با nmap برای این گزینه‌ها.
  • --pcap-payloads: خواندن بسته‌ها از یک فایل libpcap شامل بسته‌ها و استخراج داده‌های کاربردی (payload) پروتکل UDP و مرتبط ساختن آن داده‌ها با پورت مقصد. سپس این داده‌ها هنگام ارسال بسته‌های UDP با پورت مقصد تطبیق‌یافته استفاده خواهند شد. به ازای هر پورت تنها یک داده کاربردی به خاطر سپرده می‌شود. مشابه --nmap-payloads است.
  • --nmap-payloads <filename>: خواندن یک فایل با قالبی مشابه فایل nmap-payloads در nmap. این فایل شامل داده‌های کاربردی UDP است تا بتوان به جای ارسال بسته‌های خالی، بسته‌های مفید UDP ارسال کرد. مشابه --pcap-payloads است.
  • --http-user-agent <user-agent>: هنگام ارسال درخواست‌های HTTP، فیلد user-agent موجود را با مقدار مشخص‌شده جایگزین می‌کند.
  • --open-only: فقط پورت‌های باز را گزارش می‌دهد، نه پورت‌های بسته.
  • --pcap <filename>: بسته‌های دریافتی (و نه بسته‌های ارسالی) را در فایلی با قالب libpcap ذخیره می‌کند.
  • --packet-trace: خلاصه‌ای از بسته‌های ارسالی و دریافتی را چاپ می‌کند. این گزینه در نرخ‌های پایین، مانند چند بسته در ثانیه، مفید است اما در نرخ‌های بالا حجم خروجی ترمینال را اشباع خواهد کرد.
  • --pfring: استفاده اجباری از درایور PF_RING. در صورتی که درایورهای DNA مربوط به PF_RING در دسترس نباشند، برنامه خارج می‌شود.
  • --resume-index: نقطه‌ای از اسکن که در آن متوقف شده است.
  • --resume-count: حداکثر تعداد کاوش‌هایی (probe) که باید پیش از خروج ارسال شوند. این گزینه به همراه --resume-index برای قطعه‌قطعه کردن اسکن و تقسیم آن بین چند نمونه اجرایی کاربرد دارد، هرچند ممکن است گزینه --shards انتخاب بهتری باشد.
  • --shards <x>/<y>: تقسیم اسکن میان چندین نمونه اجرایی. مقدار x شناسه این اسکن و مقدار y تعداد کل نمونه‌ها است. برای نمونه، --shards 1/2 به یک نمونه اعلام می‌کند که یکی در میان بسته‌ها را از ایندکس ۰ ارسال کند. به همین ترتیب، --shards 2/2 یکی در میان اما با شروع از ایندکس ۱ ارسال می‌کند تا هیچ تداخلی با نمونه نخست نداشته باشد.
  • --rotate <time>: چرخش فایل خروجی، تغییر نام آن بر اساس برچسب زمانی فعلی و انتقال آن به یک پوشه جداگانه. زمان را می‌توان بر حسب ثانیه مشخص کرد، مانند "3600" برای یک ساعت، یا با واحدهای زمانی، مانند "hourly"، "6hours" یا "10min". زمان‌ها بر مرزهای مشخصی تراز می‌شوند؛ بنابراین اگر "daily" مشخص شده باشد، فایل خروجی هر روز در نیمه‌شب بازچرخانی می‌شود.
  • --rotate-offset <time>: افست یا اختلاف زمانی جهت سازگاری با مناطق زمانی مختلف.
  • --rotate-dir <directory>: هنگام چرخش فایل، مشخص می‌کند که فایل به کدام پوشه منتقل شود. یک پوشه مناسب می‌تواند /var/log/masscan باشد.
  • --seed <integer>: یک عدد صحیح که به عنوان بذر اولیه (seed) برای مولد اعداد تصادفی استفاده می‌شود. استفاده از یک بذر متفاوت باعث می‌شود بسته‌ها با ترتیب تصادفی متفاوتی ارسال شوند. به جای یک عدد صحیح، می‌توان رشته time را مشخص کرد که از برچسب زمانی محلی استفاده می‌کند و به‌طور خودکار ترتیب تصادفی متفاوتی برای اسکن‌ها تولید می‌نماید. در صورت عدم تعیین، مقدار پیش‌فرض time خواهد بود.
  • --regress: اجرای آزمون رگرسیون (تطابق)؛ در صورت موفقیت مقدار «۰» و در صورت شکست مقدار «۱» را برمی‌گرداند.
  • --ttl <num>: مقدار TTL (طول عمر) بسته‌های خروجی را مشخص می‌کند؛ مقدار پیش‌فرض ۲۵۵ است.
  • --wait <seconds>: تعداد ثانیه‌هایی را مشخص می‌کند که پس از پایان ارسال بسته‌ها، برنامه پیش از خروج کامل باید برای دریافت بسته‌های برگشتی منتظر بماند. مقدار پیش‌فرض ۱۰ ثانیه است. همچنین می‌توان از رشته forever برای عدم خروج و انتظار نامحدود استفاده کرد.
  • --offline: ارسال واقعی بسته‌ها را انجام نمی‌دهد. این گزینه همراه با نرخ پایین و گزینه --packet-trace برای مشاهده بسته‌هایی که قرار بود ارسال شوند کاربرد دارد. همچنین همراه با --rate 100000000 برای ارزیابی حداکثر سرعت ارسال بسته‌ها (با فرض یک درایور بدون سربار) مفید است. درایور PF_RING حدود ۲۰ درصد کندتر از نتایج بنچمارک حالت آفلاین است.
  • -sL: این گزینه اسکنی انجام نمی‌دهد، بلکه فهرستی از آدرس‌های تصادفی تولید می‌کند. این ویژگی برای ایمپورت داده‌ها به سایر ابزارها کاربرد دارد. گزینه‌های --shard، --resume-index و --resume-count می‌توانند همراه با این ویژگی مفید باشند.
  • --interactive: نمایش بلادرنگ نتایج در کنسول. در صورت استفاده همراه با --output-format یا --output-filename هیچ تأثیری نخواهد داشت.
  • --output-format <fmt>: ساختار فایل خروجی را مشخص می‌کند که می‌تواند xml، binary، grepable، list یا JSON باشد. در این صورت گزینه --output-filename نیز باید مشخص شود.
  • --output-filename <filename>: فایلی که نتایج در آن ذخیره می‌شوند. در صورتی که پارامتر --output-format مشخص نشده باشد، مقدار پیش‌فرض xml استفاده خواهد شد.
  • -oB <filename>: قالب خروجی را روی باینری (binary) تنظیم کرده و خروجی را در نام فایل ارائه‌شده ذخیره می‌کند. این گزینه معادل استفاده از پارامترهای --output-format binary و --output-filename است. سپس می‌توان از گزینه --readscan برای خواندن این فایل باینری استفاده کرد. فایل‌های باینری بسیار کم‌حجم‌تر از معادل‌های XML خود هستند، اما برای تبدیل مجدد به XML یا سایر قالب‌های خوانا به یک مرحله اضافه نیاز دارند.
  • -oX <filename>: قالب خروجی را روی XML تنظیم کرده و خروجی را در نام فایل ارائه‌شده ذخیره می‌کند. این گزینه معادل استفاده از پارامترهای --output-format xml و --output-filename است.
  • -oG <filename>: قالب خروجی را روی grepable (قابل جستجو با grep) تنظیم کرده و خروجی را در نام فایل ارائه‌شده ذخیره می‌کند. این گزینه معادل استفاده از پارامترهای --output-format grepable و --output-filename است.
  • -oJ <filename>: قالب خروجی را روی JSON تنظیم کرده و خروجی را در نام فایل ارائه‌شده ذخیره می‌کند. این گزینه معادل استفاده از پارامترهای --output-format json و --output-filename است.
  • -oL <filename>: قالب خروجی را روی فهرست ساده (list) تنظیم کرده و خروجی را در نام فایل ارائه‌شده ذخیره می‌کند. این گزینه معادل استفاده از پارامترهای --output-format list و --output-filename است.
  • --readscan <binary-files>: فایل‌های باینری ایجادشده توسط گزینه -oB را می‌خواند و سپس بسته به پارامترهای خط فرمان، آن‌ها را در یکی از قالب‌های دیگر خروجی می‌دهد. به عبارت دیگر، می‌تواند نسخه باینری نتایج را دریافت کرده و به قالب XML یا JSON تبدیل کند.

فایل پیکربندی از همان نام پارامترهای خط فرمان استفاده می‌کند، اما بدون پیشوند -- و همراه با علامت = میان نام و مقدار آن. یک نمونه فایل پیکربندی می‌تواند به شکل زیر باشد:

# targets
range = 10.0.0.0/8,192.168.0.0/16
range = 172.16.0.0/14
ports = 20-25,80,U:53
ping = true
# adapter
adapter = eth0
adapter-ip = 192.168.0.1
router-mac = 66-55-44-33-22-11
# other
exclude-file = /etc/masscan/exludes.txt

به‌طور پیش‌فرض، برنامه پیکربندی اولیه را از فایل /etc/masscan/masscan.conf می‌خواند. این قابلیت برای تنظیمات خاص سیستم، مانند گزینه‌های --adapter-xxx بسیار مفید است. همچنین برای آدرس‌های IP مستثنی‌شده کاربرد دارد تا بتوانید بدون اشتباه تصادفی، کل اینترنت را ضمن نادیده گرفتن آدرس‌های حساس و خطرناک مانند آدرس‌های متعلق به وزارت دفاع اسکن کنید.

هنگامی که کاربر کلیدهای ctrl-c را فشار می‌دهد، اسکن متوقف شده و وضعیت کنونی اسکن در فایلی با نام ´paused.conf´ ذخیره می‌شود. اسکن را می‌توان با گزینه --resume از سر گرفت:

# masscan --resume paused.conf

برنامه بلافاصله خارج نمی‌شود، بلکه به طور پیش‌فرض ۱۰ ثانیه منتظر می‌ماند تا نتایج ارسالی از اینترنت را دریافت و پیش از خروج نهایی آن‌ها را ذخیره کند. این زمان را می‌توان با استفاده از گزینه --wait تغییر داد.

مثال زیر تمام شبکه‌های خصوصی را برای یافتن وب‌سرورها اسکن می‌کند و تمام پورت‌های باز یافت‌شده را چاپ می‌نماید.

# masscan 10.0.0.0/8 192.168.0.0/16 172.16.0.0/12 -p80 --open-only

مثال زیر کل اینترنت را برای یافتن سرورهای DNS اسکن می‌کند، نسخه آن‌ها را استخراج می‌نماید و سپس نتایج را در یک فایل XML ذخیره می‌کند.

# masscan 0.0.0.0/0 --excludefile no-dod.txt -pU:53 --banners --output-filename dns.xml

شما باید بتوانید فایل XML را در پایگاه‌های داده و موارد مشابه ایمپورت کنید.

مثال زیر یک فایل باینری نتایج اسکن به نام bin-test.scan را می‌خواند و نتایج را در کنسول چاپ می‌کند.

# masscan --readscan bin-test.scan

مثال زیر یک فایل باینری نتایج اسکن به نام bin-test.scan را می‌خواند و یک فایل خروجی XML به نام bin-test.xml ایجاد می‌کند.

# masscan --readscan bin-test.scan -oX bin-test.xml

فرض کنید می‌خواهید کل اینترنت را اسکن کرده و بار پردازشی اسکن را بین سه سیستم توزیع کنید. برنامه Masscan با استفاده از دستورات زیر روی هر سه سیستم اجرا می‌شود:

# masscan 0.0.0.0/0 -p0-65535 --shard 1/3
# masscan 0.0.0.0/0 -p0-65535 --shard 2/3
# masscan 0.0.0.0/0 -p0-65535 --shard 3/3

یک روش جایگزین، استفاده از ویژگی «ازسرگیری» (resume) است. هر اسکن دارای یک شاخص (ایندکس) داخلی است که از صفر تا حاصل‌ضرب تعداد پورت‌ها در تعداد آدرس‌های IP متغیر است. مثال زیر نحوه تقسیم یک اسکن به بخش‌های ۱۰۰۰تایی را نشان می‌دهد:

# masscan 0.0.0.0/0 -p0-65535 --resume-index 0 --resume-count 1000
# masscan 0.0.0.0/0 -p0-65535 --resume-index 1000 --resume-count 1000
# masscan 0.0.0.0/0 -p0-65535 --resume-index 2000 --resume-count 1000
# masscan 0.0.0.0/0 -p0-65535 --resume-index 3000 --resume-count 1000

یک اسکریپت می‌تواند از این سازوکار برای تقسیم وظایف کوچک‌تر میان چندین سیستم دیگر مانند نمونه‌های Amazon EC2 استفاده کند. با تکمیل کار توسط هر نمونه، اسکریپت می‌تواند درخواستی برای دریافت کارهای بیشتر به سرور هماهنگ‌کننده مرکزی ارسال کند.

هنگام اسکن TCP با استفاده از آدرس IP پیش‌فرض رابط شبکه شما، پشته شبکه داخلی سیستم بسته‌های RST ایجاد می‌کند. این موضوع مانع از دریافت بنرها خواهد شد. دو راه برای حل این مشکل وجود دارد: راه اول ایجاد یک قانون فایروال برای جلوگیری از مشاهده آن پورت توسط پشته شبکه است. نحوه عملکرد این کار به سیستم‌عامل بستگی دارد، اما در لینوکس چیزی شبیه به دستور زیر خواهد بود:

# iptables -A INPUT -p tcp -i eth0 --dport 61234 -j DROP

سپس، هنگام اسکن باید همان پورت به عنوان پورت مبدأ استفاده شود:

# masscan 10.0.0.0/8 -p80 --banners --adapter-port 61234

روش دیگر جعل (spoof) یک آدرس IP متفاوت است. این آدرس IP باید در بازه شبکه محلی باشد، اما نباید توسط رایانه شما یا رایانه دیگری در شبکه مورد استفاده قرار گرفته باشد. نمونه‌ای از این حالت به شکل زیر خواهد بود:

# masscan 10.0.0.0/8 -p80 --banners --adapter-ip 192.168.1.101

تنظیم آدرس IP مبدأ به این روش، شیوه ترجیحی برای اجرای این اسکنر است.

این اسکنر برای پیمایش‌های بزرگ‌مقیاس، چه در سطح یک سازمان و چه در کل اینترنت طراحی شده است. این اسکن توسط کسانی که لاگ‌های خود را بررسی و مانیتور می‌کنند دیده خواهد شد و منجر به ثبت شکایات می‌شود.

اگر شبکه سازمان خود را اسکن می‌کنید، این کار ممکن است منجر به اخراج شما شود. هرگز خارج از زیرشبکه محلی خود را بدون کسب اجازه کتبی و مشخص از مدیر سازمان که دلیل اسکن در آن ذکر شده باشد اسکن نکنید.

همین امر در مورد اسکن اینترنت از طریق شبکه محل کار شما نیز صدق می‌کند. این روش دیگری برای اخراج شدن است، زیرا بخش فناوری اطلاعات با حجم انبوهی از شکایات مبنی بر اینکه سازمان شما در حال هک کردن آن‌هاست مواجه می‌شود.

هنگامی که به طور شخصی اقدام به اسکن می‌کنید (مانند اینترنت خانگی یا ISP خود)، این کار به احتمال زیاد به دلیل شکایات سوءاستفاده، منجر به لغو حساب کاربری شما از سوی ارائه‌دهنده خدمات اینترنت خواهد شد.

یک راه‌حل این است که با ارائه‌دهنده اینترنت (ISP) خود همکاری کنید، به وضوح توضیح دهید که دقیقاً در حال انجام چه کاری هستید و به آن‌ها ثابت کنید که در حال پژوهش روی اینترنت هستید و نه «هک» آن. ما از ISP خود می‌خواهیم که شکایات سوءاستفاده را مستقیماً برای ما ارسال کند. برای هر کسی که درخواست کند، آدرس آن‌ها را به فایل --excludefile اضافه می‌کنیم و آن‌ها را در لیست سیاه قرار می‌دهیم تا دیگر اسکن نشوند. در تعامل با این افراد، برخی از آن‌ها در عوض ما را در لیست سفید خود قرار می‌دهند تا فایروال‌هایشان دیگر فعالیت ما را ثبت نکنند (البته همچنان مانع ما می‌شوند، فقط برای جلوگیری از پر شدن لاگ‌هایشان، آن را ثبت نمی‌کنند).

در نهایت، مشخص نیست که آیا امکان حل کامل این مشکل وجود دارد یا خیر. با وجود اینکه اینترنت یک شبکه عمومی و سرتاسری (end-to-end) است، اما هنگام انجام اسکن همچنان اصل بر «مجرم بودن شما تا زمان اثبات بی‌گناهی» است.

اگرچه در این سند فهرست نشده است، اما بسیاری از پارامترهای سازگار با nmap نیز کار خواهند کرد.

nmap(8), pcap(3)

این ابزار توسط Robert Graham نوشته شده است. کد منبع آن در نشانی https://github.com/robertdavidgraham/masscan در دسترس است.

January 2014