SCAPY(1) General Commands Manual SCAPY(1)

scapy - ابزار تعاملی دستکاری بسته‌های شبکه

scapy [گزینه‌ها]

این صفحه راهنما به‌طور خلاصه ابزار Scapy را شرح می‌دهد.

Scapy یک ابزار تعاملی قدرتمند برای دستکاری بسته‌ها، تولید بسته، اسکن شبکه، کشف شبکه، شنود بسته (اسنیفر) و غیره است. این ابزار در حال حاضر می‌تواند جایگزین hping، بخش‌هایی از nmap، arpspoof، arp-sk، arping، tcpdump، tshark، p0f و... شود.

Scapy از مفسر Python به‌عنوان محیط خط فرمان خود استفاده می‌کند. این بدان معناست که می‌توانید مستقیماً از زبان Python استفاده کنید (انتساب متغیرها، استفاده از حلقه‌ها، تعریف توابع و غیره).

ایدهٔ کار ساده است. این نوع ابزارها دو کار انجام می‌دهند: ارسال بسته‌ها و دریافت پاسخ‌ها. این همان کاری است که Scapy انجام می‌دهد: شما مجموعه‌ای از بسته‌ها را تعریف می‌کنید، بسته‌ها را ارسال می‌کند، پاسخ‌ها را دریافت می‌نماید، درخواست‌ها را با پاسخ‌ها مطابقت می‌دهد و فهرستی از جفت‌های بسته (درخواست، پاسخ) و فهرستی از بسته‌های تطبیق‌نیافته را برمی‌گرداند. این مزیت بزرگی نسبت به ابزارهایی مانند nmap یا hping دارد، زیرا یک پاسخ صرفاً به (open/closed/filtered) خلاصه نمی‌شود، بلکه کل بسته بازگردانده می‌شود.

علاوه بر این، می‌توان از آن برای ساخت توابع سطح بالاتر استفاده کرد؛ برای نمونه، تابعی که traceroute انجام می‌دهد و در نتیجه فقط TTL آغازین درخواست و IP مبدا پاسخ را ارائه می‌دهد؛ یا تابعی که به کل یک شبکه پینگ ارسال می‌کند و فهرستی از دستگاه‌های پاسخ‌دهنده را تحویل می‌دهد؛ یا تابعی که اسکن درگاه انجام داده و یک گزارش LaTeX تولید می‌کند.

گزینه‌های Scapy عبارتند از:

نمایش راهنمای استفاده
حالت بدون سرایند (header-less)، همچنین میزان جزئیات خروجی را کاهش می‌دهد.
افزایش پرگویی گزارش‌ها (log verbosity). می‌تواند چندین بار استفاده شود.
استفاده از PRESTART_FILE به جای $HOME/.config/scapy/prestart.py به عنوان فایل پیش‌راه‌اندازی (pre-startup)
فایل پیش‌راه‌اندازی اجرا نشود
استفاده از STARTUP_FILE به جای $HOME/.config/scapy/startup.py به عنوان فایل راه‌اندازی
فایل راه‌اندازی اجرا نشود

در حال حاضر تنها دستورهای حیاتی برای شروع کار در اینجا فهرست شده‌اند.

لایه‌های پروتکل پشتیبانی‌شده را فهرست می‌کند. اگر یک لایه پروتکل به عنوان پارامتر داده شود، فیلدها و انواع فیلدهای آن را فهرست می‌کند. اگر یک رشته به عنوان پارامتر داده شود، برای پالایش لایه‌ها استفاده می‌شود.
دستورهای کاربری اصلی scapy را فهرست می‌کند.
این شیء حاوی پیکربندی است.

$HOME/.config/scapy/prestart.py این فایل پیش از بارگذاری هستهٔ Scapy اجرا می‌شود. تنها شیء conf در دسترس است. این فایل می‌تواند برای پیکربندی CLI، پیکربندی پارامترهایی مانند فهرست conf.load_layers جهت انتخاب این‌که کدام لایه‌ها بارگذاری شوند، یا تغییر سطح لاگ‌گیری (به عنوان مثال) استفاده شود:

conf.interactive_shell = "bpython"
log_loading.setLevel(logging.WARNING)
conf.load_layers.remove("bluetooth")
conf.load_layers.append("new_layer")

$HOME/.config/scapy/startup.py این فایل پس از بارگذاری Scapy اجرا می‌شود. می‌توان از آن برای پیکربندی بیشتر رفتارهای Scapy، مانند لغو ثبت لایه‌ها استفاده کرد:

conf.prog.pdfreader = "xpdf"
split_layers(UDP,DNS)

مثال‌های دارای جزئیات بیشتر در مستندات در نشانی https://scapy.readthedocs.io در دسترس هستند. کافی است scapy را اجرا کرده و دستورهای زیر را در مفسر امتحان کنید.

آزمایش استحکام یک پشتهٔ شبکه با بسته‌های نامعتبر:

sr(IP(dst="172.16.1.1", ihl=2, options=["verb$2"], version=3)/ICMP(), timeout=2)

شنود و کالبدشکافی بسته (با فیلتر bpf یا خروجی مشابه tshark):

a=sniff(filter="tcp port 110")
a=sniff(prn = lambda x: x.show) 

ارسال مجدد بسته‌های شنودشده:

a=sniff(filter="tcp port 110")
sendp(a)

ارسال مجدد بسته‌های فایل pcap:

sendp(rdpcap("file.cap"))

ردیابی مسیر دستی TCP (دستور traceroute دستی):

sr(IP(dst="www.google.com", ttl=(1,30))/TCP(seq=RandInt(), sport=RandShort(), dport=dport)

اسکن پروتکل:

sr(IP(dst="172.16.1.28", proto=(1,254)))

پینگ ARP:

srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="172.16.1.1/24"))

اسکن ACK:

sr(IP(dst="172.16.1.28")/TCP(dport=(1,1024), flags="A"))

انگشت‌نگاری غیرفعال سیستم‌عامل (Passive OS fingerprinting):

sniff(prn=prnp0f) 

انگشت‌نگاری فعال سیستم‌عامل (Active OS fingerprinting):

nmap_fp("172.16.1.232")

مسموم‌سازی حافظهٔ نهان ARP (یا ARP cache poisoning):

sendp(Ether(dst=tmac)/ARP(op="who-has", psrc=victim, pdst=target))

گزارش‌گیری:

report_ports("192.168.2.34", (20,30))

وب‌گاه رسمی: https://scapy.net
مخزن توسعه گیت‌هاب: https://github.com/secdev/scapy
مستندات رسمی: https://scapy.readthedocs.io/en/latest

برای مسیرهایی که از نام‌های مستعار رابط شبکه (interface aliases) استفاده می‌کنند، IP مبدا صحیحی ارائه نمی‌دهد.

ممکن است تحت بار کاری سنگین، بسته‌ها را از دست بدهد. این یک محدودیت از سوی خود Python است.

ذخیره‌سازی نشست به توانایی Python در مارشال کردن اشیاء (marshal) محدود است. در نتیجه، توابع lambda و مولدها (generators) را نمی‌توان ذخیره کرد، که به طور جدی سودمندی این قابلیت را کاهش می‌دهد.

فیلترهای BPF بر روی رابط‌های نقطه به نقطه (Point-to-point) کار نمی‌کنند.

Philippe Biondi و جامعهٔ Scapy.

March 24, 2024