-
دوشنبه, ۲۰ مرداد ۱۳۹۹، ۱۱:۱۳ ق.ظ
-
۲۴۵۹
ساخت ابزار Ping Sweep با کتابخانه ی Scapy در پایتون
درود به همه !
امروز در خدمت شما هستیم با آموزش ساخت یه ابزاری به نام ping sweep . این ابزار برای شناسایی سیستم های فعال (Live) در شبکه استفاده میشه . همانطور که احتمالا میدونید این ابزار برای اسکن سیستم های فعال در شبکه از پروتکل ICMP استفاده میکنه . برای نوشتن این اسکریپت از کتابخونه ی Scapy استفاده خواهیم کرد .
اگر با شبکه و تست نفوذ شبکه آشنا باشید میدونید کار پروتکل ICMP چیه . این پروتکل بیشتر برای عیب یابی در شبکه استفاده میشه . از این پروتکل برای اینکه بفهمیم یه کامپیوتر فعاله یا نه استفاده میکنیم . ابزار ping در خط فرمان هم از همین پروتکل استفاده میکنه . طرز کار به این صورته که ما ابتدا تعدادی پیغام ICMP Request میفرستیم به سیستم هدف ، سپس اگه سیستم هدف فعال باشه و پروتکل ICMP رو بلاک نکرده باشه تعدادی پیام ICMP Reply برای ما میفرسته . به همین ترتیب میتونیم بفهمیم اون سیستم فعاله یا نه .
اسکریپتی که امروز مینویسیم میاد به تمام آی پی های داخل شبکه یه سری ICMP Request میفرسته . هرکدومشون ICMP Reply فرستادن یعنی فعالن .
برای نوشتن اسکریپت در ابتدا باید کتابخونه های مورد نیاز رو نصب کنیم . یعنی SCAPY
برای نصب این کتابخونه از ابزار Pip استفاده میکنیم :
نصب Scapy در لینوکس :
MrPython@debian:~$ sudo pip3 install scapy
نصب Scapy در ویندوز :
C:\> pip install scapy
پس از نصب کتابخونه میریم سراغ سورس کد .
سورس کد :
from scapy.all import IP , ICMP , sr1
network_id = "192.168.1."
start_host = 1 end_host = 254
ping_timeout = 2 # Second
for host in range(start_host , end_host+1): ip = network_id + str(host) packet = IP(dst = ip) / ICMP() response = sr1(packet, timeout = ping_timeout , verbose = 0)
if response: if response[ICMP].type == 0: # 0 is Echo Reply print("{} is live".format(ip))
توضیح سورس کد : در ابتدا ماژول های مورد نیاز رو وارد کردیم . سپس یه متغییر تعریف کردیم به اسم network_id که درواقع نتوورک آی دی یا همون قسمت ثابت آی پی های شبکه رو میریزیم داخلش (با توجه به سابنت ماسک شبکه) . پس از اون اومدیم توسط دو متغییر start_host و end_host رنج شبکه رو مشخص کردیم . بعد داخل متغییر ping_timeout اومدیم مقدار زمانی که باید برای ارسال جواب هر درخواست ICMP صبر کنه رو مشخص کردیم .سپس یه حلقه ی for اجرا کردیم که در هربار اجرای حلقه اومدیم کارهای زیر رو انجام دادیم :
۱ - ساختن IP (باتوجه به رنج)
۲ - ساختن پکت ّICMP
۳ - ارسال پکت توسط تابع sr1 و ریختن جوابی که هدف ارسال میکنه داخل متغییر response . اولین پارامتر این تابع پکتی هست که میخوایم ارسال کنیم و منتظر جواب برگشتی براش بمونیم و دومیش برابر timeout هستش که در بالا مقدارشو تعریف کردیم و بعدی هم که verbose هستش که وقتی برابر صفر قرارش دادیم یعنی توضیحات اضافه برای ما ننویسه .
۴ - چک کردن اینکه آیا جوابی برگشته یا نه . اگه جوابی برگشته بود چک کردیم آیا نوع بسته ی ICMP برابر صفر هست یا نه . اگه برابر صفر باشه یعنی یک پکت ICMP Reply هستش پس یعنی اون سیستم فعاله و در خط بعد آی پی اون سیستم رو چاپ میکنیم .
این اسکریپت رو باید با دسترسی بالا اجرا کرد . بنابراین من با استفاده از دستور sudo روی لینوکسم این اسکریپت رو اجرا میکنم و حاصل اسکریپت رو در تصویر زیر میبینید :
یا حق!
Telegram Channel : @mrpythonblog