-
پنجشنبه, ۱۳ شهریور ۱۳۹۹، ۰۹:۲۱ ق.ظ
-
۱۷۸۲
در ادامه ی پست قبل - ارتباط دو شبکه ی مجزا در اینترنت با استفاده از پایتون
درود به همه !
سلام و درود . در پست قبل ، یعنی پست (نفوذ و دسترسی به سیستم هدف در شبکه فقط با یک اسکریپت ۴ خطی ) دیدم که چه شکلی میشه به وسیله ی یکی از کتابخونه های پیشفرض پایتون یه اسکریپت ۴ خطی بنویسیم که باعث میشه به فایل های سیستم هدف دسترسی داشته باشیم . اسکریپت قبل فقط در شبکه های داخلی کاربردی بود و شاید گاهی اوقات ما نیاز داشته باشیم تا به کامپیوتری در خارج از شبکه ی داخلی دسترسی داشته باشیم. امروز با روشی آشنا میشویم که بتوانیم چند شبکه ی مجزا را به هم ارتباط دهیم .
قانون : ماده729ـ هرکس به طور غیرمجاز به داده ها یا سامانه های رایانه ای یا مخابراتی که به وسیله تدابیر امنیتی حفاظت شده است دسترسی یابد، به حبس از نود و یک روز تا یک سال یا جزای نقدی از پنج میلیون (5.000.000) ریال تا بیست میلیون (20.000.000) ریال یا هر دو مجازات محکوم خواهدشد.
خب پیش نیاز این پست ، پست قبلی هستش پس اگه پست قبلی رو نخوندین حتما برین و اول پست قبل رو بخونین .
سورس پست قبل به صورت زیر بود :
from http.server import SimpleHTTPRequestHandler as handler from socketserver import TCPServer
httpd = TCPServer(("" ,8000) , handler) # Make Handler on port 8000
httpd.serve_forever() # Start Handler
خب سورس بالا باعث میشد تا روی یک پورت مشخص در سیستم هدف یک وب سرور اجرا شود که هکر با استفاده از دسترسی به وب سرور ایجاد شده میتوانست به فایل های سیستم هدف دسترسی داشته باشد .(توضیح کامل سورس در پست قبل موجود است .)
طرز دسترسی به سیستم هدف این بود که هکر وارد مرورگر خود میشد و در قسمت آدرس بار مرورگر ، IP سیستم هدف به همراه پورتی که وب سرور روی آن اجرا بود را وارد میکرد و در نتیجه وصل میشد به وب سرور . اما IP سیستم هدف یک IP لوکال یا محلی بود یعنی هکر باید در همان شبکه ای که سیستم هدف واقع است ، قرار داشته باشد . خب این موضوع کار را مشکل میکند . شاید در پروژه ای موقعیت طوری باشد که هکر و سیستم هدف در دو شبکه ی مجزا باشند ! آن وقت چه باید کرد ؟؟
راه حل این مشکل ، port forwarding است .
همینطور که از مباحث شبکه میدونید ، ما دو نوع ip داریم . ip های Private و ip های Public . هر کامپیوتری در شبکه یک IP خصوصی یا همان Private دارد که فقط برای شبکه خودش قابل دسترسی است و همچنین یک IP عمومی یا Public دارد که در سطح اینترنت جهانی قابل دسترسی است (امروزه با استفاده از پروتکل هایی مثل NAT ، هر شبکه فقط یک آی پی عمومی دارد.)
IP آدرسی که ما در پست قبل استفاده میکردیم یک IP خصوصی بود پس فقط داخل یک شبکه قابل دسترسی بود . حال اگر هکر بتواند یک IP عمومی از سیستم هدف بدست آورد ، آن وقت از هر شبکه ای میتواند به سیستم هدف در سطح اینترنت جهانی دسترسی داشته باشد و به وب سرور ساخته شده دسترسی داشته باشد .!
port forwarding به طور خلاصه روشی است که ما میتوانیم به هر یک از دستگاه های داخل شبکه یک IP عمومی اختصاص دهیم و درنتیجه بتوانیم از طریق اینترنت جهانی به آن دستگاه دسترسی داشته باشیم .
برای اینکه بتوانیم اسکریپتی که در پست قبل نوشتیم رو ، در سطح اینترنت جهانی به کار ببریم باید port forwarding انجام دهیم . برای انجام پورت فورواردینگ روش های مختلفی هست . برای مثال میتوانید در خود تنظیمات روتر شبکه اینکار را انجام دهید ولی ما امروز برای انجام پورت فورواردینگ از ابزاری به نام ngrok استفاده میکنیم .
ابزار ngrok وقتی در یک سیستم اجرا میشود ، میتواند یک آی پی آدرس عمومی به همان سیستم اختصاص دهد . در ادامه این ابزار رو تست میکنیم و بهتر متوجه میشید .
ابزار ngrok برای سیستم عامل های مختلف موجود هستش . برای دانلود به آدرس زیر مراجعه کنید :
اگر سیستم ویندوزی دارید میتوانید با انتخاب گزینه ی windows در لینک بالا ، نسخه ی ویندوزی این ابزار رو دانلود کنید . همینطور اگر سیستم لینوکسی دارید میتوانید با انتخاب گزینه ی linux نسخه ی لینوکسی ابزار رو دانلود کنید ولی برای نصب در لینوکس میتوانید از خود پکیج منیجر لینوکس هم استفاده کنید . برای مثال میتوانید با دستور زیر این ابزار را در اوبونتو نصب کنید :
MrPython@debian:~$ sudo apt install ngrok
پس از نصب این ابزار میریم سراغ تستمون . در ابتدا وب سروری که در پست قبل نوشتیم رو اجرا میکنیم :
طبق سورسی که نوشته بودیم وب سرور روی پورت ۸۰۰۰ اجرا میشد . حال با اجرای دستور زیر در خط فرمان سیستم هدف ، ابزار ngrok یک لینک Public به پورت ۸۰۰۰ روی سیستم هدف اختصاص میده:
MrPython@debian:~$ ngrok http 8000
پس از اجرای دستور بالا ، خط فرمان به شکل زیر در می آید . همینطور که میبینید لینک Public که ابزار اختصاص داده در تصویر مشخص شده .:
خب حالا تا وقتی که این دستور در حال اجرا هستش میتونید از لینک public که در تصویر بالا مشخص شده برای دسترسی به وب سرور ایجاد شده استفاده کنید. چون لینک public است میتوان از هر شبکه ی دیگری آن را باز کرد و پس از باز کردن لینک ، مانند تصویر زیر به وب سرور دسترسی پیدا خواهیم کرد :
خب این از طرز کار اولیه ی ابزار ngrok بود که وقتی دستور مربوطه به ngrok در بالا رو در سیستم هدف اجرا کردیم ، یک لینک public برای ما درست کرد که ترافیک http انتقال میده و وصله به پورت ۸۰۰۰ روی سیستم هدف. همینطور میتوانیم با دستور های زیر به ترتیب ترافیک های tcp , ftp و ... رو نیز انتقال بدیم :(البته بگم برای استفاده از پروتکل های دیگر مثل tcp باید در ابتدا در خود سایت ngrok اکانت بسازید و سپس یک authentication token بگیرید و در ابزار ثبت کنید .)
MrPython@debian:~$ ngrok ftp 8000
MrPython@debian:~$ ngrok tcp 8000
MrPython@debian:~$ ngrok <Protocol> <PORT>
اما تا اینجا ابزار ngrok رو در ترمینال یا خط فرمان استفاده میکردیم
برای یادگیری بیشتر ngrok از رفرنس اصلی ngrok در اینترنت استفاده کنید . در پایتون کتابخونه ای به نام pyngrok موجود هستش که به ما اجازه میدهد از ngrok در پایتون نیز استفاده کنیم . برای نصب این کتابخانه از pip استفاده میکنیم :
نصب pyngrok در لینوکس :
MrPython@debian:~$ sudo pip3 install pyngrok
نصب pyngrok در ویندوز :
C:\> pip install pyngrok
تکه کد زیر یک لینک public برای پورت ۸۰۰۰ میسازد :
from pyngrok import ngrok
# usage : ngrok.connect(PORT , PROTOCOL)
public_url = ngrok.connect(8000,"http")
print("Public URL : " + public_url)
ngrok.disconnect(public_url) # Disconnect From NGROK
توضیح سورس کد : در ابتدا از کتابخونه ی pyngrok ، کلاس ngrok رو ایمپورت کردیم .
سپس در خط بعد با استفاده از تابع connect یک لینک عمومی برای پورت ۸۰۰۰ و پروتکل http ایجاد کردیم و ریختیم داخل متغییر public_url .
پس از اون در خط بعد لینک عمومی که ngrok تولید کرده رو برای کاربر چاپ کردیم و بعد از اون در خط آخر با استفاده از تابع disconnect اومدیم لینک ایجاد شده رو از بین بردیم . (حتما بعد از اتمام کار به دلیل نکات امنیتی ، لینک ایجاد شده رو از بین ببرید .)
برای یادگیری بیشتر در مورد کتابخونه ی pyngrok به رفرنس اصلیش مراجعه کنید . لینک زیر :
https://pyngrok.readthedocs.io/en/latest/
تا اینجا فهمیدیم کاربرد ابزار ngrok چیه و پورت فورواردینگ چه شکلیه . میتونید تکه کد بالا که با استفاده از pyngrok پورت فورواردینگ انجام میداد رو با اسکریپت های خود ترکیب کنید . این ابزار در نوشتن پیلود های reverse_tcp میتواند کاربرد فوق العاده ای داشته باشد . درمورد پیلود reverse_tcp بخونید : (آموزش ساخت پیلود Reverse_TCP در پایتون)
و در نهایت : (هرگونه سوء استفاده بر عهده کاربر میباشد .)
یا حق !
Telegram Channel : @mrpythonblog