آموزش Network Discovery با زبان پایتون

این مقاله در مورد Scapy و کاربرردهای آن می باشد. یک ابزار و کتابخانه قدرتمند در Python . با این ابزار می توان بسته های مشخص را برای کلاینت ارسال کرد، یا می توان محتوای یک بسته را بررسی کرده و حتی آنرا دستکاری و بسته های جعلی را برای یک کلاینت مشخص ارسال کنیم. می توانیم با این قابلیت هایی که در ماژول Scapy وجود دارد، ابزارهای مورد نظر خود را جهت بررسی ، اسکن و حتی حمله بسازیم. عملا با این ماژول می توانیم پکت های روی شبکه را Sniff کرده ، آنرا Decode کنیم، محتوای آنرا تغییر دهیم، و دوباره آنرا در بستر شبکه ارسال کنیم. با این ماژول می توان کار بسیاری از ابزارها در یک ابزار ساخته شده خلاصه کرد.می توان حملاتی مانند Arp Poisoning ، Sniffing، Replace Download File، DNS Spoofing ، HTTP Spoofing، MITM ، Code Injection و…. را با این ابزار قدرت مند ایجاد کرد. Scapy عمدتا برای سیستم های Unix base طراحی شده است و بهترین عملکرد را نیز در آنها دارد. اما آخرین نسخه Scapy ، از ویندوز پشتیبانی می کند. یعنی می توان از تمام ویژگی های Scapy در ویندوز نیز استفاده کرد. برای اینکار در قدم اول باید Python را نصب کنیم. مرحله دوم نصب Npcap می باشد. همچنین Scapy با Winpcap نیز کار می کند. در نهایت نیز باید Scapy را دانلود کرده و سپس آنرا به شکل زیر نصب کنیم:     سپس می توانیم دستور scapy را در محیط cli وارد کنیم تا وادر محیط این ابزار شویم: اما عمده کار استفاده در محیط لینوکس می باشد. در واقع می خواهیم از ماژول scapy در برنامه نویسی استفاده کنیم تا بتوانیم برنامه مورد نظر خود را بسازیم. سیستم عاملی هم که با آن کار می کنیم Kali Linux می باشد. در قدم اول می خواهیم مبحث مربوط به ARP Monitoring را بررسی کنیم. اگر این ماژول نصب نیست،با استفاده از pip آنرا نصب می کنیم: حال می توانیم با دستور import ، از Scapy در برنامه خود استفاده کنیم: در Scapy یک متدی وجود دارد به نام arping که می توان به راحتی MAC Address یک IP را به دست بیاورد. به شکل زیر دقت کنید: در این کد بالا یک تابع ایجاد کردیم و برای آن یک آرگومان در نظر گرفته ایم. سپس متد arping را برای این آرگومان استفاده کردیم تا MAC Address آن را به دست بیاوریم. و در خط آخر نیز این تابع را برای آدرس مشخص شده فراخوانی کرده ایم. در خروجی این کد مقدار MAC برای ما برگردادنده می شود: به همین راحتی می تواند MAC Address هدف را به دست بیاورد. همچنین می توان با قرار دادن رنج آدرس ، مقدار MAC موجود در یک Broadcast Domain را به دست آورد. نکته : از آنجایی که ARP یک مکانیزم لایه ۲ محسوب می شود، پس تنها می توان از آن برای سیستم های موجود در یک Broadcast Domain استفاده کرد. خوب ، با این کار توانستیم کلاینت های موجود در شبکه به همراه IP و MAC آنها را شناسایی کنیم. حال می خواهیم برنامه را حرفه ای تر کنیم. در قدم اول می بایست یک پکت ARP Request بسازیم و تا بتوانیم آنرا در شبکه Broadcast کنیم. برای اینکار از متد ARP برای ارسال Request  و متد summary برای نمایش خروجی استفاده می کنیم. مشاهده می کنید که در خروجی مقدار  آدرس مقصد را برابر با ۰.۰.۰.۰ قرار داده شده است. دلیل آن این است که باید برای متد ARP() ، فیلد هایی را مشخص و تعریف کنیم. اما چه فیلد هایی را باید مشخص کنیم و اصلا این فیلدها چه مقادیری هستند؟ برای توضیح بیشتر به شکل زیر دقت کنید: ماژول Scapy یک متد به نام ls دارد، که می تواند لیستی از فیلد های قابل اجرا در یک متد را مشخص کند. در شکل بالا مقادیری که می توانیم به متد ARP اضافه کنیم، به همراه مقادیر پیشفرض آن نمایش داده شده است. اولین مقداری که به آن نیاز داریم ، pdst می باشد که با آن می توانیم آدرس مقصد را مشخص کنیم. این مقدار را باید برابر با آرگومان تابع scan قرار دهیم. حال اگر کد خود را اجرا کنیم می بینید که سوال را دقیقا از آدرس مشخص شده می پرسد که در اینجا همان رنج کی باشد: قدم بعدی ، مشخص کردن MAC Address مقصد می باشد. چون تمامی سیستم های شبکه را بررسی کنیم، باید مقدار Broadcast را مشخص کنیم. برای این موضوع نیز از ماژول Scapy و متد Ether استفاده می کنیم: در شکل بالا ، مقادیری که می توانیم برای این متد مشخص کنیم را می توانید مشاهده کنید. همانطور که از توضیحات آن نیز مشخص است، فیلدی که به آن احتیاج داریم dst می باشد. پس مانند ARP ، اینجا نیز از یک متغیر برای مشخص کردن آن استفاده می کنیم: با اجرای کد پکت ارسالی به مقصد Broadcast برای همه کلاینت های موجود در شبکه ارسال می شود. مقدار Source Mac نیز همانطور که در خروجی می بینید ، برابر با آدرس Kali Linux می باشد: تا اینجا یک متغیر برای ارسال پکت ARP برای IP مورد نظر، و یک متغیر برای Broadcast MAC ایجاد کردیم. می بایست این دو متغیر را در یک متغیر ترکیب کنیم و برای بررسی مقدار summary آنرا نمایش دهیم: برای اینکه بتوانیم محتویات بیشتری ازپکت را مشاهده کنیم، می توانیم از متد show() برای متغیر خود استفاده کنیم که اطلاعات بیشتری را در اختیار ما می گذارد: خروجی متد بالا شکل زیر خواهد بود: مشاهد می کنید که در هر پارت پارامترها مشخص شده اند. نکته : از متد show() می توان برای متغیرهای قبلی نیز استفاده کرد. تا اینجای کار توانستیم که پکت ARP خود را ایجاد کنیم. در قدم بعدی باید این پکت را ارسال کنیم. در Scapy برای ارسال پکت از متد sr () استفاده می شود. اما در اینجا چون مقادیر Ether و ARP را تغییر داده ایم، از متد srp() استفاده می کنیم. با اینکار پکتی را که مشخص کرده ایم را ارسال و Response آنرا دریافت می کند. : در مثال بالا پکت ارسال می شود، اما مقدار برگشتی بیشتر از یک مقدار خواهد بود. یک بخش مربوط می شود که سیستم هایی که جواب این پکت را می دهند ، قسمت دیگر مربوط می شود که آدرس هایی که بر روی سیستمی وجود ندارند تا جواب بدهند. برای انکار می توانیم دو متغیر (Answered و Unanswered) ایجاد کرده و مقدار برگشتی را در درون آنها قرار دهیم. حال می توانیم مقدار پکت های answered را نمایش دهیم. اما خواهید دید که این کد زمان نسبتا زیادی را خواهد گرفت تا جواب ها را نمایش دهد. دلیل آن هم زمانی می باشد که صرف سوال از همه آدرس ها می کند. برای حل این مشکل می توان از فیلد timeout برای متد srp استفاده کنیم و مقدار آنرا برابر با ۱ قرار دهیم. در این صورت در صورتی که جوابی از کلاینت در ۱ ثانیه دریافت نکند ، از آن IP می گذرد و به سراغ آدرس بعدی می رود. در خروجی آدرس هایی که به این درخواست جواب داده اند نمایش داده می شوند: خروجی این بالا از نوع لیست می باشد. اندیس ۰ برای answered و اندیس ۱ برای unanswered . پس می توانیم در انتهای کد مقدار اندیسی که می خواهیم را مشخص کنیم. و چون با مقادیر unanswered نیز کاری نداریم ، آنرا حذف می کنیم: حال می توانیم با یک حلقه for به المنت های موجود در خروجی به شکل زیر دستیابی داشته باشیم: در شکل زیر خروجی دستور بالا را مشاهده می کنید: مشاهده می کنید که دیتای بیشتری را نسبت به استفاده از متد summary() می توان دریافت کرد. زیرا با اینکار تمام دیتا موجود پکت را نمایش داده ایم. می توانیم برای جدا کردن elementها از تعدادی – استفاده کنیم: اگر به خروجی دقت کنیم، می بینیم که هر element از دو بخش تشکیل شده است. قسمت اول مربوط می شود که پکتی که ارسال کرده ایم، و قسمت دوم جوابی است که از کلاینت دریافت کرده ایم. در بخش اول element نیز دو قسمت وجود دارد که قسمت اول یعنی MAC برابر با آدرس Broadcast می باشد و قسمت دوم مربوط به آدرسی است که از آن سوال می پرسیم. حال قسمت دوم را برای چاپ شدن اتخاب می کنیم. یعنی اندیس اول element . خروجی دستور بالا می شود: چون کل دیتا را نمایش می دهد برای ما قابل خواندن نیست. پس از متد show() استفاده می کنیم: مشاهده می کنید که تمام فیلد های موجود در پکت Response را نمایش می دهد. حال می توانیم با مشخص کردن فیلد های psrc و hwsrc که همان Source IP و Source MAC می باشد، خروجی تصحیح کنیم. دقت کنید چون فقط Response Packet را فیلتر کردیم، از فیلد های Source برای مشخصات کلاینت ها استفاده می کنیم. برای داشتن خروجی بهتر ، می توان متنی که در قسمت اول خروجی چاپ می شود را نیز حذف کرد. برای اینکار باید خصوصیت verbose را False کنیم: خروجی به شکل زیر خواهد بود: و در نهایت برای نمایش بهتر خروجی ، می توانیم به شکل زیر عمل کنیم: در ادامه موضوع ARP Poisoning را بررسی خواهیم کرد.

بیشتر بخوانید