
nmap-vulners v1.5
نصوص Nmap NSE التي تستعلم عن واجهة برمجة تطبيقات Vulners لتحديد الثغرات الأمنية المعروفة (CVEs) للخدمات الشبكية المكتشفة، مما يعزز مسح المنافذ القياسي بالبحث التلقائي عن CVEs وتقييم CVSS.
nmap-vulners
حوّل فحص خدمات nmap إلى قائمة من CVEs ودرجات CVSS والاستغلالات المعروفة.
ثلاثة نصوص NSE تأخذ البرمجيات التي سبق أن حدّدها nmap، وتسأل قاعدة بيانات Vulners عمّا هو معروف عنها، ثم تطبع الإجابة داخل تقرير الفحص.

النصوص الثلاثة
| النص | يتطلب مفتاحًا | وظيفته |
|---|---|---|
vulners.nse | لا | يرسل كل CPE يعثر عليه nmap إلى نقطة نهاية Vulners العامة ويطبع ما هو معروف عنها، مع ترتيب الأعلى درجة CVSS أولًا |
vulners_enterprise.nse | نعم | نفس البحث عبر Vulners API v4: درجات CVSS v3 والاستغلالات التي تشير إلى كل CVE |
http-vulners-regex.nse | لا | يستخرج بصمة برمجيات الويب من ترويسات HTTP ومحتوى الصفحة، بحيث يكون لدى النصّين الآخرين ما يبحثان عنه حتى عندما لا يستطيع -sV تسميتها |
النصوص الثلاثة مستقلة عن بعضها. شغّل واحدًا منها أو الثلاثة معًا - يسلّم نص regex نتائجه إلى النصّين الآخرين تلقائيًا.
التثبيت
macOS وLinux وKali وWSL - سطر واحد، بلا وسائط:
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows - PowerShell بصلاحيات المسؤول:
irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
يسأل المثبّت nmap عن مكان بياناته، وينسخ النصوص وملفات بياناتها إلى هناك، ويعيد بناء قاعدة بيانات النصوص، ثم يتحقق من أن --script vulners يحلّ فعلًا إلى ما ثبّته للتو - إذ يضم nmap vulners.nse خاصًا به، وهذا النص المثبّت يحلّ محله.
بدون صلاحيات الجذر، وخيارات أخرى
# into ~/.nmap, no sudo; the installer prints the NMAPDIR line to add to your profile
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh -s -- --user
# a specific directory
./install.sh --prefix /usr/local/share/nmap
# a specific release
./install.sh --ref v1.5
# remove everything it installed
./install.sh --uninstall
يقبل PowerShell الخيارات نفسها: -User و-Prefix و-Ref و-Uninstall.
من نسخة مستنسخة
git clone https://github.com/vulnersCom/nmap-vulners
cd nmap-vulners
./install.sh
يستخدم المثبّت الملفات المجاورة له، لذا يثبّت هذا بالضبط ما استنسخته. كما يعمل تشغيل النصوص مباشرة من النسخة المستنسخة:
nmap -sV --script "$PWD/vulners.nse" <target>
استخدم مسارًا مطلقًا عند التشغيل من نسخة مستنسخة. يحلّ nmap المسار النسبي
--script ./vulners.nseمقابلscript.dbالخاص به أولًا، ثم يشغّل بصمت النسخة التي جاءت مع nmap بدلًا من نسختك.
يدويًا
خمسة ملفات ودليلان:
| الملف | يُنسخ إلى |
|---|---|
vulners.nse, vulners_enterprise.nse, http-vulners-regex.nse | <nmap data dir>/scripts/ |
http-vulners-regex.json, http-vulners-paths.txt | <nmap data dir>/nselib/data/ |
ثم نفّذ sudo nmap --script-updatedb.
عادةً ما يكون دليل بيانات nmap هو /usr/share/nmap (Debian وUbuntu وKali)، أو /usr/local/share/nmap (مُجمّع من المصدر)، أو /opt/homebrew/share/nmap (Homebrew)، أو C:\Program Files (x86)\Nmap (Windows). وللتأكّد، اسأل nmap:
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
الدليل الذي يحتوي nse_main.lua هو نفسه الذي يستخدمه nmap هذا.
الاستخدام
vulners - بدون مفتاح
nmap -sV --script vulners [--script-args mincvss=<score>] <target>
يُبحث عن كل CPE يبلغ عنه nmap؛ وتُطبع كل ثغرة مع درجتها والمقياس الذي تنتمي إليه تلك الدرجة ورابطًا لها. الإدخالات ذات الاستغلال المعروف تُعلَّم بعلامة *EXPLOIT* وتُعرض مهما كانت العتبة، لأن خللًا مستغلًا منخفض الخطورة ما زال كفيلًا باختراقك.
vulners_enterprise - مفتاح Vulners API
export VULNERS_API_KEY=<token>
nmap -sV --script vulners_enterprise [--script-args mincvss=<score>] <target>

