-
چهارشنبه, ۲۶ خرداد ۱۴۰۰، ۰۱:۴۴ ق.ظ
-
۹۰۳
سلام دوستان :)
توی پست (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: