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

    شرح مكتبة 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())

    شارك المقال

    مقالات متعلقة

    إرسال تعليق