
- بواسطة x32x01 ||
برمجة نسخة بسيطة من nmap بلغة بايثون
نستعرض دلوقتي طريقة استخدام مكتبة python‑nmap عشان تبني أداة بسيطة بفكرة Nmap في بايثون: فحص عنوان IP، تفتيش بورتات (1-1024)، وعرض الخدمات وحالة الهوست. هتلاقي شرح لكل سطر وكود نهائي جاهز للتشغيل.المطلوب قبل البدء
- تثبيت nmapعلى النظام (الأمر يختلف حسب التوزيعة):
- على Debian/Ubuntu:
sudo apt update
sudo apt install nmap
- على macOS مع Homebrew:
brew install nmap
- على Debian/Ubuntu:
- تثبيت مكتبة بايثون python-nmap (المجرد تثبيت المكتبة لا يغني عن تثبيت nmap نفسه):
pip3 install python-nmap
روابط مرجعية:
- صفحة nmap الرسمية: https://nmap.org
- python-nmap على PyPI / GitHub: https://pypi.org/project/python-nmap/ و https://github.com/thezazen/python-nmap
فهم الخيارات الأساسية المستخدمة في الكود
في المثال سنستعمل:scanner.scan(target, '1-1024', '-sV')
- '1-1024' : نطاق البورتات الأولي (يمكن تغييره).
- -sV : محاولة كشف الخدمة وإصدارها على البورت (service/version detection).
قابلة للتعديل: يمكنك استخدام -sS لمسح SYN stealth، أو -A لمسح شامل (قد يحتاج صلاحيات root).
كود بايثون عملي ومحسن (جاهز للتشغيل)
Python:
#!/usr/bin/env python3
"""
Simple Nmap-like scanner using python-nmap.
Use only on hosts/networks you own or have permission to test.
"""
import nmap
import sys
def scan_target(target, port_range='1-1024', nmap_args='-sV'):
nm = nmap.PortScanner()
try:
nm.scan(hosts=target, ports=port_range, arguments=nmap_args)
except nmap.PortScannerError as e:
print(f"[!] Nmap error: {e}")
return
except Exception as e:
print(f"[!] Unexpected error: {e}")
return
if target not in nm.all_hosts():
print(f"[!] No results for {target}.")
return
host = nm[target]
print(f"\nHost : {target}")
print(f"Hostname : {host.hostname()}")
print(f"State : {host.state()}\n")
# قد لا يحتوي على key 'tcp' لو لم يتم العثور على tcp ports
if 'tcp' not in host:
print("[i] No TCP ports found in the scanned range (or host filtered).")
return
ports = sorted(host['tcp'].keys())
for p in ports:
info = host['tcp'][p]
# info is a dict, e.g. {'state': 'open', 'name': 'http', 'product': 'Apache', ...}
print('-' * 40)
print(f"Port {p}/tcp")
print(f" State : {info.get('state', 'unknown')}")
print(f" Service: {info.get('name', 'unknown')}")
# product/version may be absent
prod = info.get('product')
ver = info.get('version')
if prod or ver:
print(f" Product: {prod or ''} {ver or ''}")
# extra info
extr = info.get('extrainfo')
if extr:
print(f" Extra : {extr}")
print('\nScan completed.\n')
def main():
if len(sys.argv) >= 2:
target = sys.argv[1]
else:
target = input("Please enter an IP address or host (e.g. 192.168.1.1): ").strip()
if not target:
print("No target provided. Exiting.")
return
# خيارات قابلة للتعديل:
port_range = input("Enter port range (default 1-1024): ").strip() or '1-1024'
args = input("Enter nmap arguments (default -sV): ").strip() or '-sV'
scan_target(target, port_range, args)
if __name__ == '__main__':
main()
شرح سريع للمحسّنات في الكود:
- تعامل آمن مع Exceptions ليمنع تحطّم البرنامج عند أخطاء nmap.
- تحقق من وجود الـ host في نتائج المسح.
- ترتيب البورتات sorted(...) لعرض منظم.
- دعم مدخلات سطر الأوامر: python3 scan.py 10.0.0.1 أو تشغيل تفاعلي.
أمثلة تشغيل
- فحص تفاعلي:
python3 scan.py
ثم تدخل العنوان ونطاق البورتات والـ nmap args. - فحص سريع من سطر الأوامر مع النطاق الافتراضي:
python3 scan.py 192.168.1.10
- استعمال خيار -A لمسح شامل (قد يحتاج صلاحيات):
python3 scan.py 192.168.1.10
# ثم عند المدخلات اكتب:-sV -A
نصائح عملية وأمان
- شغّل المسح فقط على شبكات أو أجهزة لديك إذن بمسحها.
- بعض مسوحات Nmap قد تُثير أجهزة كشف اختراق IDS/IPS أو قد تُسجل كهجوم عند مزود الخدمة.
- لا تشغّل فحوصات عنيفة على شبكات الشركات أو مزود الخدمة
- استخدم نطاقات صغيرة في البداية للتجربة ثم وسّع تدريجيًا.
تحسينات ممكن تضيفها لاحقًا
- حفظ النتائج بصيغة
JSON
أوCSV: nm.csv()
أوnm.get_nmap_last_output()
أو التعريف اليدوي باستخدام json لبناء مخرجات. - واجهة رسومية بسيطة (Tkinter) أو واجهة ويب (Flask) لعرض النتائج.
- دعم مسح UDP و-SYN، أو إضافة خيارات لسرعة المسح (-T4) أو استثناءات IP Range.
- تنفيذ مسح متوازي عبر threading/async عند فحص شبكات واسعة.
أمثلة مرجعية ومصادر مفيدة
- الوثائق الرسمية nmap: https://nmap.org/docs.html
- python-nmap GitHub: https://github.com/thezazen/python-nmap
- دروس Nmap (for learning flags): https://nmap.org/book/man-briefoptions.html
التعديل الأخير: