توی این پست قراره به توضیح یکی دیگه از چیزای جالبی که توی کتاب Black Hat Python یاد گرفتم بپردازیم و باهم مروری روش داشته باشیم: ) قبل از توضیح دادن فرایند حمله، بد نیست نگاهی به خود ARP داشته باشیم: Address Resolution Protocol با توجه به، آرپ پروتکلی ارتباطیست که آدرس های لایه فیزیکی (مثل MAC Address ) رو به آدرس های لایه IP لینک میکنه و بالعکس. با یه مثال این پروتکل رو توضیح میدیم (برگرفته از) : دو کامپیوتر در یک دفتر و در یک LAN ، به وسیله ی کابل های اترنت و سوییچ ها متصل شده اند (هیچ روتری وجود ندارد) کامپیوتر قصد ارسال پکتی به کامپیوتر رو داره و از طریق DNS متوجه میشه که آی پی کامپیوتر برابر . . . ، اما برای ارسال پکت به مک آدرس کامپیوتر هم نیازه! بنابراین کامپیوتر ابتدا به ARP table خودش نگاهی میندازه تا چک کنه آیا مک آدرسی برای آیپی . . . داره یا نه. اگه مک آدرس در جدول موجود باشه (مثلا : eb : : b : : ac ) ، فریم اترنتی به مقصد : eb : : b : : ac حاوی پکت IP ، ارسال میکنه. اگه مک آدرسی برای اون آیپی پیدا نکنه، کامپیوتر یک پیام ARP request به تمامی کامپیوتر های موجود در شبکه ارسال میکنه (مک آدرس مقصد رو FF : FF : FF : FF : FF : FF میزاره) و دنبال جوابی برای . . . میگرده. کامپیوتر وقتی پیام ARP request کامپیوتر رو میبینه، یک ARP response حاوی مک آدرس و آیپی خودش به کامپیوتر ارسال میکنه (همچنین کامپیوتر ممکنه که مک آدرس و آیپی کامپیوتر رو توی ARP table خودش اضافه کنه) در نهایت کامپیوتر پاسخ رو دریافت و اونو توی ARP table خودش اضافه میکنه و حلا میتونه پکت رو به کامپیوتر ارسال کنه. فرایند حمله (برگرفته از) این حمله از نوع Man in the Middle هستش که به مهاجم اجازه ی دخالت در ارتباط دو دستگاه در شبکه رو میده که بصورت زیره: اتکر باید به شبکه دسترسی داشته باشه. اتکر شبکه رو اسکن میکنه تا حداقل آیپی موجود در شبکه رو شناسایی کنه. فرض کنید یک PC و یک Router شناسایی شد. اتکر از یک ابزار مثل Arpspoof استفاده میکنه (که اینجا ما از ابزاری که خودمون مینویسیم استفاده میکنیم) اتکر پاسخ های جعلی ARP رو ارسال میکنه، که این پاسخ جعلی به PC و Router میگه که مک آدرس صحیح برای هرکدوم، مک آدرس اتکر هستش. یعنی این پاسخ اتکر به PC میگه که مک آدرس صحیح روتر، اینه (و اینجا مک آدرس خودش رو قرار میده) و بالعکس، یعنی به روتر میگه که مک آدرس PC اینه (و اینجا هم مک آدرس خودش رو قرار میده) دو دستگاه (در اینجا PC و Router ) ، ARP table های خودشون رو با این اطلاعات جعلی تغییر میدن. اتکر حالا مخفیانه بین ارتباط این دو دستگاه قرار گرفته. حالا که هم با ARP و هم با ARP spoofing آشنا شدید، وقتشه بریم تا این نوع حمله رو پیاده سازی کنیم: پیاده سازی حمله با پایتون (برگرفته از کتاب Black Hat Python ) از ماژول Scapy برای راحت تر شدن (بهتره بگم خیلی راحت تر شدن: ) کارمون استفاده میکنیم. برای آشنا شدن با Scapy به مراجعه کنید. اینجا ما از ماشین مجازی استفاده میکنیم (ویندوز و کالی) ابتدا ARP table ماشین ویندوز رو چک کنیم، با دستور arp - a میتونید اینکار رو انجام بدید: توی عکس بالا که خروجی دستور arp - a رو توی CMD ویندوز نشون میده، آیپی . . . برای Default Gateway هستش که مک آدرس اون برابر - - - ed - cf - هستش. آیپی دومی که نشون دادم متعلق به ماشین کالی هستش که دارای آیپی . . . و مک آدرس - c - - c - a - ed هستش. هنگام حمله دوباره جدول رو نشون میدیم و با این مقایسه میکنیمش. حالا با دستور زیر Scapy رو برای خودمون نصب میکنیم: اول از تابعی شروع میکنیم که mac address آیپی دلخواه (توی شبکه محلی) رو به ما برمیگردونه: در ابتدای این تابع، پکتی حاوی پیام ARP request میسازیم (قراره مک آدرسه آیپی ورودی رو از بقیه سوال کنیم) سپس با استفاده از srp ، پکتمون رو ارسال میکنیم و پاسخ رو توی resp ذخیره میکنیم. در ادامه مک آدرس مبد پکت دریافتی (پاسخ) رو رو برمیگردونیم. میبینید چقدر ساخت و ارسال پکت توی Scapy راحته؟ : ) حالا میریم سراغ تیکه کد اصلیمون و کلاسی به نام Arper تعریف میکنیم: از تابع _ init _ شروع میکنیم. اگه نمیدونید تابع _ init _ چیه، میتونید دربارش بخونید. این تابع هنگام ساخت شی از کلاس Arper صدا زده میشه و چندتا ورودی میگیره: کد این تابع: با استفاده از تابع getmac ، مک آدرس دو آیپی ورودی (قربانی و gateway ) رو درمیاریم و در نهایت اینترفیس رو به conf معرفی میکنیم و سپس توضیحاتی رو برای درک برنامه پرینت میکنیم. کار اصلی کلاسمون رو این تابع انجام میده. این تابع تا فرایند رو آغاز میکنه، یکی آغاز حمله و دیگری شنود شبکه (یعنی اجرای man - in - the middle ) تابع self . poison پکت هایی با اطلاعات اشتباه درست میکنه و اونا رو به قربانی و gateway میفرسته: با ساخت پکت arp برای قربانی، تابع شروع میشه. op مخفف Operation هستش، در واقع با قرار دادن op برابر ، داریم میگیم که این یک پکت پاسخ هستش (اطلاعات بیشتر) ما قربانی رو با فرستادن آیپی gateway و مک آدرس خودمون (اتکر) سمی میکنیم: ) و به همین ترتیب، ما gateway رو با فرستادن آیپی قربانی و مک آدرس خودمون (اتکر) سمی میکنیم. برای درک بیشتر این موضوع به تصویر زیر توجه کنید: پکتی که به قربانی ارسال میکنیم، از دید قربانی به این صورته که خیال میکنه این پکت داره از سمت Gateway میاد و اینکه Gateway داره به قربانی میگه که مک آدرس من اینه. قربانی هم این پاسخ ها رو قبول میکنه و جلوی آیپی gateway در arp table ، مک آدرس مهاجم رو قرار میده: ) یعنی از این به بعد اگه پکتی بخواد از سمت قربانی به gateway ارسال بشه، اول به مهاجم ارسال میشه و مهاجم میتونه محتوای اون پکت رو در بعضی مواقع بصورت واضح ببینه (مثلا اگه از http استفاده شده باشه در سایتی) برای سمی کردن gateway : توجه داشته باشید که مقدار پیشفرض برای poison _ victim . hwsrc و poison _ gateway . hwsrc ، مک آدرس خودمون هستش (یعنی مهاجم) حالا سراغ تابعی میریم که قراره ترافیک عبوری از سمت قربانی به gateway رو شنود کنه: ابتدای این تابع، ثانیه وقفه وجود داره. این برای اینه که به فرایند poisoning زمان کافی برای اجرا شدن بده. بعد از اون به تعداد دلخواه (ورودی تابع) ، پکت هایی که دارای آیپی قربانی هستن رو دریافت و با استفاده از wrpcap ، اونا رو با فرمت pcap ذخیره میکنیم و در نهایت تابع restore رو صدا میزنیم و فرایند poison رو نابود میکنیم. تابع Restore : کار این تابع، به حالت اولیه دراوردن arp table قربانی و gateway هستش. یعنی به قربانی، آیپی و مک آدرس واقعیه gateway رو میفرستیم و بالعکس. دقت کنید این پکت ها بصورت broadcast هستن. و در نهایت جایی که اسکریپتمون از اونجا شروع میشه: اسکریپتمون تا ورودی میگیره، آیپی قربانی، آیپی gateway و interface ای که قراره ازش استفاده کنیم. این مقادیر برای ساخت اینستنس از کلاس Arper استفاده میشه و درنهایت با تابع run اسکریپتمون اجرا میشه. بریم برای تست کردن این اسکریپت: توی این آموزش ما از سیستم های کالی و ویندوز برای تست استفاده میکنیم. قبل از شروع، ما باید به سیستم عامل بگیم که میتونیم پکت ها رو هم به قربانی و هم به gateway ارسال کنیم. برای اینکار توی سیستم عامل کالیمون دستور زیر رو وارد میکنیم: مشخصات سیستم هایی که استفاده میکنیم: حالا با دستور زیر اسکریپتمون رو با دسترسی root توی ماشین کالی اجرا میکنیم: خروجی: خروجی دستور arp - a روی سیستم قربانی (هنگام حمله) : همونطور که میبینید مک آدرس gateway با مک آدرس سیستم اتکر یکی شده: ) اسکریپت تا پکت رو قراره شنود کنه و اگه ما CTRL + C بزنیم، فرایند حمله متوقف میشه و خروجی توی یه فایل کنار اسکریپت ذخیره میشه که میتونید با wireshark بازش کنید: مشکلی که به اون برخوردم کند شدن ترافیک شبکه سیستم قربانی بود. بطوریکه حتی ping google . com هم کار نمیکنه! به دنبال حل این مشکل میگردم و در آینده با ورژن آپدیت شده ی این اسکریپت پیشتون برمیگردم: ) ممنونم که وقتتون رو پای این نوشته صرف کردید. کد این قسمت رو میتونید پیدا کنید (داخل چپتر ) اگه مشکلی توی توضیحاتم داشتم، بهم خبر بدید. پایدار باشید: )