hacktricks/src/network-services-pentesting/nfs-service-pentesting.md

178 lines
9.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 0root。更多内容请参见压缩部分。**
#### 主机
为了更好(或某种程度上)进行授权,您可以指定可以访问 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 为 0root的访问**。因此,任何 `UID``GID` 都是可信的,但 `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](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](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}}