شرح مكتبة nmap في بايثون

0
شرح مكتبة nmap في بايثون | Python nmap lib

ربما الجميع يعرف اداة nmap الخاصة بفحص المنافذ , ويحتاج البعض استعمالها في مشروع بايثون فيضطر لتثبيت الاداة واستعمالها وهذا يتم عن طريق تنفيذ الاوامر على النظام بواسطة دالة os ومن ثم قراءة مخرجات الامر, وهذا الامر متعب لأنك تضطر لفلترة المخرجات وتقسيمها حتى تحصل على مبتغاك, لن تحتاج لعمل ذلك بعد اليوم لان بايثون وفرت مكتبة خاصة nmap تقوم بفحص المنافذ بسهولة تامة.

طريقة تثبيت مكتبة nmap


انا أستعمل نظام كالي لينكس حاليا لذلك هذا الشرح مجرب على اللينكس فقط, لم أجرب على الويندوز للأمانة.

يجب أولا تثبيت python-nmap

بهذا الامر

pip install python-nmap

وتثبيت مكتبة nmap

pip install nmap



/*
ملاحظة:
 وقع لي مشكل في استدعاء المكتبة في البايثون , رغم أني ثبتها دون مشاكل, وسأشارككم الحل.

المشكل اثناء استدعاء PortScanner ويظهر كالاتي

AttributeError: 'module' object has no attribute 'PortScanner'

والحل كان تثبيت python-nmap من السورس وليس عبر pip لا اعرف كيف حصل هذا المشكل , المهم طريقة تثبيته
كالاتي:


  1. افتح الطرفية
  2. ألصق بها الاوامر الأتي


أمر تحميل السورس من الموقع

hg clone https://bitbucket.org/xael/python-nmap 
 
ثم 
 
cd python-nmap
 
ثم التثبيت بالامر

python setup.py install

فقط وانتهى المشكل باذن الله.

*/

نبدا على بركة الله شرح استعمال مكتبة nmap


أولا كالمعتاد يجب استدعاء المكتبة nmap مثل أي مكتبة.

import nmap

سنحتاج استعمال كلاس PortScanner موجود بالموديل nmap , لذلك سنقوم بانشاء كائن object ونعطيه اسم nm
وبدل كتابة الاسم الطويل nmap.PortScanner اختصرناه ب nm

كالاتي

nm = nmap.PortScanner()

الان سنستعمل دالة scan موجودة بالكلاس السابق PortScanner , في السابق قمنا باستنساخه واختصرناه ب nm
لذلك يمكننا الوصول للدالة scan هكذا

nm.scan()

كيف تعمل دالة المسح وماهي البارمترات الخاصة به

scan(hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False)

كبداية أبسط أمر للفحص هو تمرير الاي بي المراد فحصه فقط

كالأتي

nm.scan('192.168.1.1')

سيقوم الامر بفحص المنافذ ونحن سنختار ما نريد اظهاره من النتائج
على سبيل المثال سنظهر ماهو الهوست نيم:

 Hostname = nm['192.168.1.1'].hostname()

في الكود السابق قمنا باستخراج اسم الجهاز Hostname , أما عندما استعملنا العلامة []  بداخلها الاي بي المراد معرفة الهوست الخاص به وكأنها مصفوفة والسبب يرجع لأنه يمكننا فحص الكثير من الايبيات لذلك يجب أن نخبره او نستعلم عن الاي بي المراد استخراج نتائجه فقط.

الان قم بطبع الناتج بالامر

print Hostname

وسيظهر لك مثلا:
localhost

hostname يختلف من جهاز لاخر وعند فحص الروتر لم يظهر لذلك لا تقلق ان لم يظهر.

نريد معرفة حالة الجهاز بمعنى هو شغال أو منطفيء up or down

state = nm['192.168.1.1'].state() 

 قم بطباعة الناتج بالأمر

print  nm['192.168.1.1'].state() 

أو بهذا الشكل:
print state

لكن من الأفضل تحتفظ بالناتج في متغير مثل ما فعلت في الامر الثاني state لأنك ربما تحتاجه في بقية مشروعك.

طريقة معرفة البورتات المفتوحة, يجب أن تحدد على أي بروتوكول مثلا tcp أو udp
سنقوم بعرض البورتات الخاصة ببروتوكول tcp باستعمال .all_tcp 
مثال:

tcp_ports = nm['192.168.1.1'].all_tcp()

وسنقوم بعرض الناتج بالامرالمعتاد

print(tcp_ports)



 وبنفس الطريقة يمكننا استعمال udp فقط غير all_tcp ب all_udp
مثال:
tcp_ports = nm['192.168.1.1'].all_udp()

وهذا الكود كاملا لما طبقناه

نتيجة تشغيل السكريبت


الان سنستخدم الدالة scan بطريقة أخرى بمعنى بمٌدخلين أو 2 بارميتر وهما ip و port

بهذه الطريقة يمكننا فحص منفذ معين port, او يمكن فحص مجال انت تحدده بنفسك range of ports

بهذا الشكل

nm.scan('127.0.0.1', '1-1024')

طريقة فحص مجموعة أو range من الاي بيات كالأتي

nm.scan(hosts='192.168.1.0/24')

وهذا الامر الذي أفضله شخصيا وهو فحص الهدف بحيث أنت من تحدد كيفية الفحص عبر تمرير بارميترات

على سبيل المثال في أداة الان ماب الكل يستخدم الأداة في الفحص بهذه الطريقة

nmap -sS -sV -O 192.168.1.1
لذلك سنستخدمها بهذا الشكل وتمرير arguments كالاتي

nm.scan(hosts='192.168.1.1', arguments='-n -sP -PE -PA21,23,80,3389')

استعمال التزامن Asynchronous


while nma.still_scanning():
    print("Waiting ...")
    nma.wait(2) 

الكود يعني بما ان الفحص مستمر still_scanning قم ب: طباعة Waiting  بعدها قم بعمل انتظار wait  لمدة زمنية تختارها

اذا أردت في مرحلة ما من برنامج لمعرفة أمر الفحص الذي استخدمته استعمل الامر command_line 

nm.command_line()

وسيطبع لك argument التي حددتها مثل : nmap -oX - -p 22-443 127.0.0.1

استعمال امر  scaninfo لمعرفة معلومات معينة حول البورتات ونوعها والخدمات

nm.scaninfo() 
وستظهر لك النتيجه :

{'tcp': {'services': '22-443', 'method': 'connect'}}


في النهاية يمكنك ان تقوم بحفظ نتائج البحث الناتجة من مشروعك على شكل ملف csv بالامر

print(nm.csv())