پیاده سازی حمله ی SYN Flood در پایتون :: Mr Python | مستر پایتون

پیاده سازی حمله ی SYN Flood در پایتون

  • ۱۱۴۸

پیاده سازی حمله ی SYN Flood در پایتون

درود به همه !

 

حمله ی SYN Flood جزء حملات DOS به حساب میاید و امروز میخوایم این حمله رو علیه یک مودم ADSL در شبکه پیاده سازی کنیم .برای اینکار اسکریپت پایتونی خیلی ساده ای مینویسیم که این حمله رو روی مودم ADSL پیاده سازی میکنه و باعث از کار انداختن و عدم سرویس دهی اون میشه . 

طبق معمول قبل از اینکه بریم سراغ کدنویسی باید الگوریتم کار رو از نظر مفهومی توضیح بدیم . برای اینکه طرز کار این حمله رو بدونید در ابتدا باید با پروتکل ارتباطی TCP یکم آشنا بشیم . در واقع هر کامپیوتری که بخواد با کامپیوتر دیگه ارتباط TCP برقرار کنه باید سه مرحله رو طی کنه که بهش میگن Three Way Handshaking یا دست دهی سه مرحله ای . در این روند سه مرحله ای ، ابتدا کامپیوتری که قصد شروع ارتباط را دارد (کامپیوتر مبدا)   به منظور درخواست شروع ارتباط ، یک پکت از نوع SYN ارسال میکند به پورت مشخصی در کامپیوتر مقصد . اگر پورت مورد نظر در کامپیوتر مقصد باز باشد و خود سیستم مقصد تمایل به ارتباط داشته باشد به منظور تایید ارتباط ، یک پکت SYN/ACK به کامپیوتر مبدا ارسال میکند . سپس کامپیوتر مبدا به منظور شروع ارتباط یک پکت ACK ارسال میکند و ارتباط از همین لحظه شروع میشود . این سه مرحله رو در تصویر زیر میتونید مشاهده کنید :

حال که طرز ارتباط گرفتن دو کامپیوتر  با استفاده از پروتکل TCP رو میدونید  میتونیم حمله ی SYN Flood رو توضیح بدیم . در این حمله هکر میاد پشت سر هم پکت های SYN ارسال میکنه به سیستم هدف(مرحله ی اول Three way handshake) . سپس به ازای هر کدام از پکت های SYN که هکر میفرسته ، کامپیوتر هدف باید یک SYN/ACK براش بفرسته و از اونجایی که کامپیوتر هکر به طور همیشگی و بینهایت پکت SYN میفرسته پس کامپیوتر هدف هم باید همیشگی وبینهایت پکت SYN/ACK براش بفرسته و اینطوری میشه که کامپیوتر هدف اونقدر مشغول میشه که دیگه توان جواب دادن به درخواست های دیگران رو نداره و عملا از کار میافته . باید بدونید که در این حمله هکر فقط پکت های SYN رو میفرسته و حتی وقتی که مقصد پکت SYN/ACK رو فرستاد ، هکر  پکت ACK رو نمیفرسته (مرحله ی سوم three way handshake) .  تصویر زیر الگوریتم این حمله رو مشخص کرده :

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

نصب Scapy در لینوکس :

MrPython@debian:~$ sudo pip3 install scapy

نصب Scapy در ویندوز :

C:\> pip install scapy

 

سورس کد :

from scapy.all import *

target_ip = "192.168.1.1" # ADSL Modem IP (Router Of Network)
target_port = 80 # PORT OF Destination

ip = IP(dst=target_ip)
tcp = TCP(sport=RandShort() , dport=target_port, flags="S")
raw = Raw(b"X" * 1024)

packet = ip / tcp / raw

send(packet, loop = 1,verbose = 0) # Send in Layar 3

 توضیح سورس کد :

در ابتدا ماژول های مورد نیاز از کتابخونه ی Scapy رو ایمپورت کردیم . سپس یه متغییر به نام target_ip تعریف کردیم که آی پی سیستم هدف (در اینجا آی پی روتر یا همون مودم ADSL) رو بهش میدیم . در خط بعد متغییر target_port رو داریم که پورت مقصد رو میدیم .

سپس در خط بعدی لایه ی ip را تعریف کردیم که در آرگومان dst آیپی مقصد رو مشخص کردیم (اینکه پکت باید به کجا ارسال بشه) . سپس لایه tcp رو تعریف کردیم و آرگومان sport مشخص کننده ی پورت مبدا(سیستم خودمون) هستش که از RandShort استفاده کردیم که باعث میشه در هربار ارسال پکت یک پورت شانسی در نظر بگیره . در آرگومان dport پورت مقصد رو مشخص کردیم و نهایتا در آرگومان flags گفتیم این چه نوع پکتی باشه که اینجا گفتیم S مخفف SYN . اگه یادتون باشه قرار بود کلی پکت SYN ارسال کنیم به مقصد !

سپس در متغییر raw یه سری اطلاعات بی ارزش برای پکت تعریف کردیم که خالی نباشه . (اینجا ۱۰۲۴ بایت اطلاعات تولید کردیم) .

نهایتا  لایه های Scapy که اون بالا نوشتیم رو با هم ترکیب کردیم تا packet بوجود بیاد .

حالا با استفاده از تابع send پکتی که بالا ساختیم رو ارسال کردیم به مقصد . در اولین آرگومان این تابع خود پکتی که قراره ارسال بشه رو دادیم . در دومین آرگومان یعنی loop  مشخص کردیم این هی پشت سر هم ارسال بشه و در سومین آرگومان یعنی verbose گفتیم اطلاعات اضافه بفهمون نشون نده .

خب بریم سراغ تست اسکریپت . من برای اینکه هروقت مودم از کار افتاد بفهمیم ، مودم رو پینگ میکنم . تصویر زیر :

در تصویر بالا میبینید که مودم پینگ میشه و هیچ مشکلی در ارتباط باهاش وجود نداره .

حالا اسکریپت رو با دسترسی کامل (در لینوکس با sudo) اجرا میکنم . تصویر زیر :

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

 

منبع : thepythoncode

 

 یا حق !

Telegram Channel : @mrpythonblog

  • پارسا کلانترهرمزی

    سلام و وقت به خیر

    من کد رو نوشتم ولی در خطوط ۶ و ۷، در متغیر های ip و tcp وقتی میخوام متد IP رو فراخوانی کنم میگه این متد وجود ندارد و زیرش خط میکشه... و خب من از کتابخانه telnetlib برای رفع این مشکل استفاده کردم و نمیدونم درسته یا نه و شماره به هر حال یه راهنمایی کنید... همچنین وقتی میخوام کد رو اجرا کنم میگه مقدار 'S' (که به آرگومان flags داده شده) در لیست وجود ندارد و چیزی اجرا نمیشه...

    بی زحمت یه راهنمایی کنید

    با سپاس

    پاسخ:
    سلام . سورس کدی که نوشتید و متن ارورتون رو بفرستید لطفا .
  • سلام میخواستم بپرسم  از اونجایی که با اسکپی میشه آیپی فرستنده رو عوض کرد پس یعنی وقتی با اسکپی ابزار  DDOS می سازی و روی یک هاست یا سرویس اجرا بکنی اون سرورر نمی تونه ایپی مارو بفهمه؟

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

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