استفاده از پورت اسکنر nmap در پایتون :: Mr Python | مستر پایتون

استفاده از پورت اسکنر nmap در پایتون

  • ۲۹۲۳

استفاده از پورت اسکنر 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

 

  • داداش تو با این همه علم داری حیف میشی

     

    پاسخ:
    ای بابا :|
  • سلام

    با ماژول socket میشه ماژول nmap رو از صفر پیاده سازی کرد؟

    اگه نه با چه ماژول هایی میشه ماژولی مشابه nmap ساخت؟

    ممنون

    پاسخ:
    سلام .
    شدنش که میشه احتمالا ولی مباحث raw socket رو باید بدونید و خیلی خوب پروتکل ها رو بشناسید . در کل شدنیه بله .
  • عالیه ممنون 

    پاسخ:
    خواهش میکنم موفق باشید :)
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی