-
يكشنبه, ۱۳ تیر ۱۴۰۰، ۰۶:۱۴ ب.ظ
-
۳۳۷۳
استفاده از پورت اسکنر nmap در پایتون
درود به همه !
اگر در زمینه ی تست نفوذ شبکه کمی اطلاعات داشته باشید ، قطعا اسم ابزاری به نام nmap را شنیده اید . یک ابزار اوپن سورس و رایگان برای اسکن شبکه . این ابزار هم نسخه ی لینوکسی و هم نسخه ی ویندوزی دارد . امروز میخوایم با کتابخونه ای در پایتون کار کنیم که اجازه میده از nmap و خروجی های اون در پایتون استفاده کنیم . همچنین در آخر پورت اسکنری در پایتون مینویسیم که از nmap برای اسکن کردن پورت ها استفاده میکنه . با ما همراه باشید .
در ابتدا نیاز داریم تا خود ابزار nmap روی سیستممون نصب باشه . میتونید از این لینک nmap رو دانلود و نصب کنید . در لینوکس های امنیتی مثل kali linux به طور پیشفرض نصب هستش ولی در بقیه لینوکس ها یا ویندوز باید دانلود و نصبش کنید حتما .
سپس باید کتابخونه ی python-nmap رو نصب کنیم . برای اینکار از دستور pip استفاده میکنیم :
نصب کتابخانه python-nmap لینوکس :
MrPython@debian:~$ pip3 install python-nmap
نصب کتابخانه python-nmap روی ویندوز :
C:\> pip install python-nmap
برای شروع کار با کتابخونه در ابتدا اون رو ایمپورت میکنیم و سپس یک شیء از PortScanner میسازیم :
>>> import nmap >>> scanner = nmap.PortScanner()
حالا میتونیم از شیء scanner برای اسکن کردن پورت ها استفاده کنیم به شکل زیر:
>>> scanner.scan(hosts="127.0.0.1" , ports="10-400")
پس از اجرای دستور بالا ، شیء scanner شروع به اسکن کردن میکنه . دقت کنید به جای 127.0.0.1 باید آی پی مورد نظر رو برای اسکن وارد کنید همچنین در پارامتر ports ، شماره پورت هایی که میخوایم اسکن بشه رو وارد میکنیم . در اینجا ما زدیم 400-10 یعنی پورت 10 تا 400 اسکن بشه . (نکته : میتونید یک پارامتر دیگر به اسم arguments را هم مقدار دهی کنید . با استفاده از این پارامتر آرگومان های اسکن را برای nmap مشخص میکنیم به طور پیشفرض مقدار این پارامتر sV است که یک اسکن کامل به همراه نام و ورژن سرویس های هر پورت را ارائه میدهد )
پس از تکمیل شدن فرایند اسکن میتونیم از طریق شیء scanner که تعریف کردیم به نتایج اسکن پی ببریم . در ابتدا پروتکل مورد استفاده در پورت های آی پی که اسکن کردیم رو میتونیم با استفاده از تکه کد زیر ببینیم :
>>> protocols = scanner["127.0.0.1"].all_protocols() >>> print(protocols)
همینطور که در کد بالا مشخص شده ما برای دیدن نتیجه ی اسکن آی پی 127.0.0.1 ، آن را به صورت کلید به شیء scanner دادیم ( ["127.0.0.1"].scanner )
خروجی تک کد بالا :
همینطور که میبینید پورت ها به صورت TCP هستند . حال برای مشاهده ی پورت های باز از تکه کد زیر استفاده میکنیم :
>>> open_ports = scanner["127.0.0.1"]["tcp"].keys() >>> for port in open_ports: print("{} : OPEN".format(port))
طبق تکه کد بالا در ابتدا شماره پورت های باز را داخل متغییر open_ports ریختیم . برا اینکار از شیء scanner استفاده کردیم . به عنوان کلید اول دیکشنری ، آی پی که نتایج اسکن آن را میخواهیم را وارد کردیم ، برای کلید دوم پروتکل پورت را مشخص کردیم (tcp) و سپس با استفاده از متود keys کلید های دیکشنری که همان پورت های باز هستند را استخراج کردیم .
پس از آن با یک حلقه ی for هر کدام از پورت های باز را نمایش داده ایم .
نتیجه کد بالا :
دقت کنید حتی میتونید اطلاعات مربوط به هر پورت باز رو هم دریافت کنید . برای مثال تکه کد زیر ، اسم سرویس اجرا شده روی پورت 137 (به شرطی که باز باشد) را چاپ میکند :
>>> service_name = scanner["127.0.0.1"]["tcp"][137]["name"] >>> print(service_name)
نتیجه کد بالا :
نکته : به جای عدد 137 در کد بالا میتونید هر شماره پورت باز دیگری را نیز بدهید تا سرویس اجرا شده روی آن را به شما برگرداند .
تا اینجا به طور کلی طرز کار کتابخونه رو میدونیم . بیاید یه پورت اسکنر بنویسیم :)
سورس :
from nmap import PortScanner
scanner = PortScanner()
IP = input("IP : ") port_range = input("PORT RANGE (Example : 20-80) : ")
print("Start Scanning ... ")
scanner.scan(IP , ports=port_range)
open_tcp_ports = scanner[IP]["tcp"].keys()
print("------------") for port in open_tcp_ports: service_name = scanner[IP]["tcp"][port]["name"] print ("{} - {} : OPEN".format(port , service_name))
input()
توضیح : در ابتدا ایمپورت های لازم رو انجام دادیم . سپس شیء scanner رو برای اسکن کردن پورت ها ساختیم . پس از اون IP و محدوده پورت (port_range) رو از کاربر گرفتیم .
سپس از شیء scanner و متود scan استفاده کردیم و IP و پورتی که کاربر داده بود رو بهش دادیم تا اسکن رو آغاز کنه .
پس از اون تمام پورت های باز TCP رو گرفتیم و ریختیم داخل متغییر open_tcp_ports .
سپس با استفاده از یک حلقه ی for روی open_tcp_ports ، شماره و اسم سرویس اجرا شده روی هر پورت باز رو برای کاربر نمایش دادیم .
نتیجه اجرای سورس بالا (تست اسکن پورت روی لینوکس metasploitable) :
امیدوارم لذت برده باشید . سوالی بود مطرح کنید .
یا حق !
Telegram Channel : @mrpythonblog