0x00 前置知识
NFS全称为Network File System,翻译过来是网络文件系统。它可以通过网络共享目录和文件给其他人。通过使用NFS,用户基本上可以像访问本地文件一样顺便访问到共享目录/文件,这种技术也被称为挂载。当然只是能访问一部分不能全部都不访问。
这里在稍微讲一下它的运行过程。首先,客户端会在本地对远程服务器发起一个请求,请求挂载某个文件夹到本地。然后挂载服务就会开始运行,服务器这边会先检查发起请求的用户是否具有权限去挂载某个目录/文件。一切顺利的话,服务器会返回一个文件句柄(这是用来标记服务器上每个文件/目录类似给它们打上一个ID)。
当两边互相验证完以后就可以开始访问远程文件了。此时会对服务器上的NFSD(NFS守护程序)进行RPC调用。调用会有以下参数:
File handle(文件句柄)
The name of the file to be accessed(要访问的文件名)
The users',user ID(用户和其ID)
The user's group ID(用户组ID)
这些用于确定对指定文件的访问全选。这是控制用户权限的东西,即文件的读写。
0x01NFS服务配置
服务端配置:(server)
配置一般存放于/etc/exports文件或/etc/dfs/dfstab中
这是一个NFS共享目录的配置,其中/home/toor是共享目录的路径192.168.152.0/24 是允许访问该共享目录的客户端IP地址范围。rw、sync 和 no_subtree_check是NFS共享的选项。
各个参数的含义如下:
·/home/toor:共享目录的路径。
·192.168.152.0/24:允许访问该共享目录的客户端IP地址范围。
·rw:表示将共享目录以读写模式挂载到客户端上,客户端可以对该目录进行读取和写入操作。
·sync:表示 NFS 服务器必须等待,直到所有数据都被写入磁盘才会响应客户端的请求。
·no_subtree_check:表示忽略子目录的权限检查。默认情况下,NFS会检查共享目录下的每个子目录是否有访问权限,但这样会影响性能,因此在某些情况下可以禁用该功能。(详细解释见下文)
exportfs -s 查看 nfs 服务已加载的配置情况。
修改 /etc/exports 文件不会自动应用到当前 nfs,需要通过 exportfs -rv 重载。
root_squash 是默认选项,root 用户会被映射成匿名用户,即客户端的 UID 与 GID 都会变成 nobody 用户的 UID 和 GID。(详细解释见下文)
no_root_squash 选项,root 用户不会被映射成匿名用户。(详细解释见下文)
客户端挂载:(client)
client查看共享目录,将共享目录挂载到客户端上
权限问题
当您在客户端挂载NFS共享时,如果client报告的UID(用户ID)与server上的UID不一致,则可能会导致权限问题。
解决这个问题的一种方法是在客户端挂载NFS共享时使用“-o uid=xxx”选项,其中xxx是您希望在客户端使用的UID。例如:
mount -t nfs -o uid=1000 server:/path /mnt
如果您在服务器上有相应的用户帐户,并且希望使用它的权限,则可以使用“-o username=xxx”选项:
mount -t nfs -o username=user server:/path /mnt
请确保在挂载NFS共享之前您有足够的权限执行此操作。
或者通过修改配置
root_squash
默认配置为root_squash,客户端访问出错,无读取无写权限,无法进入
修改共享目录所有者及组,客户端就有权利进行读,写。
具体操作步骤如下
no_root_squash
配置设置为no_root_squash 选项,root 用户不会被映射成匿名用户,表示允许 root 用户在客户端上具有与远程服务器上相同的权限可读可写
配置no_subtree_check
当前默认为root_squash,更改为nobody为所有者和nogroup组
创建文件夹为root所有者及组
client下子目录不进行权限检查
0x02 NFS服务安全配置分析
在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。如今NFS具备了防止被利用导出文件夹的功能,但遗留系统中的NFS服务配置不当,则仍可能遭到恶意攻击者的利用,甚至获取shell。
1.在服务端系统缺省的情况下,export目录时,如果不指定只读,该目录为可写;NFS的访问控制文件很容易出现错误配置,很多情况下配置为可以被网上任何一台机器访问,远程用户可以用这条命令来查到是否有NFS的配置漏洞。造成未授权读写等。
nmap发现服务,showmount检索信息,或者使用MSF模块
showmount -e domain/ip
auxiliary/scanner/nfs/nfsmount
2.在客户端的NFS请求中的用户认证,是由用户的UID和所属组的GID组成,但NFS服务器不管这个UID是不是自己服务端的,只要UID符合,就赋予这个用户相应的操作权。在此过程中攻击者可以用root设置对应的UID,再去挂载就可以获得文件操作权。
具体操作步骤如下:
由于该文件的UID与新用户的UID相同,因此系统会误认为这是文件权限的所有者,这样我们就可以以一个合法的用户身份来读取文件的内容了。
之所以造成这种问题,原因在于导出文件夹并未设置root_squash选项。root_squash登入NFS主机,使用该共享目录时相当于该目录的拥有者。但是如果是以root身份使用这个共享目录的时候,那么这个使用者(root)的权限将被压缩成为匿名使用者,即通常他的UID与GID都会变成nobody那个身份,以防止越权访问。
还有一种UID欺骗,是关于16位UID和32位UID的问题。大多NFS服务接受的来自客户对NFS请求所发送的UID标志都是16位的(Solaris是一个例外),这是不安全的。
3.以前的文件句柄无须mount守护进程的帮助就可以构造,使客户直接可以和NFS通信。而现在的系统大多进行了改进。但BSD系统还有问题。未授权用户可以得到文件的句柄。正确的程序应该只允许这些信息暴露给root。
4.把含有SUID程序的目录export,并且该文件有执行权。SUID程序相当于超级用户本身。可直接获得超级用户身份shell
0x03 NFS服务防护
1.修改配置文件,export出的文件系统设置为只读,严格限制client的IP。
2.禁止有SUID特性的程序的执行。
3.使用AFS服务取代
参考链接:
https://adoyle.me/Today-I-Learned/others/nfs.html
https://blog.csdn.net/cnbird2008/article/details/1878074
原文始发于微信公众号(Crystal Equation):NFS服务攻防
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论