ساخت Port Scanner با استفاده از پایتون
یکی از کاربردهای کتابخانهی socket در پایتون، ایجاد برنامهای برای انجام عمل اسکن بر روی دستگاههای درون شبکه است. گاهی اوقات لازم است تا پورتهای یک کامپیوتر درون شبکه را اسکن کرده و اطلاعاتی از آن بدست آوریم. یکی از ابزارهای موجود برای این کار nmap نام دارد که ابزاری برای ارزیابی دستگاههای درون شبکه است. ساده ترین وظیفهی nmap، تشخیص باز و یا بسته بودن یک پورت خاص بر روی یک کامپیوتر است. ما نیز در این مقاله قصد داریم با استفاده از برنامه نویسی سوکت (socket programming) در پایتون، این عمل را انجام داده و یک Port Scanner بسیار ساده ایجاد نماییم.
اگر بخواهیم به یک میزبان راه دور از طریق یک پورت خاص متصل شویم، ممکن است یک پیغام خطا بصورت Connection is refused دریافت کنیم. این خطا در بیشتر مواقع به دلیل مشکل از کار افتادگی سرویس دهنده بر روی یک پورت خاص در میزبان راه دور است. در چنین شرایطی، میتوانیم پی ببریم که پورت مورد نظر بسته بوده و یا باز میباشد. بنابراین میتوان چندین پورت را اسکن کرده و سرویسهای فعال موجود در یک دستگاه را تشخیص دهیم.
با استفاده از کتابخانهی socket در پایتون، میتوانیم عمل اسکن پورت ها را انجام دهیم. به این برنامه میتوانیم سه آرگومان به عنوان ورودی دهیم: نام دستگاه هدف، شماره بازهی شروع و بازهی پایان برای پورتها. برنامهی زیر، کد مربوط به عمل اسکن پورتهای یک میزبان راه دور را نشان میدهد:
import argparse import socket def scan_ports(host, start_port, end_port): # Create socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Get IP of remote host remote_ip = socket.gethostbyname(host) # Scan ports end_port += 1 for port in range(start_port, end_port): try: sock.connect((remote_ip, port)) print ('Port ' + str(port) + ' is open') sock.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error: pass if __name__ == '__main__': # setup commandline arguments parser = argparse.ArgumentParser(description='Port Scanner') parser.add_argument('--host', action="store", dest="host", default='localhost') parser.add_argument('--startport', action="store", dest="start_port", default=1, type=int) parser.add_argument('--endport', action="store", dest="end_port", default=100, type=int) # parse arguments given_args = parser.parse_args() host, start_port, end_port = given_args.host, given_args.start_port, given_args.end_port scan_ports(host, start_port, end_port)
تابع scan_ports سه آرگومان ورودی دریافت میکند: نام دستگاه، شماره پورت شروع و شماره پورت پایان برای اسکن. سپس به اسکن تمام پورتهای آن محدوده در سه گام میپردازد،
در گام اول، یک سوکت TCP با استفاده از تابع socket ایجاد میکند.
سپس، با استفاده از تابع gethostbyname ، آدرس IP میزبان مورد نظر دریافت میشود.
در پایان، با استفاده از تابع connect به IP و پورت مورد نظر وصل میشود. در صورتی که عمل اتصال با موفقیت انجام شود، میتوان نتیجه گرفت که آن پورت خاص باز است. سپس، با استفاده از تابع close آن اتصال را میبندد و دوباره تمام این مراحل را برای پورت بعدی انجام میدهد.
با اجرای اسکریپت بالا در خط فرمان برای اسکن پورتهای شمارهی ۱ تا ۲۰۰ و تشخیص باز بودن آنها بر روی دستگاه خودمان، خروجی زیر نمایش داده میشود:
python portScanner.py --host=localhost --startport=1 --endport=200 # Output: # Port 21 is open # Port 22 is open # Port 23 is open # Port 25 is open # Port 80 is open
در صورتی که هیچ آرگومانی به عنوان ورودی به برنامه ارسال نشود، عمل اسکن بصورت پیش فرض بر روی localhost و بازهی پورت ۱ تا ۱۰۰ انجام میشود. شما میتوانید بجای localhost نام دستگاهی دیگر را بنویسید و همچنین بازهی پورتها را نیز تغییر دهید تا پویش پورتها به سلیقهی خودتان صورت گیرد.
مطالب زیر را حتما مطالعه کنید
لایه network و پروتکل ipv4
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
لایه فیزیکی (Physical)
آشنایی با رشته در پایتون
3 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام اموزش عالی بود فقط من تاحالا argument ننوشتم میشه راهنمایی کنین از کجا یاد بگیرم ؟ بنویسم ؟
سلام.
اگه به کد همین برنامه توجه کنید، از کتابخونهی argparse میتونیم استفاده کنیم که نحوهی استفاده از این کتابخونه هم به صورت مختصر توضیح داده شده. برای اطلاعات بیشتر میتونید اینجا رو بخونید.
بسیار ممنون بابت مقاله خوبتون