返回
Featured image of post [THM]Network Services2 初见

[THM]Network Services2 初见

今天来学习 Network Services 房间的第二部

了解 NFS

什么是 NFS?

NFS 代表“网络文件系统”,允许系统通过网络与他人共享目录和文件。通过使用 NFS,用户和程序可以访问远程系统上的文件,就好像它们是本地文件一样。它通过将文件系统的全部或部分挂载到服务器上来实现此目的。客户端可以使用分配给每个文件的任何权限来访问挂载的文件系统部分。

Shared File

NFS 是如何工作的?

首先,客户端将请求将远程主机上的目录挂载到本地目录上,就像挂载物理设备一样。然后,挂载服务将使用 RPC 连接到相关的挂载守护程序。

服务器检查用户是否有权挂载已请求的任何目录。然后,它将返回一个文件句柄,该句柄唯一标识服务器上的每个文件和目录。

如果有人想使用 NFS 访问文件,则会向服务器上的 NFSD(NFS 守护程序)发出 RPC 调用。此调用采用如下参数:

  • 文件句柄
  • 要访问的文件的名称
  • 用户的 ID
  • 用户的组 ID

这些用于确定对指定文件的访问权限。这是控制用户权限,即读取和写入文件的内容。

什么运行 NFS?

使用 NFS 协议,您可以在运行 Windows 和其他非 Windows 操作系统(如 Linux、MacOS 或 UNIX)的计算机之间传输文件。运行 Windows Server 的计算机可以充当其他非 Windows 客户端计算机的 NFS 文件服务器。同样,NFS 允许运行 Windows Server 的基于 Windows 的计算机访问存储在非 Windows NFS 服务器上的文件。

image-20231107121803729

枚举 NFS

关于枚举 NFS

和之前的一样,使用工具去对靶机 IP 进行枚举,需要注意的是这里的枚举不再使用 enum4linux,而是采用了新的工具,下面会介绍。

NFS-Common

在使用 NFS 的任何计算机上安装此软件包非常重要,无论是作为客户端还是服务器。它包括以下程序:lockd、statd、showmount、nfsstat、gssd、idmapd 和 mount.nfs。首先,我们关注的是“showmount”和“mount.nfs”,因为在从 NFS 共享中提取信息时,它们对我们最有用。如果您想了解有关此套餐的更多信息,请随时阅读:https://packages.ubuntu.com/jammy/nfs-common

端口扫描

经典的起手式,nmap 扫描靶机 IP。

nmap -A -p- -T4 10.10.240.139

image-20231107123612141

可以看到一共开启了 7 个端口,其中 2049 端口开启了 nfs 服务,所以这就是我们需要的端口。

挂载 NFS 共享

使用 showmount 来扫描可见的 NFS 共享。

showmount -e [IP]

image-20231107123917831

如图,发现了/home 目录是共享的,我们现在将这个目录挂载到我们的本地机器上。

首先创建一个临时文件夹mkdir /tmp/nfsmount,然后执行

sudo mount -t nfs 10.10.240.139:share /tmp/nfsmount/ -nolock
Tag			Function 功能
sudo 		身份运行
mount 		执行挂载命令
-t nfs		要装载的设备类型,然后指定它是 NFS
IP:share 	NFS服务器的 IP 地址,以及我们希望挂载的共享的名称,本例中为home
-nolock 	指定不使用 NLM 锁定

然后这个目录就被我们挂载在了本地机器上,可以直接去文件管理器中访问。

image-20231107124708149

打开发现如下文件

image-20231107124806351

让我们分析一下这些文件的作用

NFS 共享文件夹名为 cappucino,说明用户名大概是这个

存在配置远程 ssh 连接的目录.ssh

存在 sudo_as_admin_successful 文件,说明具有 sudo 权限

顺走 ssh 文件夹内的公钥和私钥文件,和之前一样放到本地.ssh 目录中,然后根据用户名去进行 ssh 连接

ssh cappucino@10.10.240.139

image-20231107125537217

成功进入服务器。然后执行部分命令尝试获取文件等。

利用 NFS

现在我们具有一个低权限的 shell,以及一个 NFS 共享,所以可以尝试使用 NFS 来提权。

什么是 ROOT_SQUASH?

默认情况下,在 NFS 共享上会启用 root_squash 设置,这能防止连接到 NFS 共享的任何人对 NFS 卷 具有 root 访问权限;如果目标机器启用了 root_squash 设置,那么 root 用户在连接 NFS 共享时只会被分配一个“nfsnobody”用户身份,该用户将具有最少的本地权限,而这并不是我们想要的;如果目标机器关闭了 NFS 服务的 root_squash 设置,那么此时的目标机就能够允许我们在 NFS 共享中创建 SUID 位文件,从而就能允许用户以 root 身份访问所连接的目标系统–成功完成提权。

SUID

设置了 SUID 位的文件是什么?本质上,SUID 意味着我们可以在文件所有者/组的权限下运行一个或多个文件,如果文件所有者/组是 root,那么我们就可以在 root 权限下运行一个或多个文件,所以当我们执行一个设置了 SUID 位的 bash shell 文件时,我们就能获得具有对应特权的 shell–也就是 root shell。

利用方法

这听起来很复杂,但实际上——只要我们熟悉了 SUID 文件的工作原理,就很容易理解具体的利用方法。

我们可以将文件上传到 NFS 共享,并控制这些文件的权限;实际上,我们可以设置我们上传的任何内容的权限,在本例中我们将对 bash shell 可执行文件的权限进行设置(将其变更为具有 SUID 位的文件);完成权限设置后,我们可以通过 SSH 登录目标机并查看到我们上传至 NFS 共享中的文件 - 我们只要执行这个设置了 SUID 位的 bash shell 可执行文件就能获得一个 root shell。

所使用的可执行文件

由于兼容性问题,我们将使用标准的 Ubuntu Server 18.04 bash 可执行文件,这与目标服务器所使用的 bash 相同,相关文件的链接如下:

https://github.com/polo-sec/writing/blob/master/Security Challenge Walkthroughs/Networks 2/bash

我们可以通过命令行下载 bash 文件,注意我们需要的是原始脚本文件,请不要下载成 github 页面,我们将在攻击机上使用以下命令:

wget https://github.com/polo-sec/writing/raw/master/Security%20Challenge%20Walkthroughs/Networks%202/bash

我靠,下不下来😅,算了,手动下载,然后下载下的的文件需要复制进 cappuccino 文件夹内,需要注意的是,复制进去的文件必须是 root 持有者,这样才能有 SUID 位,所以我们执行

chown root bash 	#更改持有者
chmod +x bash 		#可执行权限
chmod +s bash 		#SUID位权限
+s 		这里说明一下,+s的作用是在文件执行时把进程的属主或者组ID作为该文件的文件属主,本例中可以理解为因为文件是root持有,所以执行时属主为root,获得SUID位权限。

image-20231107132348566

如图,当我们执行 bash 文件之后获得了一个 root shell,然后我们去获取 flag 文件。

image-20231107132635381

Licensed By 猫南北
最后更新于 2025 年 10 月 22 日 22:44