وبلاگ فربد | Farbod Blog

توی این وبلاگ راجع به پروژه هام صحبت می کنم

جلوگیری از ARP Spoofing با پایتون

  • ۸۰۱

سلام دوستان :)

توی پست (ARP Spoofing در پایتون) با هم دیدیم که چطوری میتونیم یکی از رایج ترین نوع حملات مرد میانی (MITM : Man in The Middle) رو با هم پیاده سازی کنیم و همچنین دیدیم که این نوع حمله بسیار خطرناکه و ما میتونیم تمام ترافیک هدفمون رو ببینیم.

توی این پست میخوایم نحوه جلوگیری از ARP Spoofing رو ببینیم.

خب حالا شاید بگید که چجوری باید اینکار رو بکنیم.

کاری که میتونیم بکنیم اینه که بیایم روی یک interface شنود کنیم. حالا بسته های ARP که از نوع "is-at"  یا همون response بودن بررسی میکنیم. مک آدرسی که توی اون بسته داده شده رو ذخیره میکنیم. حالا باید خودمون با استفاده از یک بسته ARP، مک آدرس فرستنده بسته ARP رو بدست بیاریم. حالا اون آدرس مکی که توی بسته ارسال شده بود رو با مک آدرسی که الان پیدا کردیم مقایسه میکنیم. اگر مک آدرس ها برابر بودن یعنی مشکلی نیست ولی اگر برابر نبودن یعنی یکی داره به ما حمله میکنه. حالا میتونیم بریم و جدول مک خودمون رو دستی تغییر بدیم(اگر جدول مک بصورت دستی تغییر کنه دیگه با فرستادن بسته های ARP عوض نمیشه).

خب بریم سراغ نوشتن این اسکریپت.

 

اول از همه شما باید ماژول scapy رو نصب کنید.(برای اطلاعات بیشتر میتونین به صفحه رسمی سایت scapy مراجعه کنید)

 

 بعد از نصب scapy میتونیم بریم سراغ نصب این ماژول.

 

سورس:

from scapy.all import Ether, ARP, srp, sniff, conf

def get_mac(ip):
    """
    Returns the MAC address of `ip`, if it is unable to find it
    for some reason, throws `IndexError`
    """
    p = Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip)
    result = srp(p, timeout=3, verbose=False)[0]
    return result[0][1].hwsrc

def process(packet):
    if packet.haslayer(ARP):
        if packet[ARP].op == 2:
            try:
                real_mac = get_mac(packet[ARP].psrc)
                response_mac = packet[ARP].hwsrc
                if real_mac != response_mac:
                    print(f"[!] You are under attack, REAL-MAC: {real_mac.upper()}, FAKE-MAC: {response_mac.upper()}")
            except IndexError:
                pass

if __name__ == "__main__":
    import sys
    try:
        iface = sys.argv[1]
    except IndexError:
        iface = conf.iface
    sniff(store=False, prn=process, iface=iface)

توضیح: اول از همه توابع مورد نیازمون رو از توی ماژول scapy ایمپورت کردیم.  بعد تابع get_mac رو تعریف کردیم که یک بسته ARP به سمت IP مشخص شده میفرسته و MAC اون رو بر میگردونه.

خب تابع sniff که قراره ازش استفاده کنیم یکی از ورودی هایی که میگیره تابعی هست که بعد از دریافت هر بسته اجرا میکنه(میتونه lambda هم باشه). پس ما هم باید یک تابع تعریف کنیم تا به عنوان ورودی به تابع sniff بدیم. تابعی که ما تعریف کردیم اسمش process هست که یک وردوی به اسم packet میگیره(این ورودی رو خود تابع sniff به تابعمون میده). توی تابع گفتیم که اگر بسته از نوع ARP Respone بود بیاد با استفاده از تابع get_mac که قبلا تعریف کرده بودیم مک آدرس واقعی فرستنده بسته رو با استفاده از IP فرستنده بدست بیاره و داخل متغییر real_mac میریزه. حالا میاد مک آدرسی که داخل بسته بود رو داخل متغییر response_mac میریزه. بعد هم با استفاده از یک if میاد این دوتا رو مقایسه میکنه. اگر این دو تا آدرس برابر نبودن جاپ میکنه که به شما حمله شده و مک آدرس واقعی و مک آدرس جعلی رو چاپ میکنه.

 

بعد داخل if گفتیم که ماژول sys رو import کنه. بعد interface که قراره روش شنود کنیم که بسته های دریافتی رو ببینیم میگیره و در نهایت با استفاده از تابع sniff میاد روی interface مشخص شنود میکنه و هر دفعه که بسته ای دریافت میشه تابع process رو اجرا میکنه.

 

برای اجرا برنامه داخل ویندوز یک cmd با دسترسی admin باز کنین. برین توی مسیر برنامه تون و کد زیر رو بزنین:

python app_name.py interface

جای app_name.py باید اسم برنامه تون رو بزارین و جای interface باید اینترفیسی رو که میخواین روش شنود کنین وارد کنین. مثلا wlan0

 

برای اجرا برنامه داخل لینوکس هم وارد ترمینال بشین و کد زیر رو بزنین:

sudo python3 app_name.py interface

جای app_name.py باید اسم برنامه تون رو بزارین و جای interface باید اینترفیسی رو که میخواین روش شنود کنین وارد کنین. مثلا wlan0

 

امیدوارم براتون مفید بوده باشه D:


  • عالی مثل همیشه
    ممنون از شما
    پاسخ:
    سلام دوست عزیز ممنون از همراهی شما
  • جای تقدیر داره که به قولتون عمل کردین و این پست و گذاشتین👏👏👏
    من خودم بشخصه منتظرش بودم
    پاسخ:
    سلام دوست عزیز
    از توجه و همراهی شما ممنونم موفق باشید
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی