Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash

This commit is contained in:
Translator 2025-02-05 09:39:24 +00:00
parent 5d27f949f5
commit 78ad6b7afc
2 changed files with 35 additions and 38 deletions

View File

@ -1,28 +1,28 @@
{{#include ../../banners/hacktricks-training.md}}
# Squashing Basic Info
# Squashing 基本信息
NFS 通常(特别是在 Linux 中)会信任连接到文件的客户端指定`uid``gid`(如果未使用 kerberos。然而服务器上可以设置一些配置来**改变这种行为**
NFS 通常(特别是在 Linux 中)会信任连接到文件的客户端所指示`uid``gid`(如果未使用 kerberos。然而服务器上可以设置一些配置来 **改变这种行为**
- **`all_squash`**:它会将所有访问映射到**`nobody`**65534 无符号 / -2 有符号)。因此,所有人都是 `nobody`,没有用户被使用。
- **`all_squash`**:它会将所有访问映射到 **`nobody`**65534 无符号 / -2 有符号)。因此,所有人都是 `nobody`,没有用户被使用。
- **`root_squash`/`no_all_squash`**:这是 Linux 的默认设置,**仅对 uid 0root进行压缩**。因此,任何 `UID``GID` 都被信任,但 `0` 被压缩为 `nobody`(因此无法进行 root 冒充)。
- **`no_root_squash`**:如果启用此配置,甚至不会压缩 root 用户。这意味着如果你以此配置挂载一个目录,你可以作为 root 访问它。
**/etc/exports** 文件中,如果你发现某个目录被配置为 **no_root_squash**,那么你可以**作为客户端访问**它,并**像本地机器的 root 一样在该目录中写入**。
**/etc/exports** 文件中,如果你发现某个目录被配置为 **no_root_squash**,那么你可以 **作为客户端访问** 它,并 **像本地机器的 root 一样在** 该目录中 **写入**
有关 **NFS** 的更多信息,请查看:
{{#ref}}
/network-services-pentesting/nfs-service-pentesting.md
../../network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
# Privilege Escalation
# 权限提升
## Remote Exploit
## 远程利用
选项 1 使用 bash
- **在客户端机器上挂载该目录**,并**作为 root 复制** `/bin/bash` 二进制文件到挂载文件夹中,并赋予其 **SUID** 权限,然后**从受害者**机器执行该 bash 二进制文件。
- 请注意,要在 NFS 共享中成为 root**`no_root_squash`** 必须在服务器上配置
- **在客户端机器上挂载该目录**,并 **作为 root 复制** `/bin/bash` 二进制文件到挂载文件夹中,并赋予其 **SUID** 权限,然后 **从受害者** 机器执行该 bash 二进制文件。
- 请注意,要在 NFS 共享中成为 root必须在服务器上配置 **`no_root_squash`**。
- 然而,如果未启用,你可以通过将二进制文件复制到 NFS 共享并以你想要提升的用户身份赋予 SUID 权限来提升到其他用户。
```bash
#Attacker, as root user
@ -37,7 +37,7 @@ cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
选项 2 使用 C 编译代码:
- **在客户端机器上挂载该目录**,并 **以 root 身份复制** 我们的编译好的有效载荷到挂载文件夹中,该有效载荷将滥用 SUID 权限,赋予其 **SUID** 权限,并 **从受害者** 机器执行该二进制文件(您可以在这里找到一些 [C SUID 有效载荷](payloads-to-execute.md#c))。
- **在客户端机器上挂载该目录**,并 **以 root 身份复制** 我们的编译有效载荷到挂载文件夹中,该有效载荷将滥用 SUID 权限,赋予其 **SUID** 权限,并 **从受害者** 机器执行该二进制文件(您可以在这里找到一些 [C SUID payloads](payloads-to-execute.md#c))。
- 与之前相同的限制
```bash
#Attacker, as root user
@ -62,11 +62,11 @@ cd <SHAREDD_FOLDER>
## Basic Information
该场景涉及在本地机器上利用挂载的NFS共享利用NFSv3规范中的一个缺陷该缺陷允许客户端指定其uid/gid可能导致未经授权的访问。利用涉及使用[libnfs](https://github.com/sahlberg/libnfs)这是一个允许伪造NFS RPC调用的库。
该场景涉及利用本地机器上挂载的NFS共享利用NFSv3规范中的一个缺陷该缺陷允许客户端指定其uid/gid可能导致未经授权的访问。利用涉及使用[libnfs](https://github.com/sahlberg/libnfs)这是一个允许伪造NFS RPC调用的库。
### Compiling the Library
库的编译步骤可能需要根据内核版本进行调整。在这特定情况下fallocate系统调用被注释掉。编译过程涉及以下命令
库的编译步骤可能需要根据内核版本进行调整。在这特定情况下fallocate系统调用被注释掉。编译过程涉及以下命令
```bash
./bootstrap
./configure
@ -116,7 +116,7 @@ uid = get_file_uid(filepath)
os.setreuid(uid, uid)
os.system(' '.join(sys.argv[1:]))
```
运行如下
像这样运行:
```bash
# ll ./mount/
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old

View File

@ -4,7 +4,7 @@
## **基本信息**
**NFS** 是一个为 **客户端/服务器** 设计的系统,使用户能够像访问本地目录中的文件一样,无缝访问网络上的文件。
**NFS** 是一个为 **客户端/服务器** 设计的系统,使用户能够像访问本地目录中的文件一样,无缝地通过网络访问文件。
**默认端口**2049/TCP/UDP版本 4 除外,只需要 TCP 或 UDP
```
@ -14,9 +14,9 @@
该协议的一个显著特点是通常缺乏内置的 **认证****授权机制**。相反,授权依赖于 **文件系统信息**,服务器负责将 **客户端提供的用户信息** 准确转换为文件系统所需的 **授权格式**,主要遵循 **UNIX 语法**
认证通常依赖于 **UNIX `UID`/`GID` 标识符和组成员资格**。然而,由于客户端和服务器之间可能存在 **`UID`/`GID` 映射的不匹配,** 这带来了挑战,服务器无法进行额外的验证。此外,这些细节由客户端发送并被服务器信任,因此恶意客户端可能会 **冒充其他用户,发送更高权限的 `uid``gid`**
认证通常依赖于 **UNIX `UID`/`GID` 标识符和组成员资格**。然而,由于客户端和服务器之间可能存在 **`UID`/`GID` 映射的不匹配,** 这带来了挑战,使得服务器无法进行额外的验证。此外,这些细节由客户端发送并被服务器信任,因此恶意客户端可能会 **冒充其他用户,发送更高权限的 `uid``gid`
**然而,请注意,默认情况下,使用 NFS 无法冒充 `UID` 0root有关更多信息,请参见压缩部分。**
**然而,请注意,默认情况下,使用 NFS 无法冒充 `UID` 0root更多内容请参见压缩部分。**
#### 主机
@ -25,30 +25,30 @@
/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)
```
如您所见,它允许配置特定的 **IP****主机名** 来访问共享。只有该地址能访问共享。
如您所见,它允许配置特定的 **IP****主机名** 来访问共享。只有该地址能访问共享。
### 版本
- **NFSv2**:该版本因其与各种系统的广泛兼容性而受到认可,标志着其在最初操作主要通过 UDP 的重要性。作为系列中 **最古老** 的版本,它为未来的发展奠定了基础。
- **NFSv2**:该版本因其与各种系统的广泛兼容性而受到认可,标志着其在最初操作主要通过 UDP 进行的重要性。作为系列中 **最古老** 的版本,它为未来的发展奠定了基础。
- **NFSv3**通过一系列增强功能引入NFSv3 在其前身的基础上扩展,支持可变文件大小并提供改进的错误报告机制。尽管有了进步,但它在与 NFSv2 客户端的完全向后兼容性方面仍然存在局限。
- **NFSv3**通过一系列增强功能引入NFSv3 在其前身的基础上扩展,支持可变文件大小并提供改进的错误报告机制。尽管有了这些进步,但它在与 NFSv2 客户端的完全向后兼容性方面仍然存在局限
- **NFSv4**NFS 系列中的一个里程碑版本NFSv4 提供了一套旨在现代化网络文件共享的功能。显著的改进包括集成 Kerberos 以实现 **高安全性**能够穿越防火墙并在不需要端口映射器的情况下通过互联网操作支持访问控制列表ACL以及引入基于状态的操作。其性能增强和采用有状态协议使 NFSv4 成为网络文件共享技术的重要进展。
- 请注意,发现支持 Kerberos 认证的 Linux 主机 NFS 是非常奇怪的。
- **NFSv4**NFS 系列中的一个里程碑版本NFSv4 提供了一套旨在现代化网络文件共享的功能。显著的改进包括集成 Kerberos 以实现 **高安全性**、能够穿越防火墙并在不需要端口映射器的情况下通过互联网操作、支持访问控制列表ACL以及引入基于状态的操作。其性能增强和状态协议的采用使 NFSv4 成为网络文件共享技术的重要进展。
- 请注意,发现支持 kerberos 认证的 Linux 主机 NFS 是非常奇怪的。
每个版本的 NFS 都是为了满足网络环境不断变化的需求而开发,逐步增强安全性、兼容性和性能。
每个版本的 NFS 都是为了满足网络环境不断变化的需求而开发,逐步增强安全性、兼容性和性能。
### 压缩
如前所述NFS 通常会信任客户端的 `uid``gid` 来访问文件(如果未使用 Kerberos。然而服务器中可以设置一些配置来 **改变这种行为**
如前所述NFS 通常会信任客户端的 `uid``gid` 来访问文件(如果未使用 kerberos。然而可以在服务器上设置一些配置以 **更改此行为**
- **all_squash**:它将所有访问压缩,将每个用户和组映射到 **`nobody`**65534 无符号 / -2 有符号)。因此,所有人都是 `nobody`,没有用户被使用。
- **root_squash/no_all_squash**:这是 Linux 的默认设置,**仅压缩 uid 为 0root的访问**。因此,任何 `UID``GID`被信任,但 `0` 被压缩为 `nobody`(因此无法进行 root 冒充)。
- **root_squash/no_all_squash**:这是 Linux 的默认设置,**仅压缩 uid 为 0root的访问**。因此,任何 `UID``GID`是可信的,但 `0` 被压缩为 `nobody`(因此无法进行 root 冒充)。
- **no_root_squash**:如果启用此配置,甚至不会压缩 root 用户。这意味着如果您以此配置挂载目录,您可以作为 root 访问它。
### 子树检查
仅在 Linux 上可用。man(5) exports 说:“如果导出文件系统的子目录,但整个文件系统没有导出,每当 NFS 请求到达时,服务器必须检查访问的文件不仅在适当的文件系统中(这很简单),而且在导出的树中(这更难)。此检查称为子树检查。”
仅在 Linux 上可用。man(5) exports 说:“如果导出文件系统的子目录,但整个文件系统没有导出,那么每当 NFS 请求到达时,服务器必须检查访问的文件不仅在适当的文件系统中(这很简单),而且在导出的树中(这更难)。此检查称为子树检查。”
在 Linux 中,**`subtree_check` 功能默认是禁用的**。
@ -56,10 +56,7 @@
### Showmount
这可以用来 **获取 NFSv3 服务器的信息**,例如 **导出** 列表,谁被 **允许访问** 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不准确)。
**NFSv4 客户端直接访问 /export** 并尝试从那里访问导出,如果无效或因任何原因未授权则失败。
如果像 `showmount` 或 Metasploit 模块这样的工具未显示 NFS 端口的信息,则可能是一个不支持版本 3 的 NFSv4 服务器。
这可以用来 **获取 NFSv3 服务器的信息**,例如 **导出** 列表、谁被 **允许访问** 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不
```bash
showmount -e <IP>
```
@ -75,11 +72,11 @@ 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`**
这个工具来自 [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>
```
@ -108,24 +105,24 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
查看页面:
{{#ref}}
/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### 从导出中逃逸
在这篇 [精彩文章](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) 中,可以看到可以 **从导出中逃逸以访问文件系统中的其他文件夹**
在这篇 [精彩文章](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) 中,可以看到可以 **从导出中逃逸以访问文件系统中的其他文件夹**
因此,如果一个导出正在导出一个是 **整个文件系统****子文件夹**,如果 **`subtree_check`** 被禁用,则可以访问导出之外的文件。而且在 Linux 中 **默认情况下是禁用的**
因此,如果一个导出正在导出一个是 **整个文件系统****子文件夹**,如果 **`subtree_check`** 被禁用,则可以访问导出之外的文件。而在 Linux 中,**默认情况下是禁用的**
例如,如果一个 NFS 服务器正在导出 `/srv/`,而 `/var/` 在同一文件系统中,则可以从 `/var/log/` 读取日志或在 `/var/www/` 中存储 webshell。
此外,请注意,默认情况下只有 root (0) 用户受到保护,无法被模拟(查看 Squash 部分)。但是,如果一个文件是 **由 root 拥有但组不是 0则可以访问它**。例如,文件 `/etc/shadow` 由 root 拥有,但组是 `shadow`(在 Debian 上的 gid 42。因此默认情况下可以读取它
此外,请注意,默认情况下只有 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 中也应该可)。
工具 **`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)。
要轻松列出、挂载更改 UID 和 GID 以访问文件,您可以使用 [nfsshell](https://github.com/NetDirect/nfsshell)。
[很好的 NFSShell 教程。](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
@ -136,7 +133,7 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
```
## 危险设置
- **读写权限 (`rw`):** 此设置允许对文件系统进行读取和写入。考虑授予如此广泛访问权限的影响至关重要
- **读写权限 (`rw`):** 此设置允许对文件系统进行读取和写入。授予如此广泛的访问权限时,必须考虑其影响
- **使用不安全端口 (`insecure`):** 启用后系统可以使用1024以上的端口。此范围以上的端口安全性可能较低增加风险。