2049 - Pentesting NFS Service

Reading time: 13 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

基本信息

NFS 是一个为 客户端/服务器 设计的系统,使用户能够像访问本地目录中的文件一样,无缝地通过网络访问文件。

默认端口:2049/TCP/UDP(版本 4 除外,只需要 TCP 或 UDP)。

2049/tcp open  nfs     2-3 (RPC #100003

认证

该协议的一个显著特点是通常缺乏内置的 认证授权机制。相反,授权依赖于 文件系统信息,服务器负责将 客户端提供的用户信息 准确转换为文件系统所需的 授权格式,主要遵循 UNIX 语法

认证通常依赖于 UNIX UID/GID 标识符和组成员资格。然而,由于客户端和服务器之间可能存在 UID/GID 映射的不匹配, 这带来了挑战,使得服务器无法进行额外的验证。此外,这些细节由客户端发送并被服务器信任,因此恶意客户端可能会 **冒充其他用户,发送更高权限的 uidgid

然而,请注意,默认情况下,使用 NFS 无法冒充 UID 0(root)。更多内容请参见压缩部分。

主机

为了更好(或某种程度上)进行授权,您可以指定可以访问 NFS 共享的 主机。这可以在 Linux 的 /etc/exports 文件中完成。例如:

/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)

如您所见,它允许配置特定的 IP主机名 来访问共享。只有该地址才能访问共享。

版本

  • NFSv2:该版本因其与各种系统的广泛兼容性而受到认可,标志着其在最初操作主要通过 UDP 进行的重要性。作为系列中 最古老 的版本,它为未来的发展奠定了基础。

  • NFSv3:通过一系列增强功能引入,NFSv3 在其前身的基础上扩展,支持可变文件大小并提供改进的错误报告机制。尽管有了这些进步,但它在与 NFSv2 客户端的完全向后兼容性方面仍然存在局限性。

  • NFSv4:NFS 系列中的一个里程碑版本,NFSv4 提供了一套旨在现代化网络文件共享的功能。显著的改进包括集成 Kerberos 以实现 高安全性、能够穿越防火墙并在不需要端口映射器的情况下通过互联网操作、支持访问控制列表(ACL)以及引入基于状态的操作。其性能增强和状态协议的采用使 NFSv4 成为网络文件共享技术的重要进展。

  • 请注意,发现支持 kerberos 认证的 Linux 主机 NFS 是非常奇怪的。

每个版本的 NFS 都是为了满足网络环境不断变化的需求而开发的,逐步增强安全性、兼容性和性能。

压缩

如前所述,NFS 通常会信任客户端的 uidgid 来访问文件(如果未使用 kerberos)。然而,可以在服务器上设置一些配置以 更改此行为

  • all_squash:它将所有访问压缩,将每个用户和组映射到 nobody(65534 无符号 / -2 有符号)。因此,所有人都是 nobody,没有用户被使用。
  • root_squash/no_all_squash:这是 Linux 上的默认设置,仅压缩 uid 为 0(root)的访问。因此,任何 UIDGID 都是可信的,但 0 被压缩为 nobody(因此无法进行 root 冒充)。
  • no_root_squash:如果启用此配置,甚至不会压缩 root 用户。这意味着如果您以此配置挂载目录,您可以作为 root 访问它。

子树检查

仅在 Linux 上可用。man(5) exports 说:“如果导出了文件系统的子目录,但整个文件系统没有导出,那么每当 NFS 请求到达时,服务器必须检查访问的文件不仅在适当的文件系统中(这很简单),而且在导出的树中(这更难)。此检查称为子树检查。”

在 Linux 中,subtree_check 功能默认是禁用的

枚举

Showmount

这可以用来 获取 NFSv3 服务器的信息,例如 导出 列表、谁被 允许访问 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不

bash
showmount -e <IP>

有用的 nmap 脚本

bash
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share

有用的metasploit模块

bash
scanner/nfs/nfsmount #Scan NFS mounts and list permissions

nfs_analyze

这个工具来自 https://github.com/hvs-consulting/nfs-security-tooling,可以用来从 NFS 服务器获取大量数据,如 挂载点、支持的 NFS 版本、连接的 IP,甚至可以检查是否可以 从导出中逃逸 到文件系统中的其他文件夹或 是否启用了 no_root_squash

