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

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, herkes nobody'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 ve GID güvenilir, ancak 0 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.

bash
showmount -e <IP>

Kullanışlı nmap betikleri

bash
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

bash
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:

bash
showmount -e <IP>

Sonra bunu kullanarak bağlayın:

bash
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:

bash
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.

Güzel NFSShell eğitimi.

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