2049 - Pentesting NFS Service
Reading time: 13 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
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 服务器的信息,例如 导出 列表、谁被 允许访问 这些导出,以及哪些客户端已连接(如果客户端在未告知服务器的情况下断开连接,这可能不
showmount -e <IP>
有用的 nmap 脚本
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
有用的metasploit模块
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
nfs_analyze
这个工具来自 https://github.com/hvs-consulting/nfs-security-tooling,可以用来从 NFS 服务器获取大量数据,如 挂载点、支持的 NFS 版本、连接的 IP,甚至可以检查是否可以 从导出中逃逸 到文件系统中的其他文件夹或 是否启用了 no_root_squash
。
Mounting
要知道服务器 可用 的 哪个文件夹 供你挂载,你可以使用以下命令:
showmount -e <IP>
然后使用以下命令挂载它:
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
您应该指定使用版本 2,因为它没有任何****身份验证或授权。
示例:
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,基本上会始终发送访问文件所需的 UID 和 GID。
SUID 权限提升
查看页面:
NFS no_root_squash/no_all_squash misconfiguration PE
从导出中逃逸
在这篇 精彩的文章 中,可以看到可以 从导出中逃逸以访问文件系统中的其他文件夹。
因此,如果一个导出正在导出一个是 整个文件系统 的 子文件夹,如果 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 是为了支持针对 ext4、xfs、btrfs 文件系统的此攻击而构建的,版本为 3(在 v4 中也应该可行)。
NSFShell
要轻松列出、挂载和更改 UID 和 GID 以访问文件,您可以使用 nfsshell。
配置文件
/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权限提升
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}
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。