Mounting

要知道服务器 可用哪个文件夹 供你挂载,你可以使用以下命令:

bash
showmount -e <IP>

然后使用以下命令挂载它:

bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock

您应该指定使用版本 2,因为它没有任何****身份验证授权

示例:

bash
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock

攻击

信任 UID 和 GID

当然,这里唯一的问题是默认情况下无法模拟 root (UID 0)。但是,可以模拟任何其他用户,或者如果启用了 no_root_squash,您也可以模拟 root。

  • 如果您挂载一个仅可由某些用户(通过 UID)访问的 文件或文件夹。您可以 在本地 创建一个具有该 UID 的用户,并使用该 用户访问 文件/文件夹。
  • 工具 fuse_nfs 来自 https://github.com/hvs-consulting/nfs-security-tooling,基本上会始终发送访问文件所需的 UID 和 GID。

SUID 权限提升

查看页面:

NFS no_root_squash/no_all_squash misconfiguration PE

从导出中逃逸

在这篇 精彩的文章 中,可以看到可以 从导出中逃逸以访问文件系统中的其他文件夹

因此,如果一个导出正在导出一个是 整个文件系统子文件夹,如果 subtree_check 被禁用,则可以访问导出之外的文件。而在 Linux 中,默认情况下是禁用的

例如,如果一个 NFS 服务器正在导出 /srv/,而 /var/ 在同一文件系统中,则可以从 /var/log/ 读取日志或在 /var/www/ 中存储 webshell。

此外,请注意,默认情况下只有 root (0) 用户受到保护,无法被模拟(查看 Squash 部分)。但是,如果一个文件是 由 root 拥有但组不是 0,则可以访问它。例如,文件 /etc/shadow 是由 root 拥有,但组是 shadow(在 Debian 上的 gid 42)。因此,默认情况下可以读取它!

工具 nfs_analyze 来自 https://github.com/hvs-consulting/nfs-security-tooling 是为了支持针对 ext4、xfs、btrfs 文件系统的此攻击而构建的,版本为 3(在 v4 中也应该可行)。

NSFShell

要轻松列出、挂载和更改 UID 和 GID 以访问文件,您可以使用 nfsshell

很好的 NFSShell 教程。

配置文件

/etc/exports
/etc/lib/nfs/etab

危险设置

  • 读写权限 (rw): 此设置允许对文件系统进行读取和写入。授予如此广泛的访问权限时,必须考虑其影响。

  • 使用不安全端口 (insecure): 启用后,系统可以使用1024以上的端口。此范围以上的端口安全性可能较低,增加风险。

  • 嵌套文件系统的可见性 (nohide): 此配置使目录可见,即使在导出目录下挂载了另一个文件系统。每个目录需要自己的导出条目以便于管理。

  • 根文件所有权 (no_root_squash): 使用此设置,根用户创建的文件保持其原始UID/GID为0,忽视最小权限原则,可能授予过多权限。

  • 不压缩所有用户 (no_all_squash): 此选项确保用户身份在系统中得以保留,如果处理不当,可能导致权限和访问控制问题。

利用NFS错误配置进行权限提升

NFS no_root_squash和no_all_squash权限提升

HackTricks自动命令

Protocol_Name: NFS    #Protocol Abbreviation if there is one.
Port_Number:  2049     #Comma separated if there is more than one.
Protocol_Description: Network File System         #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for NFS
Note: |
NFS is a system designed for client/server that enables users to seamlessly access files over a network as though these files were located within a local directory.

#apt install nfs-common
showmount 10.10.10.180      ~or~showmount -e 10.10.10.180
should show you available shares (example /home)

mount -t nfs -o ver=2 10.10.10.180:/home /mnt/
cd /mnt
nano into /etc/passwd and change the uid (probably 1000 or 1001) to match the owner of the files if you are not able to get in

https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html

Entry_2:
Name: Nmap
Description: Nmap with NFS Scripts
Command: nmap --script=nfs-ls.nse,nfs-showmount.nse,nfs-statfs.nse -p 2049 {IP}

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks