From 78ad6b7afcec8bc111fb3f4913fe7b4afa409c56 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 5 Feb 2025 09:39:24 +0000 Subject: [PATCH] Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash --- .../nfs-no_root_squash-misconfiguration-pe.md | 26 +++++----- .../nfs-service-pentesting.md | 47 +++++++++---------- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md index cf0bf587f..b3da70b17 100644 --- a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +++ b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md @@ -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 0(root)进行压缩**。因此,任何 `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 ./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 ## 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 diff --git a/src/network-services-pentesting/nfs-service-pentesting.md b/src/network-services-pentesting/nfs-service-pentesting.md index 02ee922ff..b43a728a7 100644 --- a/src/network-services-pentesting/nfs-service-pentesting.md +++ b/src/network-services-pentesting/nfs-service-pentesting.md @@ -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` 0(root)。有关更多信息,请参见压缩部分。** +**然而,请注意,默认情况下,使用 NFS 无法冒充 `UID` 0(root)。更多内容请参见压缩部分。** #### 主机 @@ -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 为 0(root)的访问**。因此,任何 `UID` 和 `GID` 都被信任,但 `0` 被压缩为 `nobody`(因此无法进行 root 冒充)。 +- **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 上可用。man(5) exports 说:“如果导出了文件系统的子目录,但整个文件系统没有导出,那么每当 NFS 请求到达时,服务器必须检查访问的文件不仅在适当的文件系统中(这很简单),而且在导出的树中(这更难)。此检查称为子树检查。” 在 Linux 中,**`subtree_check` 功能默认是禁用的**。 @@ -56,10 +56,7 @@ ### Showmount -这可以用来 **获取 NFSv3 服务器的信息**,例如 **导出** 列表,谁被 **允许访问** 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不准确)。 -在 **NFSv4 客户端直接访问 /export** 并尝试从那里访问导出,如果无效或因任何原因未授权则失败。 - -如果像 `showmount` 或 Metasploit 模块这样的工具未显示 NFS 端口的信息,则可能是一个不支持版本 3 的 NFSv4 服务器。 +这可以用来 **获取 NFSv3 服务器的信息**,例如 **导出** 列表、谁被 **允许访问** 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不 ```bash showmount -e ``` @@ -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 ``` @@ -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以上的端口。此范围以上的端口安全性可能较低,增加风险。