2049 - NFS Servisini Pentest Etme
Reading time: 9 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Temel Bilgiler
NFS, kullanıcıların dosyalara bir ağ üzerinden, bu dosyaların yerel bir dizinde bulunuyormuş gibi sorunsuz bir şekilde erişmelerini sağlayan istemci/sunucu için tasarlanmış bir sistemdir.
Varsayılan port: 2049/TCP/UDP (sadece versiyon 4 için, yalnızca TCP veya UDP gerektirir).
2049/tcp open nfs 2-3 (RPC #100003
Authentication
Bu protokolün dikkat çekici bir yönü, genellikle yerleşik authentication veya authorization mechanisms eksikliğidir. Bunun yerine, yetkilendirme dosya sistemi bilgilerine dayanır ve sunucu, istemci tarafından sağlanan kullanıcı bilgilerini dosya sisteminin gerektirdiği yetkilendirme formatına doğru bir şekilde çevirmekle görevlidir; bu genellikle UNIX syntax'ını takip eder.
Authentication genellikle UNIX UID
/GID
tanımlayıcıları ve grup üyeliklerine dayanır. Ancak, istemciler ve sunucular arasındaki UID
/GID
eşleştirmelerindeki potansiyel uyumsuzluk nedeniyle bir zorluk ortaya çıkar; bu durum sunucunun ek bir doğrulama yapmasına olanak tanımaz. Dahası, bu bilgiler istemci tarafından gönderilir ve sunucu tarafından güvenilir kabul edilir, bu nedenle kötü niyetli bir istemci, daha ayrıcalıklı uid
ve gid
'ler göndererek başka bir kullanıcıyı taklit edebilir.
Ancak, varsayılan olarak NFS kullanarak UID
0 (root) taklit etmek mümkün değildir. Bununla ilgili daha fazla bilgi squashing bölümünde bulunmaktadır.
Hosts
Daha iyi (veya bazı) yetkilendirme için, NFS paylaşımına erişebilecek hosts'ları belirtebilirsiniz. Bu, Linux'taki /etc/exports
dosyasında yapılabilir. Örneğin:
/PATH/TO/EXPORT CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share 192.168.2.123(rw,sec=krb5p:krb5i)
As you can see, it allows to configure a specific IP or hostname to access the share. Only that address will be able to access the share.
Versiyonlar
-
NFSv2: Bu versiyon, çeşitli sistemlerle geniş uyumluluğu ile tanınır ve başlangıçta çoğunlukla UDP üzerinden gerçekleştirilen işlemlerle önemini vurgular. Serinin en eski versiyonu olarak, gelecekteki gelişmeler için temel oluşturmuştur.
-
NFSv3: Bir dizi iyileştirme ile tanıtılan NFSv3, değişken dosya boyutlarını destekleyerek ve geliştirilmiş hata raporlama mekanizmaları sunarak selefinin üzerine çıkmıştır. Gelişmelerine rağmen, NFSv2 istemcileri ile tam geriye dönük uyumlulukta sınırlamalarla karşılaşmıştır.
-
NFSv4: NFS serisinde bir dönüm noktası olan NFSv4, ağlar üzerinden dosya paylaşımını modernize etmek için tasarlanmış bir dizi özellik sunmuştur. Dikkate değer iyileştirmeler arasında yüksek güvenlik için Kerberos entegrasyonu, güvenlik duvarlarını aşabilme yeteneği ve port haritalayıcılarına ihtiyaç duymadan İnternet üzerinden çalışabilme, Erişim Kontrol Listeleri (ACL'ler) desteği ve durum tabanlı işlemlerin tanıtımı bulunmaktadır. Performans iyileştirmeleri ve durumlu bir protokolün benimsenmesi, NFSv4'ü ağ dosya paylaşım teknolojilerinde önemli bir gelişme olarak ayırmaktadır.
-
Bir Linux ana bilgisayarının NFS'nin kerberos kimlik doğrulamasını desteklemesi çok garip bir durumdur.
Her NFS versiyonu, ağ ortamlarının gelişen ihtiyaçlarını karşılamak amacıyla geliştirilmiş, güvenlik, uyumluluk ve performansı kademeli olarak artırmıştır.
Squashing
Daha önce belirtildiği gibi, NFS genellikle istemcinin uid
ve gid
'sine dosyalara erişim için güvenmektedir (eğer kerberos kullanılmıyorsa). Ancak, sunucuda bu davranışı değiştirebilecek bazı yapılandırmalar vardır:
- all_squash: Tüm erişimleri her kullanıcı ve grubu
nobody
(65534 unsigned / -2 signed) olarak eşleştirerek sıkıştırır. Bu nedenle, herkesnobody
'dir ve kullanıcı kullanılmaz. - root_squash/no_all_squash: Bu, Linux'ta varsayılan olarak sadece uid 0 (root) ile erişimi sıkıştırır. Bu nedenle, herhangi bir
UID
veGID
güvenilir, ancak0
nobody
'ye sıkıştırılır (bu nedenle root taklidi mümkün değildir). - no_root_squash: Bu yapılandırma etkinleştirildiğinde, root kullanıcısını bile sıkıştırmaz. Bu, bu yapılandırma ile bir dizini bağlarsanız, root olarak erişebileceğiniz anlamına gelir.
Alt ağa kontrol
Sadece Linux'ta mevcuttur. man(5) exports der ki: "Bir dosya sisteminin bir alt dizini dışa aktarılmışsa, ancak tüm dosya sistemi değilse, her NFS isteği geldiğinde, sunucu yalnızca erişilen dosyanın uygun dosya sisteminde olduğunu kontrol etmekle kalmaz (bu kolaydır), aynı zamanda dışa aktarılan ağaçta olduğunu da kontrol etmelidir (bu daha zordur). Bu kontrol alt ağa kontrol olarak adlandırılır."
Linux'ta subtree_check
özelliği varsayılan olarak devre dışıdır.
Enumeration
Showmount
Bu, NFSv3 sunucusundan bilgi almak için kullanılabilir, örneğin exports listesini, bu dışa aktarımlara erişime izin verilen kişileri ve hangi istemcilerin bağlı olduğunu (bir istemci sunucuya haber vermeden bağlantıyı keserse bu bilgi yanlış olabilir). NFSv4 istemcileri doğrudan /export'a erişir ve oradan dışa aktarımlara erişmeye çalışır, geçersiz veya herhangi bir nedenle yetkisizse başarısız olur.
Eğer showmount
gibi araçlar veya Metasploit modülleri bir NFS portundan bilgi göstermiyorsa, bu muhtemelen versiyon 3'ü desteklemeyen bir NFSv4 sunucusudur.
showmount -e <IP>
Kullanışlı nmap betikleri
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
Kullanışlı metasploit modülleri
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
nfs_analyze
Bu araç https://github.com/hvs-consulting/nfs-security-tooling NFS sunucusundan mounts, desteklenen NFS sürümleri, bağlı IP'ler gibi birçok veri elde etmek için kullanılabilir ve hatta exports'tan diğer klasörlere kaçışın mümkün olup olmadığını veya no_root_squash
'ın etkin olup olmadığını kontrol edebilir.
Mounting
Sunucunun hangi klasörü sizin için mevcut olduğunu öğrenmek için ona şu şekilde sorabilirsiniz:
showmount -e <IP>
Sonra bunu kullanarak bağlayın:
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
Sürüm 2'yi kullanmalısınız çünkü herhangi bir kimlik doğrulama veya yetkilendirme içermez.
Örnek:
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
Saldırılar
UID ve GID'ye Güvenme
Tabii ki, burada tek sorun, varsayılan olarak root'u (UID
0) taklit etmenin mümkün olmamasıdır. Ancak, başka bir kullanıcıyı taklit etmek mümkündür veya no_root_squash
etkinse root'u da taklit edebilirsiniz.
- Eğer yalnızca bazı kullanıcılar tarafından erişilebilen dosyalar veya klasörler içeren bir klasörü bağlarsanız ( UID ile). O UID ile yerel olarak bir kullanıcı oluşturabilir ve o kullanıcıyı kullanarak dosya/klasöre erişebilirsiniz.
- https://github.com/hvs-consulting/nfs-security-tooling adresindeki
fuse_nfs
aracı, dosyalara erişmek için her zaman gerekli UID ve GID'yi gönderecektir.
SUID Yetki Yükseltme
Sayfayı kontrol edin:
NFS no_root_squash/no_all_squash misconfiguration PE
Dışa Aktarımlardan Kaçış
Bu harika makalede dışa aktarımlardan diğer klasörlere erişmek için kaçmanın mümkün olduğunu görebilirsiniz.
Bu nedenle, bir dışa aktarma, tüm dosya sisteminin bir alt klasörü olan bir klasörü dışa aktarıyorsa, subtree_check
devre dışı bırakıldığında dışa aktarmanın dışındaki dosyalara erişmek mümkündür. Ve bu, Linux'ta varsayılan olarak devre dışıdır.
Örneğin, bir NFS sunucusu /srv/
'yi dışa aktarıyorsa ve /var/
aynı dosya sistemindeyse, /var/log/
'dan günlükleri okumak veya /var/www/
'de bir webshell depolamak mümkündür.
Ayrıca, varsayılan olarak yalnızca root (0) kullanıcısının taklit edilmekten korunduğunu unutmayın (Squash bölümünü kontrol edin). Ancak, bir dosya root tarafından sahiplenilmişse ancak grup 0 değilse, ona erişmek mümkündür. Örneğin, /etc/shadow
dosyası root tarafından sahiplenilmiştir ancak grup shadow
'dır (Debian'da gid 42). Bu nedenle, varsayılan olarak okunabilir!
https://github.com/hvs-consulting/nfs-security-tooling adresindeki nfs_analyze
aracı, bu saldırıyı ext4, xfs, btrfs dosya sistemlerine karşı desteklemek için tasarlanmıştır, versiyon 3'te (v4'te de mümkün olmalıdır).
NSFShell
Dosyalara erişim sağlamak için UID ve GID'yi kolayca listelemek, bağlamak ve değiştirmek için nfsshell kullanabilirsiniz.
Konfigürasyon dosyaları
/etc/exports
/etc/lib/nfs/etab
Tehlikeli Ayarlar
-
Okuma ve Yazma İzinleri (
rw
): Bu ayar, dosya sisteminden hem okuma hem de yazma işlemlerine izin verir. Bu kadar geniş bir erişim izni vermenin sonuçlarını dikkate almak önemlidir. -
Güvensiz Portların Kullanımı (
insecure
): Bu etkinleştirildiğinde, sistemin 1024'ün üzerindeki portları kullanmasına izin verir. Bu aralıktaki portların güvenliği daha az katı olabilir ve riski artırabilir. -
İç İçe Dosya Sistemlerinin Görünürlüğü (
nohide
): Bu yapılandırma, başka bir dosya sistemi bir dışa aktarılmış dizinin altında monte edilse bile dizinlerin görünür olmasını sağlar. Her dizin, uygun yönetim için kendi dışa aktarma girişine ihtiyaç duyar. -
Kök Dosyalarının Sahipliği (
no_root_squash
): Bu ayar ile, kök kullanıcı tarafından oluşturulan dosyalar, en az ayrıcalık ilkesini göz ardı ederek, 0 olan orijinal UID/GID'sini korur ve potansiyel olarak aşırı izinler verebilir. -
Tüm Kullanıcıların Squash Edilmemesi (
no_all_squash
): Bu seçenek, kullanıcı kimliklerinin sistem genelinde korunmasını sağlar; bu da doğru bir şekilde ele alınmadığında izin ve erişim kontrol sorunlarına yol açabilir.
NFS Yanlış Yapılandırmaları ile Ayrıcalık Yükseltme
NFS no_root_squash ve no_all_squash ayrıcalık yükseltmesi
HackTricks Otomatik Komutlar
Protocol_Name: NFS #Protocol Abbreviation if there is one.
Port_Number: 2049 #Comma separated if there is more than one.
Protocol_Description: Network File System #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for NFS
Note: |
NFS is a system designed for client/server that enables users to seamlessly access files over a network as though these files were located within a local directory.
#apt install nfs-common
showmount 10.10.10.180 ~or~showmount -e 10.10.10.180
should show you available shares (example /home)
mount -t nfs -o ver=2 10.10.10.180:/home /mnt/
cd /mnt
nano into /etc/passwd and change the uid (probably 1000 or 1001) to match the owner of the files if you are not able to get in
https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html
Entry_2:
Name: Nmap
Description: Nmap with NFS Scripts
Command: nmap --script=nfs-ls.nse,nfs-showmount.nse,nfs-statfs.nse -p 2049 {IP}
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.