-
سه شنبه, ۱۷ تیر ۱۳۹۹، ۰۹:۱۰ ب.ظ
-
۸۳۸
ساخت پورت اسکنر 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
تا بعدیا .... یاحق !