mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
178 lines
9.7 KiB
Markdown
178 lines
9.7 KiB
Markdown
# 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 <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}}
|