Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
netmap.js — وحدة اكتشاف شبكة سريعة تعتمد على المتصفح | Kitploit
أدوات/GitHubGitHub/serain/netmap.js
الاستطلاعتخطيط الشبكةمسح المنافذجمع المعلوماتاختبار الاختراق
GitHubserain/netmap.js

netmap.js

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

عرض المستودع
11522منذ 5 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

netmap.js

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

لم يعد هذا المشروع قيد الصيانة.

الوصف

netmap.js توفر إمكانيات اكتشاف المضيفين وفحص المنافذ في المتصفح، مما يتيح لك رسم خريطة لشبكات زوار موقعك.

إنها سريعة جدًا، وتستخدم es6-promise-pool لتشغيل الحد الأقصى من الاتصالات المتزامنة التي يسمح بها المتصفح بكفاءة.

الدافع

كنت بحاجة إلى ماسح منافذ يعمل في المتصفح لفكرة كنت أعمل عليها. وظننت أن الأمر سيكون بسيطًا كاستيراد وحدة موجودة أو نسخ ولصق من مشروع آخر مثل BeEF.

اتضح أنه لم توجد وحدة جاهزة مناسبة على npm ووحدة port_scanner في BeEF كانت (وقت كتابة هذا النص) غير دقيقة، بطيئة ولا تعمل على Chromium.

لذا فإن netmap.js هو أداة مسح "ping" مُحسّنة إلى حد ما وماسح TCP يعمل على جميع المتصفحات الحديثة.

بداية سريعة

التثبيت

root@kitploit:~
npm install --save netmap.js

العثور على المضيفين النشطين

لنكتشف عنوان IP لبوابة زائر الموقع، بدءًا من قائمة المرشحين المحتملين في بيئة منزلية:

root@kitploit:~
import NetMap from 'netmap.js'

const netmap = new NetMap()
const hosts = ['192.168.0.1', '192.168.0.254', '192.168.1.1', '192.168.1.254']

netmap.pingSweep(hosts).then(results => {
  console.log(results)
})
root@kitploit:~
{
  "hosts": [
    { "host": "192.168.0.1", "delta": 1003, "live": false },
    { "host": "192.168.0.254", "delta": 1001, "live": false },
    { "host": "192.168.1.1", "delta": 18, "live": true },
    { "host": "192.168.1.254", "delta": 1002, "live": false }
  ],
  "meta": {}
}

يبدو أن المضيف 192.168.1.1 نشط.

فحص منافذ TCP

لنحاول العثور على بعض منافذ TCP المفتوحة على عدد من المضيفين:

root@kitploit:~
import NetMap from 'netmap.js'

const netmap = new NetMap()
const hosts = ['192.168.1.1', '192.168.99.100', 'google.co.uk']
const ports = [80, 443, 8000, 8080, 27017]

netmap.tcpScan(hosts, ports).then(results => {
  console.log(results)
})
root@kitploit:~
{
  "hosts": [
    {
      "host": "192.168.1.1",
      "control": "22",
      "ports": [
        { "port": 443, "delta": 15, "open": false },
        { "port": 8000, "delta": 19, "open": false },
        { "port": 8080, "delta": 21, "open": false },
        { "port": 27017, "delta": 26, "open": false },
        { "port": 80, "delta": 95, "open": true }
      ]
    },
    {
      "host": "192.168.99.100",
      "control": "1001",
      "ports": [
        { "port": 8080, "delta": 40, "open": true },
        { "port": 80, "delta": 1001, "open": false },
        { "port": 443, "delta": 1000, "open": false },
        { "port": 8000, "delta": 1004, "open": false },
        { "port": 27017, "delta": 1000, "open": false }
      ]
    },
    {
      "host": "google.co.uk",
      "control": "1001",
      "ports": [
        { "port": 443, "delta": 67, "open": true },
        { "port": 80, "delta": 159, "open": true },
        { "port": 8000, "delta": 1001, "open": false },
        { "port": 8080, "delta": 1002, "open": false },
        { "port": 27017, "delta": 1000, "open": false }
      ]
    }
  ],
  "meta": {}
}

قد تبدو النتائج متناقضة في البداية.

192.168.1.1 هو جهاز Linux مدمج (موجه) على قطاع الشبكة المحلية، والمنفذ الوحيد المفتوح هو 80. نلاحظ أن المتصفح استغرق حوالي 5 أضعاف الوقت ليفشل على 80 مقارنة بالمنافذ الأخرى المغلقة.

192.168.99.100 هو جهاز افتراضي مضيف فقط مع منفذ 8080 مفتوح، وgoogle.co.uk هو مضيف خارجي مع فتح كل من 443 و80. في هذه الحالات، ألقى المتصفح خطأ بسرعة نسبيًا على المنافذ المفتوحة بينما انتهت مهل المنافذ المغلقة. يشرح قسم النظرية متى يحدث هذا.

لتحديد ما إذا كان يجب وضع علامة على المنافذ كمفتوحة أو مغلقة، سيقوم netmap.js بمسح منفذ "تحكم" (افتراضيًا 45000) يُفترض أنه مغلق. يُستخدم وقت التحكم بعد ذلك لتحديد حالة المنافذ الأخرى. إذا كانت النسبة delta/control أكبر من قيمة محددة (افتراضيًا 0.8)، يُفترض أن المنفذ مغلق (باختصار: الفرق بأكثر من 20% عن وقت التحكم يعني أن المنفذ مفتوح).

القيود

القوائم السوداء للمنافذ

تحتفظ المتصفحات بقائمة سوداء للمنافذ التي ترفض الاتصال بها (مثل FTP أو SSH أو SMTP). إذا حاولت مسح تلك المنافذ باستخدام netmap.js مع البروتوكول الافتراضي (http)، فستحصل على مهلة قصيرة جدًا. المهلة القصيرة عادة ما تكون علامة على أن المنفذ مغلق، ولكن في حالة المنافذ المدرجة في القائمة السوداء، لا يعني ذلك شيئًا.

يمكنك التحقق من القوائم السوداء من هذه المصادر:

  • مصدر Chromium
  • وثائق Mozilla
  • Edge/IE (أرسل لي رابطًا إذا وجدت مصدرًا)

قبل Firefox 61 (وربما متصفحات أخرى)، يمكن تجاوز هذا القيد باستخدام بروتوكول ftp بدلاً من http لإنشاء الاتصالات. يمكنك تحديد protocol في كائن الخيارات عند إنشاء NetMap. عند استخدام ftp، يجب أن تتوقع أن تنتهي مهل المنافذ المفتوحة وأن تخطئ المنافذ المغلقة بسرعة نسبيًا. يخضع مسح ftp أيضًا للقيود المتعلقة بحزم TCP RST التي تمت مناقشتها في هذا المستند.

تم حظر طلبات الموارد الفرعية من البروتوكولات "القديمة" مثل ftp منذ فترة في Chromium.

مسح "Ping"

تقوم وظيفة مسح "ping" التي يوفرها netmap.js بعمل جيد في العثور بسرعة على المضيفات *nix الحية على قطاع الشبكة المحلية (أجهزة الكمبيوتر الأخرى، الهواتف، أجهزة التوجيه، الطابعات، إلخ).

ومع ذلك، نظرًا للتنفيذ، لن يعمل هذا عندما لا يتم إرجاع حزم TCP RST. عادةً:

  • أجهزة Windows
  • بعض المضيفات الخارجية
  • بعض إعدادات الشبكة مثل الأجهزة الافتراضية ذات الجسر/المضيف فقط

يتم شرح السبب وراء ذلك في قسم النظرية أدناه.

لا يؤثر هذا القيد على قدرات مسح TCP، ولا يزال من الممكن تحديد ما إذا كانت المضيفات المذكورة حية من خلال محاولة العثور على منفذ مفتوح عليها.

نقص عام في الدقة

بشكل عام، وجدت أن هذه الوحدة أكثر دقة وأسرع من الأجزاء الأخرى من الكود التي وجدتها على الويب. ومع ذلك، فإن فكرة رسم خرائط الشبكات من المتصفح ستكون غير مستقرة بطبيعتها. قد تختلف النتائج.

الاستخدام

مُنشئ NetMap

يأخذ مُنشئ NetMap كائن خيارات يتيح لك تكوين:

  • protocol المستخدم للمسح (افتراضيًا http، راجع القوائم السوداء للمنافذ لمعرفة سبب رغبتك في تعيينه إلى ftp)
  • timeout لاتصال المنفذ (افتراضيًا 1000 ميلي ثانية)
root@kitploit:~
import NetMap from 'netmap.js'

const netmap = new NetMap({
  protocol: 'http',
  timeout: 3000
})

pingSweep()

تحدد طريقة pingSweep() ما إذا كانت مصفوفة من المضيفين حية. تفعل ذلك عن طريق التحقق مما إذا كان الاتصال بمنفذ قد انتهت مهلة، وفي هذه الحالة يُعتبر المضيف غير متصل (راجع مسح "Ping" للقيود والحالة القياسية للنظرية).

تأخذ الطريقة المعلمات التالية:

  • hosts مصفوفة من المضيفين للمسح (عناوين IP أو أسماء مضيفين)
  • options كائن يحتوي على:
    • maxConnections - الحد الأقصى لعدد الاتصالات المتزامنة (افتراضيًا 10 على Chrome و 17 على المتصفحات الأخرى - الحد الأقصى للاتصالات المتزامنة التي يدعمها المتصفح)
    • port للمسح (افتراضيًا 45000)

تعيد وعدًا.

root@kitploit:~
netmap.pingSweep(['192.168.1.1'], {
  maxConnections: 5,
  port: 80
}).then(results => {
  console.log(results)
})

tcpScan()

ستقوم طريقة tcpScan() بإجراء مسح للمنافذ ضد مجموعة من الأهداف. اقرأ الحالة القياسية لفهم كيفية قيامها بذلك.

