NFS exports配合setuid实现Linux提权

iso60001  1727天前

这篇文章将介绍如何通过不安全的NFS export和setuid,获得Linux系统上的root权限shell。对于刚接触渗透测试或者正在研究NFS的人来说,这应该是一篇有趣的文章。我将在系列文章中重点介绍在实际网络渗透测试期间Linux系统上常见的攻击点和权限提升的方法,第一篇和Rsync有关。

NFS是什么?

网络文件系统(NFS)是一种明文协议,用于在系统之间传输文件。那么它存在什么问题呢?在我们的内网渗透测试中,很多情况下都会发现配置不安全的NFS服务器。这些有缺陷的配置通常会让攻击者接触到敏感数据,有时甚至还能给攻击者一个root权限的shell。因此NFS的配置往往能决定一个系统到底安全与否。

远程访问通过NFS导出共享目录需要做两件事:挂载访问和文件访问。

1.挂载访问可以通过/etc/exports中的主机名或IP进行限制,但这在许多情况下都不存在任何限制。而且,IP和主机名很容易模拟(假设限制存在)。

2.文件访问是通过/etc/exports中的配置导出,将文件标记为可读/可写来实现的。文件访问是通过连接用户的UID来进行限制,但这也可以进行欺骗。同时在/etc/exports中也存在一些防御措施,比如“root squashing”,防止UID为0(root)的用户访问。

NFS的主要问题

如果可以挂载NFS export,通常可以通过在客户端系统上改变UID,以绕过通过NFS export提供的目录上配置的文件权限限制。如果文件相关的UID和连接用户的UID相同,也可进行访问。

以下是“意外”访问发生的过程:

1.在Server 1上有一个名为user1的用户,其UID为1111

2.user1创建了一个名为secret的文件,该文件只有用户自己和root才能访问,这里使用了类似chmod 600 secret的命令。

3.然后在Server1上创建一个读/写NFS export,没有映射到包含user1秘密文件的目录的IP限制。

4.在一个单独的Linux客户机系统上,有一个名为user2的用户,该用户的UID也是1111。当user2挂载由Server1的NFS export时,user2就可以读取secret文件,因为他的UID与secret文件所有者的UID相同。

下面是对该场景的示意图:

33.png

发现NFS服务器

NFS通常监听UDP端口111和TCP端口2049。使用nmap等常用工具就可以识别开放的NFS端口。

nmap -sS -pT:2049,111,U:2049,111 192.168.1.0/24 -oA nfs_scan
grep -i "open" nfs_scan.gnmap

44.png

使用nmap或rpcinfo等常用工具可以确定当前NFS支持的版本。这在以后测试中可能很重要。我们希望强制使用3以下的版本,这样就可以列出并模拟文件所有者的UID。如果启用了root squashing,这就可能会很有用。

通过Nmap枚举支持的NFS版本:

nmap -sV -p111,2049 192.168.1.171

通过rpcinfo枚举支持的NFS版本:

apt-get install nfs-client
rpcinfo -p 192.168.1.171

55.png

下面是一段简短的视频,展示了发现NFS服务器的过程。

https://blog.netspi.com/wp-content/uploads/2020/03/NFS_ATTACK_DEMO_1.mp4?_=1

66.png

列举NFS Exports

现在,我们希望使用metasploit或showmount列出远程服务器上可用的NFS Exports。

metasploit:

root@kali:~# msfconsole
msf > use auxiliary/scanner/nfs/nfsmount
msf auxiliary(nfsmount) > set rhosts 192.168.1.171
msf auxiliary(nfsmount) > run

77.png

Showmount:

apt-get install samba
showmount -e 192.168.1.171

88.png

挂载NFS Exports

现在,我们希望以root身份运行时挂载可用的 NFS export。请务必使用-o vers=3,以确保你可以查看文件所有者的uid。下面是一些挂载的操作:

mkdir demo
mount -o vers=3 192.168.1.171:/home demo
mount -o vers=3 192.168.1.222:/home demo -o nolock

mount -t nfs -o vers=3 192.168.1.171:/home demo

mount -t nfs4 -o proto=tcp,port=2049 192.168.1.171:/home demo

99.png

查看NFS被导出的目录和文件的UID

现在,如果你可以完全访问所有内容,则此时root squashing 并没有被启用。但是,如果你得到了一个被拒绝的消息,那么就必须模拟文件所有者的UID,并重新挂载NFS export来获得访问权限。

列出已挂载驱动器的UID:

ls -an

100.png

使用nmap列出UID:

nmap --script=nfs-ls 192.168.1.171 -p 111

110.png

搜索密码和私钥

好的,假设你能够使用root用户或其他用户访问NFS。现在是时候寻找密码和私钥了。私钥通常位于/home/<user>/.ssh中,但是密码就说不定了。

查找名称中带有“Password”的文件:

cd demo
find ./ -name "*password*"
cat ./test/password.txt

120.png

你可以在.ssh目录中找到私钥:

mount 192.168.1.222:/ demo2/
cd demo2
find ./ -name "id_rsa"
cat ./root/.ssh/id_rsa

130.png

下面是一个简短的搜索演示过程:

https://blog.netspi.com/wp-content/uploads/2020/03/NFS_ATTACK_DEMO_2.mp4?_=2

140.png

目标Setuid(获取root权限)

现在我们可能有了一个交互式shell,不过权限很低(身份test),虽然Linux系统存很多权限升级的方法,但是在这一部分中,我们主要关注setuid二进制文件。该二进制文件可通过setuid flag进行配置,可让用户作为二进制文件的所有者执行它们。同样,配置了setguid flag的二进制文件,允许用户将flag二进制文件作为与文件关联的组执行。这对系统管理员来说,可能是一件好事,也可能是一件坏事。

  • 好消息是,setuid二进制文件可以用于安全地执行特权命令,比如passwd。

  • 坏消息是,如果setuid二进制文件由root用户拥有,并且允许直接执行任意命令或通过插件/模块间接执行任意命令,那么它们通常可以用于权限提升。

下面是用于搜索setuid和setguid二进制文件的命令。

寻找Setuid二进制文件:

find / -perm -u=s -type f 2>/dev/null

寻找Setguid二进制文件:

find / -perm -g=s -type f 2>/dev/null

以下是一个你可能会在实际渗透中碰到的情况。

150.png

现在我们的目标通常是以root权限执行任意代码。在真实的场景中,您可能需要对目标setuid二进制文件进行一些研究或逆向,以确定最佳的渗透方法。而在这个例子中,/home/test/exec二进制文件可让我们以root用户直接执行系统命令。示例应用的源代码可以在https://github.com/nullbind/Other-Projects/blob/master/random/exec.c找到。

以下是命令示例和截图:

cd /home/test/
./exec
whoami

160.png

正如你从上图中看到的,我们确实可以以root用户执行任意命令。下面的视频显示setuid整个提权过程:

https://blog.netspi.com/wp-content/uploads/2020/03/NFS_ATTACK_DEMO_3.mp4?_=3

总结

本文章演示了在远程Linux系统上使用有缺陷的NFS export和不安全的setuid二进制文件获得root shell的方法。虽然有许多渗透技术可以得到相同的结果,但我认为这篇文章的原意是提醒大家网络中所有权限的设置都需要确保最低。希望你能更好地理解与NFS服务器相关的安全漏洞,并负责任地进行渗透测试!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://blog.netspi.com/linux-hacking-case-studies-part-2-nfs/

最新评论

昵称
邮箱
提交评论