کدنویسی اسکنر پورت با پایتون

اسکن پورت راهی برای تعیین اینکه کدام پورت ها در یک دستگاه شبکه باز هستند، سرور، روتر یا یک ماشین معمولی است. به بیان ساده، اسکنر پورت فقط یک اسکریپت یا برنامه ای است که برای بررسی هاست برای پورت های باز طراحی شده است.
در این وبلاگ، نحوه کدنویسی یک اسکنر پورت ساده را با استفاده از سوکت کتابخانه از پیش نصب شده به شما گام به گام نشان خواهم داد. ایده ساخت اسکنر پورت این است که از طریق لیستی از پورت ها به یک میزبان (این می تواند یک وب سایت، سرور یا هر دستگاهی باشد که به شبکه/اینترنت متصل است) متصل شود. اگر اسکنر یک اتصال برقرار کند، به این معنی است که پورت باز است.
سلب مسئولیت: این فقط برای اهداف آموزشی است. از این در میزبانی که اجازه آزمایش آن را ندارید استفاده نکنید. اسکن پورت غیرقانونی نیست مگر اینکه برای دستیابی به دسترسی غیرمجاز یا نقض حریم خصوصی استفاده شود.
اول از همه، اگر می خواهید با رنگ ها چاپ کنید، باید colorama را نصب کنید (این کاملا اختیاری است):
pip 3 install colorama
با وجود این موضوع، اکنون میتوانیم واقعاً کدگذاری اسکنر را شروع کنیم. ابتدا بیایید وارد کنیم socket
مدول:
import socket # for connecting to the host
from colorama import init, Fore
# adding some colors (optional)
init()
GREEN = Fore.GREEN
RESET = Fore.RESET
GRAY = Fore.LIGHTBLACK_EX
ماژول سوکت ماژولی است که قبلاً در کتابخانه استاندارد پایتون ساخته شده است، بنابراین نیازی به نصب آن ندارید.
colorama
بعداً هنگامی که برنامه پورت های باز یا بسته را چاپ می کند استفاده می شود (دوباره این اختیاری است)
در مرحله بعد، بیایید یک تابع ایجاد کنیم که برای تصمیم گیری در مورد باز بودن یا نبودن یک پورت استفاده می شود:
def is_port_open(host, port):
#determines whether the host has the port open
# creates a new socket
s = socket.socket()
try:
# tries to connect to host using that port
s.connect((host, port))
# make a timeout if you want it a little faster (means less accuracy)
# s.settimeout(0.2) <-- if you want to add a timeout
except:
# cannot connect (port is closed) and returns false
return False
else:
# the connection is established (port is open)
return True
را s.connect((host,port))
تابع تلاش می کند تا سوکت را با استفاده از نشانی راه دور وصل کند (host,port)
tuple (Tuples برای ذخیره چندین آیتم در یک متغیر استفاده می شود)، زمانی که به هاست متصل نشود، یک استثنا ایجاد می کند، به همین دلیل است که ما آن کد را در یک بلوک try-expcept قرار می دهیم تا زمانی که استثنا آورده شود. بالا، به ما می گوید که پورت بسته است (در غیر این صورت باز است).
در نهایت، میتوانیم از تابعی که در بالا ساختیم استفاده کنیم و آن را روی تعدادی پورت تکرار کنیم:
# asks user to enter a port
host = input("Enter the host:")
# repeat over ports, from 1 to 1024
for port in range(1, 1024):
if is_port_open(host, port):
print(f"{GREEN}[+] {host}:{port} is open {RESET}") #prints green text for open ports
else:
print(f"{GRAY}[!] {host}:{port} is closed {RESET}", end="\r") #prints gray text for closed ports
این قسمت از کد همه پورتها را از 1 تا 1024 اسکن میکند. در صورت تمایل میتوانید آزادانه محدوده را تغییر دهید، اما به خاطر داشته باشید که اگر دامنه را افزایش دهید، تکمیل اسکن بیشتر طول میکشد.
مسائل بالقوه
با اجرای کد، متوجه خواهید شد که اسکریپت سریعترین نیست. میتوانید با اضافه کردن یک بازه زمانی 200 میلیثانیهای (با استفاده از settimeout(0.2)
. به خاطر داشته باشید که این کار باعث کاهش دقت اسکن می شود، به خصوص اگر تاخیر بالایی داشته باشید.
اگر بخواهید، کد منبع کامل در Github است.