تستجيب نقطة نهاية enterprise بمقاييس CVSS v3 وبمراجع الاستغلالات التي جمعتها Vulners، لذا يُعلَّم الـCVE المستغل بعلامة *HAS EXPLOIT* ويُدرَج الاستغلال نفسه بجانبه. وتنتقل جميع CPE الخاصة بمنفذ ما في طلب واحد.
http-vulners-regex - بصمة ما لا يستطيع -sV تسميته
nmap -sV --script http-vulners-regex [--script-args paths={"/"}] <target>

يربط 178 نمطًا ترويسات HTTP وترميز الصفحات - Server وX-Powered-By ووسوم المولد وروابط الأصول - بمعرّفات CPE: خوادم الويب، وأنظمة إدارة المحتوى CMS، والأطر، وإضافات WordPress، ومكتبات JavaScript. وكل ما يعثر عليه يُنشر إلى المنفذ، فيبحث عنه vulners وvulners_enterprise في الفحص نفسه.
وسائط النصوص
vulners
| الوسيطة | الافتراضي | المعنى |
|---|---|---|
vulners.mincvss | 0 | إخفاء الثغرات التي تقل درجتها عن هذه القيمة. النشرات والاستغلالات غير المقيّمة تظهر دائمًا |
vulners.api_host | vulners.com | اسم مضيف API |
vulners.api_port | 443 | المنفذ على api_host |
vulners_enterprise
| الوسيطة | الافتراضي | المعنى |
|---|---|---|
vulners_enterprise.mincvss | 0 | كما سبق |
vulners_enterprise.api_key | - | رمز API. يُفضَّل استخدام متغير البيئة، انظر أدناه |
vulners_enterprise.api_key_file | - | مسار مطلق إلى ملف سطره الأول هو الرمز |
vulners_enterprise.api_host | vulners.com | اسم مضيف API |
vulners_enterprise.api_port | 443 | المنفذ على api_host |
http-vulners-regex
| الوسيطة | الافتراضي | المعنى |
|---|---|---|
http-vulners-regex.paths | http-vulners-paths.txt (125 مسارًا) | قائمة Lua من المسارات، أو سلسلة واحدة تسمّي ملفًا يحتوي مسارًا واحدًا في كل سطر |
تنتقل قائمة المسارات بأكملها عبر خط أنابيب HTTP واحد. والملف الذي يتعذّر قراءته يوقف النص بدلًا من الرجوع إلى القائمة المرفقة، لذا لا يمكن لخطأ مطبعي في اسم الملف أن يحوّل فحصًا بثلاثة مسارات إلى فحصٍ بـ125 مسارًا.
أين تحتفظ بمفتاح API
حسب ترتيب الأفضلية:
VULNERS_API_KEYفي متغيرات البيئة--script-args vulners_enterprise.api_key_file=/absolute/path--script-args vulners_enterprise.api_key=<token>
الخيار الثالث مريح لكنه تسريبي: ينسخ nmap سطر أوامره الخاص إلى كل تقرير، لذا ينتهي المطاف بالرمز في سمة args من مخرجات -oX وفي سجل أوامرك. والنص نفسه لا يكتب الرمز في أي مكان، بما في ذلك مخرجاته التشخيصية - وهناك اختبار انحدار يثبت ذلك.
تجد الرموز في حسابك على vulners.com. وبدون رمز، يظل vulners_enterprise صامتًا ولا يرسل شيئًا.
كيف تتكامل النصوص الثلاثة
nmap -sV
|
+-- service fingerprint --> port.version.cpe ------------+
| |
+-- http-vulners-regex.nse |
requests the path list in one pipeline |
matches headers and bodies against 178 patterns |
publishes the CPEs it found for that port ---------+
|
v
vulners.nse / vulners_enterprise.nse
one batched request per port
answers cached for the whole scan
sorted by CVSS, exploits marked
مخرجات قابلة للقراءة آليًا
كل ما تطبعه النصوص هو أيضًا منظم البنية، لذا يمكن تحليل مخرجات -oX دون الاقتراب من النص البشري:
<script id="vulners_enterprise">
<table key="cpe:/a:apache:http_server:2.4.7">
<table>
<elem key="id">CVE-2021-44790</elem>
<elem key="type">cve</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
</table>
<table>
<elem key="id">EDB-ID:51193</elem>
<elem key="type">exploitdb</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
<elem key="is_exploit">true</elem>
</table>
</table>
</script>
المفاتيح هي id وtype وcvss وcvss_type وis_exploit، وهذا الأخير موجود فقط في الإدخالات التي تملك استغلالًا. وجداول النتائج مُفتاحها هو CPE الذي عُثر عليها من أجله. والنشرة غير المقيّمة لا تحمل cvss ولا cvss_type.
الفحص بأدب
فحص شبكةٍ ما يطلب من API أقل بكثير مما يبدو:
- كل CPE لمنفذ ما يدخل في طلب مجمّع واحد
- تُخزَّن الإجابات مؤقتًا طوال الفحص، لذا فمئة خادم متطابق تكلف بحثًا واحدًا لا مئة بحث
- البحث الجاري بالفعل يُنتظَر بدلًا من تكراره
- يعمل مسح المسارات الـ125 عبر 5 اتصالات TCP بدلًا من 126، ويطلب صفحات مضغوطة عندما يوفرها الخادم
- تقييد المعدل (rate limit) أو الانقطاع يوقف طلبات الفحص بدلًا من إعادة المحاولة لكل مضيف
التطوير
الاختبارات وبوابة النظافة وCONTRIBUTING.md موجودة في مستودع git فقط؛ أما أرشيف الإصدار فيضم النصوص وبياناتها. ثلاث بوابات، تعمل جميعها دون اتصال بالإنترنت إلا حيث يُشار إلى خلاف ذلك:
nmap -sn -Pn --script ./tests/run.nse --script-args testdir=tests,root=. 127.0.0.1
python3 tests/e2e/run_e2e.py
python3 tools/check.py
تُشغَّل 110 حالات اختبار وحدة داخل nmap ضد مكتبات NSE الحقيقية؛ و33 حالة اختبار شاملة end-to-end تقود ملف nmap الثنائي الحقيقي ضد خادم ويب محلي وواجهة Vulners API بديلة؛ بينما تُبقي بوابة النظافة الأسرار ومخرجات الفحص وشوائب المحرر خارج شجرة المشروع. ويضيف python3 tests/e2e/run_e2e.py --live ستة اختبارات ضد الخدمة الحقيقية. انظر CONTRIBUTING.md.
الأسئلة الشائعة
هل تستغل أي شيء؟ لا. تقرأ النصوص لافتات الخدمات والصفحات وتسأل قاعدة بيانات. وهي ضمن فئة safe في nmap.
هل تعمل بدون مفتاح API؟ نعم - vulners وhttp-vulners-regex لا يحتاجان إلى أي مفتاح. أما vulners_enterprise فيحتاج إليه.
لماذا تظهر ثغرة بدرجة cvss2.0 بينما تظهر أخرى بدرجة cvss3.1؟ التسمية تشير إلى المقياس الذي تستند إليه الدرجة. وتُرجع Vulners أيهما نشرته الجهة المصدرة؛ فدرجة v2 البالغة 9.3 ليست درجة v3 البالغة 9.3.
لماذا يُعرض إدخال منخفض الدرجة عندما أضبط mincvss؟ لأنه يملك استغلالًا معروفًا، أو لأن الجهة المصدرة لم تمنحه درجة قط. وكلاهما مقصود.
لم يعثر على شيء على مضيف أعلم أنه معرّض للخطر. شغّله مع -d2: تسجّل النصوص كل CPE سألت عنه. وعادةً ما يسمّي nmap الخدمة دون نسختها، فلا توجد نسخة ليبحث عنها.
الترخيص
النصوص مرخّصة بنفس ترخيص Nmap نفسه - انظر LICENSE لترخيص Nmap Public Source License، وnmap.org/npsl لمعرفة ما يعنيه.
بيانات الثغرات مصدرها Vulners وتخضع لشروطها.
ذات صلة
- vulners.com - قاعدة البيانات التي تقف خلف هذه النصوص
- vulnersCom/api - عميل Python
- vulnersCom/burp-vulners-scanner - البيانات نفسها داخل Burp Suite
- nmap.org/book/nse.html - كيف تعمل نصوص NSE
تتم الصيانة بواسطة فريق Vulners <[email protected]>
#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners
#security-tools #pentest #infosec #network-scanner #exploit-database
#lua #vulnerability-detection #security-automation