نظرة عامة
ما هو SNMP؟
Simple Network Management Protocol — بروتوكول لمراقبة وإدارة أجهزة الشبكة عن بعد. يشمل: routers, switches, servers, IoT devices. يختلف عن SSH في إنه يراقب مئات الأجهزة دفعة وحدة بدون تدخل يدوي.
SNMP vs SSH
SSH: تدخل على جهاز واحد وتشغّل أوامر يدوياً
SNMP: تراقب وتدير مئات الأجهزة من مكان واحد تلقائياً
🔌 Ports
UDP 161 — Requests
أنت تسأل → الجهاز يجاوب (pull)
UDP 162 — Traps
الجهاز يرسل تنبيه تلقائياً (push)
💡 SNMP يستخدم UDP لأنه أسرع وأخف — مراقبة مئات الأجهزة بدون TCP overhead
🔑 Community String — كلمة المرور البسيطة
Community String = باسورد بسيط للوصول للمعلومات. يمشي clear-text على الشبكة!
ro = Read Only
rocommunity public
قراءة المعلومات فقط
rw = Read + Write 💀
rwcommunity public
قراءة + تعديل الإعدادات!
⚠️ "public" هو الـ Community String الافتراضي — كثير admins ما يغيرونه!
MIB & OID
📚 MIB — Management Information Base
قاموس موحد لكل الأجهزة — يضمن إن Cisco, HP, Dell, Linux, Windows كلهم يتكلمون نفس اللغة مع SNMP.
💡 MIB = كتاب الهاتف. OID = رقم الهاتف. تعرف الرقم → توصل للمعلومة على أي جهاز في العالم!
🔢 OID — Object Identifier
عنوان رقمي ثابت وموحد لكل معلومة — شجرة هرمية مثل مسارات الملفات:
# كل المعلومات تحت نفس "المجلد":
1.3.6.1.2.1.1.* ← System Information
1.3.6.1.2.1.1.1.0 = sysDescr ← وصف النظام + OS version
1.3.6.1.2.1.1.3.0 = sysUpTime ← وقت التشغيل
1.3.6.1.2.1.1.4.0 = sysContact ← إيميل المسؤول 🎯
1.3.6.1.2.1.1.5.0 = sysName ← اسم الجهاز
1.3.6.1.2.1.1.6.0 = sysLocation ← الموقع
1.3.6.1.2.1.25.6.* ← Installed Software ← packages مثبتة 🎯
1.3.6.1.2.1.25.4.* ← Running Processes ← processes شغّالة
1.3.6.1.2.1.2.* ← Network Interfaces ← الشبكة
🎯 من OID واحد تعرف: email المسؤول = username + كل software = CVEs محتملة!
📊 مثال من snmpwalk حقيقي
iso.3.6.1.2.1.1.1.0 = STRING: "Linux htb 5.11.0-34-generic x86_64"
iso.3.6.1.2.1.1.4.0 = STRING: "mrb3n@inlanefreight.htb" ← username!
iso.3.6.1.2.1.1.5.0 = STRING: "htb"
iso.3.6.1.2.1.1.6.0 = STRING: "Sitting on the Dock of the Bay"
# Software مثبت:
iso.3.6.1.2.1.25.6.3.1.2.1235 = STRING: "proftpd-basic_1.3.6c" ← FTP!
iso.3.6.1.2.1.25.6.3.1.2.1243 = STRING: "python3_3.8.2"
iso.3.6.1.2.1.25.6.3.1.2.1234 = STRING: "procps_2:3.3.16"
🎯 mrb3n@inlanefreight.htb = username للـ brute force على كل الخدمات! proftpd = FTP server مثبت = هدف جديد!
إصدارات SNMP
📋 المقارنة الكاملة
| الإصدار | Authentication | تشفير | الخطر |
|---|---|---|---|
| SNMPv1 | لا يوجد! | لا — clear-text | أي شخص يقرأ ويعدل |
| SNMPv2c | Community String فقط | لا — clear-text | String قابل للـ sniffing |
| SNMPv3 | username + password ✅ | نعم — pre-shared key ✅ | الأأمن — بس أصعب إعداد |
⚠️ كثير شركات لا تزال على v2c لأن التحديث لـ v3 معقد ويحتاج خبرة وتغيير مئات الأجهزة!
⚡ Traps — Port 162
Port 161 — Pull (عادي)
أنت تسأل → الجهاز يجاوب
"إيش CPU usage؟" → "45%"
"إيش CPU usage؟" → "45%"
Port 162 — Push (Traps)
الجهاز يرسل تلقائياً بدون طلب
"تنبيه: CPU وصل 95%!"
"تنبيه: خلل في الشبكة!"
"تنبيه: CPU وصل 95%!"
"تنبيه: خلل في الشبكة!"
الإعدادات — snmpd.conf
ملف الإعداد الافتراضي
cat /etc/snmp/snmpd.conf | grep -v "#" | sed -r '/^\s*$/d'
sysLocation Sitting on the Dock of the Bay
sysContact Me <me@example.org>
sysServices 72
master agentx
agentaddress 127.0.0.1,[::1]
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
rocommunity public default -V systemonly ← قراءة فقط ✅
rocommunity6 public default -V systemonly ← IPv6
rouser authPrivUser authpriv -V systemonly ← SNMPv3 user
💡 -V systemonly = محدود لمعلومات النظام الأساسية فقط — هاد نسبياً آمن
📋 شرح الإعدادات
| الإعداد | الوظيفة |
|---|---|
| sysLocation | موقع الجهاز — يظهر في SNMP queries |
| sysContact | إيميل المسؤول — مهم في الـ pentest! |
| agentaddress | على أي IP يستمع SNMP |
| rocommunity | قراءة فقط بـ Community String |
| rwcommunity | قراءة + كتابة — خطير! |
| -V systemonly | تحديد الـ OIDs المتاحة |
Dangerous Settings
💀 الإعدادات الخطيرة
| الإعداد | الخطر |
|---|---|
| rwuser noauth | وصول كامل للـ OID tree بدون authentication! |
| rwcommunity public 0.0.0.0 | قراءة + كتابة من أي IP في العالم! |
| rwcommunity6 public :: | نفس الخطر على IPv6 |
💥 ليش rw خطير جداً؟
rwcommunity public 0.0.0.0 مفعّل
↓
تغيير routing tables على الـ router
↓
تغيير الـ Community String
↓
تعطيل الجهاز بالكامل
↓
تحكم كامل بالشبكة 💥
الأدوات
اختر الأداة:
snmpwalk
onesixtyone
braa
🚶 snmpwalk — الأشمل
يمشي على كل الـ OID tree ويطلع كل المعلومات المتاحة:
snmpwalk -v2c -c public 10.129.14.128
# النتيجة:
iso.3.6.1.2.1.1.1.0 = "Linux htb 5.11.0-34-generic x86_64"
iso.3.6.1.2.1.1.4.0 = "mrb3n@inlanefreight.htb" ← email المسؤول!
iso.3.6.1.2.1.1.5.0 = "htb"
iso.3.6.1.2.1.25.6.3.1.2.1235 = "proftpd-basic_1.3.6c" ← FTP installed!
iso.3.6.1.2.1.25.6.3.1.2.1243 = "python3_3.8.2"
💡 Flags:
-v2c = إصدار SNMPv2c
-c public = Community String
-v2c = إصدار SNMPv2c
-c public = Community String
🔍 onesixtyone — Brute Force Community String
لو ما تعرف الـ Community String — جرب قائمة:
التثبيت:
sudo apt install onesixtyone
الاستخدام:
onesixtyone -c /opt/useful/seclists/Discovery/SNMP/snmp.txt 10.129.14.128
Scanning 1 hosts, 3220 communities
10.129.14.128 [public] Linux htb 5.11.0-37-generic
^^^^^^^^
لاقى Community String = "public"!
✅ لاقيت الـ Community String → هلأ استخدم snmpwalk أو braa
⚡ braa — أسرع من snmpwalk
بعد ما تعرف الـ Community String — يجيب المعلومات بشكل مختصر وأسرع:
التثبيت:
sudo apt install braa
الاستخدام:
# Syntax:
braa <community string>@<IP>:.1.3.6.*
# مثال:
braa public@10.129.14.128:.1.3.6.*
10.129.14.128:20ms:.1.3.6.1.2.1.1.1.0:Linux htb 5.11.0-34-generic x86_64
10.129.14.128:20ms:.1.3.6.1.2.1.1.4.0:mrb3n@inlanefreight.htb
10.129.14.128:20ms:.1.3.6.1.2.1.1.5.0:htb
10.129.14.128:20ms:.1.3.6.1.2.1.1.6.0:US
💡 braa أسرع من snmpwalk — مناسب لو عندك أجهزة كثيرة تفحصها
📊 ترتيب استخدام الأدوات
onesixtyone
اكتشف Community String
→
snmpwalk
كل المعلومات شامل
→
braa
سريع على أجهزة كثيرة
Methodology
⛓️ خطوات الـ SNMP Footprinting
1
Nmap — اكتشاف SNMP
تحقق إذا SNMP مفتوح
sudo nmap -sU -p161 TARGET
💡 -sU = UDP scan (SNMP يشتغل على UDP)
2
onesixtyone — اكتشاف Community String
جرب "public" أول، لو ما شتغل استخدم wordlist
onesixtyone -c /opt/useful/seclists/Discovery/SNMP/snmp.txt TARGET
3
snmpwalk — جمع كل المعلومات
بعد ما تعرف الـ Community String
snmpwalk -v2c -c public TARGET
🎯 ابحث عن:
• sysContact = email المسؤول = username
• Installed packages = CVEs محتملة
• Running processes = خدمات مثبتة
• sysContact = email المسؤول = username
• Installed packages = CVEs محتملة
• Running processes = خدمات مثبتة
4
تحقق من rw access
لو rwcommunity مفعّل = تحكم بالجهاز!
snmpwalk -v2c -c private TARGET
# جرب "private" كـ rw community string
Explained — Q&A
🌐 الأساسيات
إيش الفرق بين SNMP وSSH؟
SSH = تدخل على جهاز واحد وتشغّل أوامر يدوياً. SNMP = تراقب وتدير مئات الأجهزة من مكان واحد تلقائياً. مسؤول الشبكة بدل ما يدخل SSH على 100 جهاز، يفتح برنامج SNMP واحد يشوف كلهم.
ليش SNMP يستخدم UDP بدل TCP؟
لأنه أسرع وأخف. SNMP يراقب مئات الأجهزة — لو TCP كل جهاز يحتاج handshake = overhead ضخم. كمان لو packet تنبيه ضاعت، ما مهم — الـ packet الجاية راح تقول نفس الشيء أو أسوأ.
🔢 MIB و OID
هل أرقام OID تختلف بين Cisco وLinux؟
لا — الأرقام ثابتة وموحدة على كل الأجهزة! 1.3.6.1.2.1.1.4.0 = sysContact على Cisco وLinux وWindows. هاد هو هدف MIB — معيار عالمي موحد. الاستثناء: 1.3.6.1.4.1.* = أرقام خاصة بكل شركة.
🔑 Community String
ليش "public" خطير كـ Community String؟
لأنه الافتراضي على معظم الأجهزة وكثير admins ما يغيرونه. كمان يمشي clear-text على الشبكة — أي sniffing يكشفه. snmpwalk -v2c -c public TARGET = تقرأ كل معلومات الجهاز بدون أي باسورد حقيقي!
إيش الفرق بين ro وrw؟
ro = read only: تقرأ المعلومات فقط. rw = read write: تقرأ وتعدّل إعدادات الجهاز! لو rwcommunity مفعّل تقدر تغير routing tables، تعطّل الجهاز، تغير الـ community string نفسه = تحكم كامل بالشبكة.