# 2049 - Pentesting NFS Service {{#include ../banners/hacktricks-training.md}} ## **基本信息** **NFS** 是一个为 **客户端/服务器** 设计的系统,使用户能够像访问本地目录中的文件一样,无缝地通过网络访问文件。 **默认端口**:2049/TCP/UDP(版本 4 除外,只需要 TCP 或 UDP)。 ``` 2049/tcp open nfs 2-3 (RPC #100003 ``` ### 认证 该协议的一个显著特点是通常缺乏内置的 **认证** 或 **授权机制**。相反,授权依赖于 **文件系统信息**,服务器负责将 **客户端提供的用户信息** 准确转换为文件系统所需的 **授权格式**,主要遵循 **UNIX 语法**。 认证通常依赖于 **UNIX `UID`/`GID` 标识符和组成员资格**。然而,由于客户端和服务器之间可能存在 **`UID`/`GID` 映射的不匹配,** 这带来了挑战,使得服务器无法进行额外的验证。此外,这些细节由客户端发送并被服务器信任,因此恶意客户端可能会 **冒充其他用户,发送更高权限的 `uid` 和 `gid`。 **然而,请注意,默认情况下,使用 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 通常会信任客户端的 `uid` 和 `gid` 来访问文件(如果未使用 kerberos)。然而,可以在服务器上设置一些配置以 **更改此行为**: - **all_squash**:它将所有访问压缩,将每个用户和组映射到 **`nobody`**(65534 无符号 / -2 有符号)。因此,所有人都是 `nobody`,没有用户被使用。 - **root_squash/no_all_squash**:这是 Linux 上的默认设置,**仅压缩 uid 为 0(root)的访问**。因此,任何 `UID` 和 `GID` 都是可信的,但 `0` 被压缩为 `nobody`(因此无法进行 root 冒充)。 - **no_root_squash**:如果启用此配置,甚至不会压缩 root 用户。这意味着如果您以此配置挂载目录,您可以作为 root 访问它。 ### 子树检查 仅在 Linux 上可用。man(5) exports 说:“如果导出了文件系统的子目录,但整个文件系统没有导出,那么每当 NFS 请求到达时,服务器必须检查访问的文件不仅在适当的文件系统中(这很简单),而且在导出的树中(这更难)。此检查称为子树检查。” 在 Linux 中,**`subtree_check` 功能默认是禁用的**。 ## 枚举 ### Showmount 这可以用来 **获取 NFSv3 服务器的信息**,例如 **导出** 列表、谁被 **允许访问** 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不 ```bash showmount -e ``` ### 有用的 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](https://github.com/hvs-consulting/nfs-security-tooling),可以用来从 NFS 服务器获取大量数据,如 **挂载点**、支持的 NFS 版本、连接的 IP,甚至可以检查是否可以 **从导出中逃逸** 到文件系统中的其他文件夹或 **是否启用了 `no_root_squash`**。 ## Mounting 要知道服务器 **可用** 的 **哪个文件夹** 供你挂载,你可以使用以下命令: ```bash showmount -e ``` 然后使用以下命令挂载它: ```bash mount -t nfs [-o vers=2] : -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](https://github.com/hvs-consulting/nfs-security-tooling),基本上会始终发送访问文件所需的 UID 和 GID。 ### SUID 权限提升 查看页面: {{#ref}} ../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md {{#endref}} ### 从导出中逃逸 在这篇 [精彩的文章](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) 中,可以看到可以 **从导出中逃逸以访问文件系统中的其他文件夹**。 因此,如果一个导出正在导出一个是 **整个文件系统** 的 **子文件夹**,如果 **`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](https://github.com/hvs-consulting/nfs-security-tooling) 是为了支持针对 ext4、xfs、btrfs 文件系统的此攻击而构建的,版本为 3(在 v4 中也应该可行)。 ### NSFShell 要轻松列出、挂载和更改 UID 和 GID 以访问文件,您可以使用 [nfsshell](https://github.com/NetDirect/nfsshell)。 [很好的 NFSShell 教程。](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/) ## 配置文件 ``` /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权限提升](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md) ## 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} ``` {{#include ../banners/hacktricks-training.md}}