تأخذ الطريقة المعلمات التالية:

  • hosts مصفوفة من المضيفين للمسح (عناوين IP أو أسماء مضيفين)
  • ports قائمة بالمنافذ للمسح (أعداد صحيحة بين 1-65535، تجنب المنافذ في القوائم السوداء)
  • options كائن يحتوي على:
    • maxConnections - الحد الأقصى لعدد الاتصالات المتزامنة (افتراضيًا 6 - الحد الأقصى للاتصالات لكل نطاق يسمح به المتصفح)
    • portCallback - رد اتصال لتنفيذه عند الانتهاء من مسح كل زوج host:port
    • controlPort - المنفذ الذي سيتم مسحه لتحديد دلتا أساسية للمنفذ المغلق (افتراضيًا 45000)
    • controlRatio - التشابه، بالنسبة المئوية، من دلتا التحكم لاعتبار المنفذ مغلقًا (افتراضيًا 0.8، راجع مثال)

تعيد وعدًا.

root@kitploit:~
netmap.tcpScan(['192.168.1.1'], [80, 27017], {
  maxConnections: 5,
  portCallback: result => {
    console.log(result)
  },
  controlPort: 45000,
  controlRatio: 0.8
}).then(results => {
  console.log(results)
})

راجع المثال لتفسير الإخراج.

النظرية

يغطي هذا القسم بإيجاز النظرية الكامنة وراء تقنيات اكتشاف الوحدة.

الفكرة العامة

تستخدم هذه الوحدة كائنات Image لمحاولة طلب موارد عبر الأصل (سلسلة عناوين http://{host}:{port} قيد الاختبار). الوقت الذي يستغرقه المتصفح لإثارة خطأ ( delta )، أو عدم وجود خطأ بعد قيمة مهلة معينة، يوفر رؤى حول حالة المضيف والمنفذ قيد المراجعة.

الحالة القياسية

سوف يستجيب المضيف الحي عادةً بسرعة نسبيًا بحزمة TCP RST عند محاولة الاتصال بمنفذ مغلق.

إذا كان المنفذ مفتوحًا، وحتى إذا لم يكن يعمل بخادم HTTP، فسيستغرق المتصفح وقتًا أطول قليلاً لإثارة خطأ بسبب الحمل الزائد لإنشاء اتصال TCP كامل ثم إدراك أنه لا يمكنه الحصول على صورة من عنوان URL المقدم.

بطبيعة الحال، لن يستجيب المضيف غير المتصل بـ RST ولن يسمح بإنشاء اتصال TCP كامل. ستظل المتصفحات تحاول إنشاء الاتصال لبعض الوقت قبل انتهاء المهلة (~90 ثانية). سينتهي مهلة netmap.js بعد انتظار 1000 ميلي ثانية افتراضيًا.

باختصار:

  • المنافذ المغلقة على المضيفات الحية سيكون لها delta قصير جدًا
  • المنافذ المفتوحة على المضيفات الحية سيكون لها delta أطول قليلاً
  • المضيفات غير المتصلة أو عناوين IP غير المستخدمة ستنتهي مهلة

توضح الحالة القياسية بواسطة المضيف 192.168.1.1 في مثال مسح منفذ TCP.

حالة عدم وجود TCP RST

بعض المضيفات (مثل google.co.uk أو مضيفات Windows) وبعض إعدادات الشبكة (مثل شبكات VirtualBox ذات المضيف فقط) لن تعيد حزم TCP RST عند الوصول إلى منفذ مغلق.

في هذه الحالات، ستنتهي مهلة المنافذ المغلقة عادةً بينما ستثير المنافذ المفتوحة خطأً بسرعة.

وبالتالي فإن تنفيذ طريقة pingSweep() غير موثوق عندما لا يتم إرجاع حزم RST.

باختصار، عندما لا يتم إرجاع حزم TCP RST لأي سبب:

  • المنافذ المغلقة على المضيفات الحية ستنتهي مهلة
  • المنافذ المفتوحة على المضيفات الحية سيكون لها delta قصير
  • لا يستطيع pingSweep() التمييز بين انتهاء مهلة منفذ مغلق وانتهاء مهلة مضيف "ميت"

توضح الحالة الخاصة بواسطة المضيفين 192.168.99.100 و google.co.uk في مثال مسح منفذ TCP.

تجاهل WebSockets و AJAX

من الموثق جيدًا أنه يجب أيضًا أن تكون قادرًا على رسم خرائط الشبكات باستخدام WebSockets و AJAX.

لقد جربته (وقمت أيضًا بتعديل BeEF لتجربة وحدة port_scanner الخاصة به باستخدام WebSockets و AJAX فقط)؛ وجدت أن كلتا الطريقتين تنتجان نتائج غير موثوقة تمامًا.

يرجى إخباري إذا كنت أغفل شيئًا في هذا الصدد.

تنزيل الأداة