免考final linux提权与渗透入门——Exploit-Exercise Nebula学习与实践

免考final linux提权与渗透入门——Exploit-Exercise Nebula学习与实践 0x0 前言

Exploit-Exercise是一系列学习linux下渗透的虚拟环境,官网是https://exploit-exercises.com/,通过它可以学习提权,漏洞利用,逆向等知识

我们这里尝试的是Nebula,是一个涵盖初级、中级挑战任务的练习环境,一个有20个关卡。涉及到的知识点有:

SUID文件(SUID files)

权限(Permission)

竞态条件(Race conditions)

Shell编程(Shell)

$PATH缺陷($PATH weaknesses)

脚本语言缺陷(Scripting language weakness)

二进制编译漏洞(Binary compilation failures)

网上有详细的Nebula通关教程,我希望通过这次实验,提升自己linux下渗透的本领,掌握一些linux本地和远程攻击的基本知识。

0x1 通关流程

我参照网上给出的教程,来尝试完成Nebula的20个关卡。有兴趣的同学可以找我拷贝Nebula的镜像。i春秋上也有Nebula的在线环境练习。

每一个关卡level对应一个账号:levelXX/levelXX(用户名和口令是一样的)比如第5关的账号就是 level05/level05。登录之后,进入/home/flagXX的目录下,与该关卡有关的东西都在这里。

官网中的Nebula页面中有每道题的程序源码。

每一关提权成功之后,需要执行/bin/getflag/,如果提权是成功的,会提示“You have successfully executed getflag on a target account”,否则提示“getflag is executing on a non-flag accont, this doesn\'t count”

level00——找特权程序

本关卡需要找到一个以“flag00”账号运行的可执行程序。关键是对find命令和uid知识的掌握。

我们先看看flag00的UID是什么,输入cat /etc/passwd | grep flag00

00-1

flag00的UID和GID都是999。

接着通过find命令从根目录开始查找,输入find / -uid 999 2> /dev/null

(我们把标准错误输出扔到/dev/null黑洞里去)

00-2

无论是/bin/.../flag00,还是/rofs/bin/.../flag00都符合要求,任意执行一个即可。接着运行/bin/getflag成功通关。

00-3

level01——环境变量

本题开始,需要我们对源码进行分析了,官网提供的源代码如下:

#include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <stdio.h> int main(int argc, char **argv, char **envp) { gid_t gid; uid_t uid; gid = getegid(); uid = geteuid(); setresgid(gid, gid, gid); setresuid(uid, uid, uid); system("/usr/bin/env echo and now what?"); }

这就是我们flag01程序的源代码。这里的system调用,执行了env程序。

env用来显示环境变量,以及在定义的环境中执行程序。env需要根据环境变量PATH来查找程序的路径。

即便是system中的参数是“硬编码”的,我们也有办法执行任意文件。

01-1

我们看到flag01程序的权限就是flag01,我们的目标就是通过它来执行/bin/getflag

01-2

这一系列手段非常有参考意义。/tmp目录对所有用户都有完整的权限。

我们首先在/tmp下建立一个指向/bin/getflag的软链接echo,然后将/tmp目录放到环境变量PATH的最前面。

这样,env程序在查找echo的时候会首先找到/tmp下的“伪装”echo并执行。

通过这样的手法,可以执行其他的可执行程序。

level02——执行任意文件

老样子,从代码中发现漏洞,本关卡的程序源码如下:

#include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <stdio.h> int main(int argc, char **argv, char **envp) { char *buffer; gid_t gid; uid_t uid; gid = getegid(); uid = geteuid(); setresgid(gid, gid, gid); setresuid(uid, uid, uid); buffer = NULL; asprintf(&buffer, "/bin/echo %s is cool", getenv("USER")); printf("about to call system(\"%s\")\n", buffer); system(buffer); }

asprintf是GNU扩展的C函数,它将格式化字符串放到buffer中。getenv函数获取环境变量USER的值。

由于环境变量USER是可以自己设置的,我们把USER设置为;/bin/getflag

这样,执行了echo命令后,就会执行/bing/getflag,达到level02的要求。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpfgy.html