ساخت پورت اسکنر SYN Stealth در پایتون :: Mr Python | مستر پایتون

ساخت پورت اسکنر SYN Stealth در پایتون

  • ۸۳۸

ساخت پورت اسکنر SYN Stealth در پایتون

 

درود به همه !

 

سلام سلام سلام . چطورین ؟ امیدوارم خوب باشین . آقا امروز اومدیم که یه اسکریپت خیلی خوب بنویسیم .

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

امروز در این پست تصمیم گرفتم یه اسکریپت دیگه بنویسیم که به روش متفاوتی پورت ها رو اسکن میکنه .

خب بزارید یکم مفهومی کار کنیم . اصلا اسکن کردن پورت ها به چه دردی میخوره ؟ ببینید در واقع هر سیستمی یه سری پورت داره (کلا ۶۵۵۳۵ تا پورت قابل استفاده داریم) . بعضی از این پورت ها توسط سرویس های خاصی رزرو شدن . کلا پورت های شماره ۱ تا ۱۰۲۴ رزرو شده هستن . مثلا پورت ۴۴۵ مربوط به سرویس SMB هستش در ویندوز . یا پورت 21 مربوط به FTP هستش  و.. ..

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

فرض کنید هکر وارد یه شبکه شده و سیستم هدف خودشو پیدا کرده توی شبکه . برای اینکه به هدف نفوذ کنه یکی از اولین کارهایی که میکنه اینه که کلا یه اسکن پورت روی سیستم هدف انجام میده . با این کار میفهمه چه پورت هایی روی سیستم هدف باز هست . و از اونجایی که روی هر پورت یک سرویس خاصی داره فعالیت میکنه پس از طریق شماره پورت های باز میتونه بفهمه چه سرویس های مثل FTP  ، SSH یا ... روی سیستم هدف در حال اجراس . اما اینکه اینارو بفهمه به چه دردیش میخوره ؟ ببینید هر کدوم از این سرویس ها یه سری آسیب پذیری هایی در طول تاریخ داشتن و همچنان داره ازشون کشف میشه . بنابراین اگه سرویس آسیب پذیر باشه میتونن از طریق اون سرویس به سیستم نفوذ کنن . یا روی بعضی سرویس ها مثل FTP حملات بروت فورس و دیکشنری اجرا کنن .

 

پس اسکن پورت یکی از حیاتی ترین مراحل تست نفوذه .

 

حالا ما روش های مختلف برای اسکن پورت داریم . یکی از روش ها اسمش SYN Stealth هستش . قبل از اینکه اسکریپتی بنویسیم که به این روش بیاد پورت اسکن کنه بزارید کلا روش کار این شیوه اسکن پورت رو توضیح بدیم . خب ببینید این اسکن پورت از یک اتصال TCP برای شناسایی باز بودن یا نبودن پورت استفاده میکنه .

 

قبل از اینکه بخوایم خود روش رو توضیح بدیم باید با TCP و دست دهی سه تایی یا همون Three way Handshaking آشنا باشید .

اگه بخوام TCP رو خیلی ساده تعریف کنم یه پروتکل اتصال گرا هستش که در لایه ی ۴ مدل OSI اگه اشتبا نکنم کار میکنه . در واقع TCP یه روشی هست برای انتقال اطلاعات از مبدا به مقصد . یه روش اتصال گرا . یعنی در این پروتکل ما میگیم که برای انتقال اطلاعات ابتدا باید سیستم مبدا به سیستم مقصد به طور امن کانکت بشه وسپس اطلاعات با رعایت قوانین انتقال پیدا کنن . برعکس TCP پروتکل UDP هستش که در این پروتکل میگیم که برای انتقال اطلاعات نیازی به کانکت شدن مبدا به مقصد نیست . مبدا همون اول پکت های اطلاعات رو میفرسته برای مقصد و مقصد هم شاید یه جوابی برای مبدا فرستاد .

 

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

 

 

همونطور که میبینید ابتدا سیستم مبدا یک پکت SYN به مقصد با یک پورت مشخص برای وصل شدن ارسال میکنه . در مرحله ی بعد اگه مقصد تمایل به اتصال داشت به نشانه ی تایید کردن این ارتباط یک پکت SYN/ACK به عنوان جواب میفرسته به مبدا . حالا هم دیگه مبدا برای تایید ارتباط یک ACK باز دوباره میفرسته به مقصد و ارتباط برقرار میشه .  به این سه مرحله میگن دست دهی سه تایی یا  Three way Handshaking

 

ما از همین سه مرحله برای اسکن پورت بهره برداری میکنیم . فرض کنید میخوایم بفهمیم پورت ۸۰ در سیستم هدف باز هست یا نه . در روش اسکن  SYN Stealth روش کار ما اینه که ابتدا یک پکت SYN میفرستیم به پورت ۸۰ سیستم مقصد . بعد منتظر میمونیم ببینیم مقصد چی جواب میده . اگه SYN/ACK فرستاد یعنی ارتباط رو تایید کرده و ما میتونیم به این پورت وصل بشیم در نتیجه این پورت بازه . همینجاس که ما میفهمیم که این پورت بازه . حالا دیگه نیازی نیست ما مرحله ی سوم کار یعنی فرستادن ACK رو انجام بدیم چون دیگه فهمیدیم پورت باز هست یانه فقط یه پکت RESET یا RST میفرستیم که ارتباط با این پورت قطع بشه و میریم پورت های دیگه رو به همین روش تست میکنیم ببینیم باز هستن یا نه .

