ربما الجميع يعرف اداة 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 لا اعرف كيف حصل هذا المشكل , المهم طريقة تثبيته
كالاتي:
- افتح الطرفية
- ألصق بها الاوامر الأتي
أمر تحميل السورس من الموقع
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)
اذا أردت في مرحلة ما من برنامج لمعرفة أمر الفحص الذي استخدمته استعمل الامر 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())