
أداة اكتشاف متوازٍ لخدمات SSH ومدقّق أمان تفحص أي منفذ، وتتحقق من لافتات SSH، وتدقق طرق المصادقة، والتشفير الضعيف، وثغرة Terrapin، ومفاتيح المضيف المعاد استخدامها عبر المضيفين ونطاقات CIDR.
اعثر على كل خدمة SSH في شبكتك، واحكم ما إذا كانت تلبي معيارك، وسيتم إعلامك عندما يتغير ذلك.
sshfinder هو ملف Python واحد بدون أي تبعيات مطلوبة. وجّهه إلى
نطاق CIDR وسيكتشف SSH أينما كان يستمع فعليًا — وليس فقط على
المنفذ 22 — ويؤكد أن كل واحد يتحدث SSH فعلًا، ويقيّم وضعه
التشفيري، ويعيد رمز خروج غير صفري عندما يفشل شيء ما في سياستك.
لا تستطيع معظم الفرق الإجابة عن ثلاثة أسئلة حول بنية SSH الخاصة بها:
الأدوات الحالية تجيب كل منها على جزء من هذا وتتوقف:
| الأداة | تكتشف SSH | تقيّمه | عبر أسطول كامل |
|---|---|---|---|
nmap | نعم | سطحي، عبر نصوص NSE | نعم |
ssh-audit | لا — تعطيه مضيفًا واحدًا | بعمق | لا |
masscan / zmap | على نطاق الإنترنت | لا | نعم |
sshfinder | نعم | نعم | نعم |
تلك الفجوة — الاكتشاف و التقييم و الحكم، في أداة واحدة — هي
ما وُجدت هذه الأداة لملئه. إذا كنت تحتاج فقط إلى تدقيق مضيف واحد
تعرفه بالفعل، استخدم ssh-audit؛ فهو
يتعمق أكثر في خدمة واحدة مما تفعله هذه الأداة.
سيجد مختبرو الاختراق التدقيق والانعطاف عبر SOCKS مفيدين، لكن الأداة مصممة حول تشغيل نفس الفحص بشكل متكرر ضد بنية تملكها، وليس حول مهمة لمرة واحدة.
git clone https://github.com/kabiri-labs/sshfinder.git
cd sshfinder
python sshfinder.py 10.0.0.0/24 -p 22,2222
لا تثبيت، لا تبعيات. يتطلب Python 3.9+.
الأشياء الثلاثة التي تفعلها، في ثلاثة أوامر:
# 1. الجرد — ما هو SSH الموجود هناك؟
python sshfinder.py 10.0.0.0/24 --audit --format csv -o ssh-inventory.csv
# 2. الحكم — هل يلبي معيارنا؟ (يخرج برمز 3 إذا لم يكن كذلك)
python sshfinder.py 10.0.0.0/24 -p 22,2222 --policy baseline
# 3. الانحراف — ما الذي تغيّر منذ الليلة الماضية؟
python sshfinder.py 10.0.0.0/24 -p 22,2222 --baseline yesterday.json \
--fail-on-drift
فحص جميع المنافذ 65535 هو الافتراضي، لأن خدمة SSH على منفذ غير قياسي هي تحديدًا تلك التي لم يكتبها أحد. كل منفذ مفتوح مُصنَّف، لذلك لا يُحتسب المنفذ المفتوح أبدًا بصمت كمنفذ SSH:
=== 10.0.0.5 ===
open: 10.0.0.5:22 [SSH], 10.0.0.5:8080 [not ssh]
SSH 10.0.0.5:22 (SSH-2.0-OpenSSH_7.4)
التأكيد هو تبادل تعريف RFC 4253 حقيقي، وليس نظرة على البايتات الأولى على السلك. الخوادم التي تطبع لافتة قانونية أولاً، أو التي تنتظر العميل لتقديم نفسه، أو التي تصل لافتتها مقسمة عبر مقاطع TCP — كلها تُعرَف بشكل صحيح — كل واحدة منها هي نتيجة سلبية خاطئة في تنفيذ ساذج.
أضف --audit للصورة الكاملة لكل خدمة:
SSH 10.0.0.5:22 (SSH-2.0-OpenSSH_7.4)
host key: ssh-ed25519 SHA256:T/ZM4jOL4amTsO5K3AaCdg2...
auth: publickey, password [!] password auth enabled
[!] Terrapin (CVE-2023-48795): VULNERABLE
[!] weak ciphers: aes128-cbc
aes128-cbc [weak]: CBC mode is vulnerable to the SSH plaintext-recovery attack (CVE-2008-5161) and, …
مفاتيح مضيف SSH المشتركة (مضيفون مشتركون/مستنسخون محتملون):
SHA256:T/ZM4jOL4amTsO5K3AaCdg2...
-> 10.0.0.5:22, 10.0.0.9:22
تلك الكتلة الأخيرة تستحق المعرفة: مفتاح مضيف مُعاد استخدامه عبر أجهزة يعني عادةً أجهزة VM مستنسخة أو صورة مشتركة، ويعني أن اختراق مضيف واحد يخترق هوية جميعها.
جعل OpenSSH 10.0 من mlkem768x25519-sha256 تبادل المفاتيح الافتراضي، و10.1
يحذر من أن الجلسات الكلاسيكية مفتوحة لالتقاط خزّن الآن، فكّك لاحقًا.
يجيب --pq-report على سؤال مستوى الأسطول مباشرة، باستخدام فقط
KEXINIT — لذلك لا يحتاج أي مكتبة طرف ثالث:
python sshfinder.py 10.0.0.0/24 -p 22,2222 --pq-report
Post-quantum readiness:
1/3 service(s) negotiate post-quantum key exchange with a current client
[!] no PQ key exchange offered (1):
10.0.0.2:22
[!] pre-standard PQ only (1) - looks post-quantum but is not:
10.0.0.3:22
2 service(s) exposed to store-now-decrypt-later capture; upgrade to OpenSSH 9.0+
فئة pre-standard هي التي توقع الناس. خادم
يعلن عن [email protected] أو مسودة Kyber يبدو
ما بعد الكمومي في تفريغ الخوارزميات، لكن OpenSSH أسقط تلك المجموعة
المسحوبة في 2020 — لذلك لا يجد العميل الحالي أي طريقة مشتركة ويعود
إلى التشفير الكلاسيكي. إذا عُدّ جاهزًا، فسيكون أسوأ من عدم النظر
إلى الأمر إطلاقًا.
يصف التقرير مشكلة. السياسة تؤكد واحدة، ويمكن أن تفشل بناء:
python sshfinder.py 10.0.0.0/24 -p 22,2222 --policy baseline; echo "exit $?"
Policy 'baseline':
No password login, no Terrapin exposure, no weak algorithms.
1/3 service(s) pass
[FAIL] 1 service(s):
10.0.0.3:22
- password_auth: password login accepted: publickey, password
- terrapin: vulnerable to Terrapin (CVE-2023-48795)
- post_quantum (warn): post-quantum readiness is absent, ready required
[warn] 1 service(s):
10.0.0.2:22
- post_quantum (warn): post-quantum readiness is absent, ready required
exit 3
ثلاث سياسات مدمجة — baseline وstrict وpq — مسماة وفق
النتيجة التي تفرضها وليس لتوزيعة. تحمل القواعد خطورة fail أو
warn ويقرر --fail-on أيها يتحكم في البوابة، لذلك يمكن للفريق
اعتماد معيار أكثر صرامة كتحذير أولاً وترقيته لاحقًا دون تعديل أي شيء.
اكتب سياستك الخاصة كـ JSON:
{
"name": "house-rules",
"description": "What we expect of every SSH service.",
"rules": [
{"check": "password_auth", "severity": "fail"},
{"check": "terrapin", "severity": "fail"},
{"check": "post_quantum", "require": "ready", "severity": "warn"},
{"check": "forbid", "field": "ciphers",
"algorithms": ["3des-cbc", "arcfour"], "severity": "fail"},
{"check": "require", "field": "kex_algorithms",
"algorithms": ["curve25519-sha256"], "severity": "fail"}
]
}
الفحوصات: password_auth وterrapin وweak_algorithms وpost_quantum (مع
require: ready أوlegacy أوabsent) وforbid / require عبر
field من kex_algorithms أوhost_key_algorithms أوciphers أوmacs.
أي شيء آخر هو خطأ صارم عند تحميل السياسة، قبل بدء الفحص. بوابة تتخطى بصمت قاعدة لا تفهمها أسوأ من لا بوابة: يعمل التشغيل باللون الأخضر ولا يتعلم أحد أن الفحص لم يُنفَّذ أبدًا.
$ sshfinder 10.0.0.0/24 --policy house.json
sshfinder: error: rule 1: unknown check 'pasword_auth'
(known: forbid, password_auth, post_quantum, require, terrapin, weak_algorithms)
شغّله ليلاً مقابل تقرير الأمس وشاهد فقط ما تحرك:
# Nightly, in cron:
python sshfinder.py 10.0.0.0/24 -p 22,2222 --audit --json -o today.json
python sshfinder.py 10.0.0.0/24 -p 22,2222 --baseline yesterday.json \
--fail-on-drift
Baseline drift (vs yesterday.json):
[alert] 2 change(s):
10.0.0.5:22 SHA256:T/ZM4jO... -> SHA256:9aKm2Qx...; expected only after a rebuild or key rotation
10.0.0.3:22 password login is now accepted
[added] 1 change(s):
10.0.0.9:2222 new SSH service (SSH-2.0-OpenSSH_9.6)
[improved] 1 change(s):
10.0.0.7:22 post-quantum readiness rose from absent to ready