اگه بخوام مراحل اسکن رو نشون بدم میشه مثل تصویر زیر :

 

 

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

 

برای نصب اسکپی (scapy) روی لینوکس از دستورات زیر استفاده میکنیم :‌

MrPython@debian:~$ pip3 install scapy
MrPython@debian:~$ sudo apt install scapy

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

 

خب بعد از اینکه اسکپی نصب شد دیگه یه فایل پایتونی ایجاد میکنیم و سورس زیر رو مینویسیم داخلش :‌

from scapy.all import *

HOST = input("Host IP : ")
portrange = input("Port Range : ( example : 200-400 ) ")
portrange = portrange.split("-")

start = int(portrange[0])
end = int(portrange[1])


for port in range(start,end):
    packet = IP(dst=HOST)/TCP(dport=port,flags="S")
    response = sr1(packet,timeout=1,verbose=0)
    try:
        if response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12:
            print("{} --> [OPEN]".format(port))
            rstPacket = IP(dst=HOST)/TCP(dport=port,flags="R")
            sr(rstPacket,timeout=0.5,verbose=0)

    except AttributeError:
        # PORT IS CLOSE
        continue

اگه بخوام سورس رو توضیح بدم که خب اون اول اسکپی رو ایمپورت کردیم . بعد اومدیم آی پی هدف و رنج پورت برای اسکن رو از کاربر با input گرفتیم . سپس با متود split اومدیم اول و آخر رنج پورت ها رو مشخص کردیم و ریختیم داخل متغییر های start  و end .

بعد با استفاده از حلقه for و range اومدیم یه حلقه اجرا کردیم . یه متغییر به نام packet ایجاد کردیم که پکت ساختیم و ریختیم داخلش . درواقع این متغییر پکت SYN برای شروع کار هستش که ریختیم داخلش . اگه به ورودی های تابع هاش نگاه کنین یکیش dst هست که مخفف destination یعنی مقصد هست و مقدار متغییر HOST یعنی آی پی هدف رو دادیم بهش . بعد توی لایه ی TCP یکی از ورودی های dport هست که پورت مقصد رو بهش دادیم . و بعدیش هم flag پکت هستش که ما گفتیم S  مخفف SYN چون قراره پکت اول یه پکت SYN باشه .

بعد از اینکه پکت ساخته شد باید این پکت رو ارسال کنیم به مقصد و ببینید چه جوابی به ما میده .  این کار با تابع sr1 در کتابخانه ی اسکپی امکان پذیره . همینطور که میبینید یه متغییر به نام response داریم که خروجی تابع sr1 که همون جواب سیستم هدف هست رو ریختیم داخلش . درواقع تابع sr1 میاد یه پکت رو ارسال میکنه و جواب برگشتی از هدف رو خروجی میده . ورودی اولی این تابع خود پکت هست که میبینید بهش دادیم اسم متغییر packet رو . ورودی بعدی timeout هست که ما دادیم ۱ یعنی یک ثانیه . کارش اینه که بعد از ارسال پکت ۱ ثانیه صبر میکنه اگه هدف جوابی نداد یعنی میفهمیم پورت بسته بوده چون اگه باز بود SYN/ACK میداد . برای سرعت بیشتر این عدد رو میتونید روی 0.5 بزارید یعنی نیم ثانیه . ورودی بعدی verbose هستش که برابر صفر قرار دادیم . این باعث میشه خروجی های اضافی چاپ نشن و رو مخ نباشن . حالا جواب برگشتی رو هم داخل متغییر Response داریم . در خط بعد با یه شرط if اومدیم جواب رو چک کردیم که فلگ پکت برگشتی چیه . همونطور که میدونید اگه فلگ SYN/ACK باشه یعنی اون جواب داده و پورت بازه . خب فلگ SYN/ACK در مبنای ۱۶ میشه 0x12 همونطور که میبینید.

حالا گفتیم اگه شرط درست بود بیا چاپ کن پورت مورد نظر بازه و با تابع sr یه پکت RST یا RESET بفرست تا ارتباط قطع بشه با اون پورت  (ضروریه) .

 و تمام

 

امیدوارم اوکی بوده باشه . اگه سوالی مطلبی نظری چیزی هست در خدمتم .

 

منبع سورس از کتاب : Python Web Penetration Testing Cookbook 2015

تا بعدیا .... یاحق !

  • درود بر شما.

     

    ببخشید می خواستم بگم اگه بخوام یک یو دی پی پورت اسنر بسازم به چه صورت هستش

    من توی اینترنت به نتیچه ای نرسیدم ممنون میشم راهنمایی کنین.

    پاسخ:
    درود . 
    ببینید کلا اسکن UDP دشوار تر از اسکن TCP هستش . 
    یه سری ابزار های مثل NMAP این اسکن رو میتونن انجام بدن . بهتره تحقیق کنید از چه الگوریتمی برای تعیین باز بودن یا نبودن پورت UDP استفاده میکنن تا بتونید اون الگوریتم رو خودتون پیاده کنید .
    در پست های آینده از اسکن های UDP هم بحث میکنیم .
  • با عرض سلام

    من این کد رو توی لینوکس امتحان کردم ولی همچین اروری میداد:

    AttributeError: 'None type' object has no attribute 'haslayer'

     

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