得绕过且绕过是什么意思

核心提示0x00 前言前段时间碰到拿到shell以后限制了basedir并且无法执行命令的情况,解决办法是上传恶意的.so文件,并通过设置LD_PRELOAD,然后调用新进程来加载恶意.so文件,达到绕过的效果。当时做这道题目的时候是跟着别人的题解

0x00前言

前段时间遇到的情况是我拿到shell后,basedir被限制,无法执行命令。解决方案是上传恶意的。所以文件,并设置LD_PRELOAD,然后调用一个新的进程来加载恶意的。所以文件,以便绕过它。当时我在做这道题的时候,直接照着别人的解法做,处于一知半解的状态。比赛结束后,我又耽误了一两天,还没来得及总结学习下面的方法。

0x01学习

互连

在学习LD_PRELOAD之前你需要知道什么是链接。

该计划有三个主要链接:

静态链接:在程序运行之前,将所有的目标模块和需要的库函数链接成一个完整的可执行程序,然后不要反汇编。加载过程中的动态链接:源程序编译后得到的一组目标模块,在加载到内存中的同时进行链接。运行时动态链接:原程序编译后得到的目标模块,只在程序执行过程中需要时才链接。对于动态链接,需要一个动态链接库,当动态链接库中的函数发生变化时,动态链接库的功能对可执行程序是透明的,可执行程序不需要重新编译,便于程序的发布/维护/更新。但是,因为程序是在运行时动态加载的,所以存在一个问题。如果程序动态加载的函数是恶意的,可能会导致disable_function被绕过。

LD_PRELOAD简介

在UNIX的动态链接库的世界里,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时链接,它允许你定义程序运行前先加载的动态链接库。该函数主要用于在不同的动态链接库中有选择地加载相同的函数。通过这个环境变量,我们可以在主程序和它的dll之间加载其他的dll,甚至可以覆盖正常的函数库。一方面,我们可以用这个函数使用自己的或者更好的函数;另一方面可以在别人的程序中注入恶意程序,从而达到不可告人的邪恶目的。

为什么可以绕过?

如果您想通过使用LD_PRELOAD环境变量绕过disable_functions,您需要注意以下几点:

能够上传你自己的。所以文件可以控制环境变量的值。比如putenv函数,有可以控制PHP启动外部程序,可以执行的函数,比如mail,imap_mail,mb_send_mail,error_log等。第一,可以恶意上传。攻击者使用靠近服务器的系统环境在本地编译的文件。相关的系统函数在这个库中重写,重写的系统函数可以被PHP禁用。

当我们可以设置环境变量时,比如不禁止的putenv函数,我们可以设置LD_PRELOAD变量作为恶意的路径。所以文件,只要一个新的进程开始,恶意的。因此,在新进程运行之前,文件将被优先加载,因此,恶意代码将被注入到程序中。

在执行未被禁止的PHP函数时,函数调用恶意库中被重写的系统函数,就可以达到任意执行系统命令的效果,因为被重写的系统函数的内容是我们可控的,所以我们只能对这部分进行编程。

当PHP中的一些函数,比如mail函数被调用时,系统中的sendmail函数就会被调用。一样的恶意。所以LD_PRELOAD中指定的file覆盖了sendmail函数,重写后的sendmail函数中的恶意代码就会被执行,从而绕过disable_functions,达到任意执行系统命令的效果。

0x02练习

在这样的环境中,与命令执行相关的功能被禁止。

如果直接执行,将会报告错误。

test.php

< phpsystem

编译so文件

首先,检查sendmail系统函数将调用哪些库函数。

readelf -Ws /usr/sbin/sendmail

只要选择其中一个库函数,这里,选择seteuid重写。

黑客. c

#包括

#包括

#包括

无效负载{

系统;

}

int seteuid {

if = = NULL){ return 0;}

unsetenv

有效载荷;

}

如果调用sateuid,将加载有效负载函数并执行命令。

编译时恶意。所以文件,你要注意把它们编译成共享对象:

如果你想创建一个动态链接库,你可以使用GCC的-shared选项。输入文件可以是源文件、汇编文件或目标文件。此外,还必须结合使用-fPIC选项。-fPIC选项作用于编译阶段,告诉编译器生成与位置无关的代码;这样,生成的代码没有绝对地址,使用的都是相对地址,所以代码可以被加载器加载到内存中的任意位置,并且可以正确执行。这正是共享库所需要的。当加载共享库时,它在内存中的位置是不固定的。你得根据目标架构编译成不同的版本,在x64环境下编译。如果没有编译选项,则默认为x64。如果要编译成x86架构,需要添加-m32选项。

gcc-shared-fPIC test . c-o test _ x64 . so

上传。所以归档

上传的方式有很多种。一般来说,如果能拿到外壳,应该都是有写权限的。在suctf2019-easyphp中,您上传了一个。htaccess文件来覆盖分析,从而绕过文件上传并得到外壳。在这种情况下,您可以使用现有的上传点或通过写权限添加一个新的上传点。

写入webshell

test2.php

< phpputenv邮件;>

在浏览器中访问webshell来执行我们期望的语句。根据这个原理,我们可以执行任何特定的权限命令。

我这里的ubuntu里没有安装Sendmail,但是执行成功了。一开始不知道怎么找原因,后来多亏室友的指点才知道。

在中添加无限循环。c确定哪个函数调用了geteuid。

测试. c

#包括

#包括

#包括

无效负载{

系统;

}

int geteuid {

if = = NULL){ return 0;}

while{}

unsetenv

有效载荷;

}

在top中可以看到,当前被占用的项其实是/bin/sh,因为无限循环一直被卡住。

它源自test.php,所以我没有安装sendmail。我成功执行它的原因是sh也调用了geteuid函数。

0x03概括

回到LD_PRELOAD本身,系统通过它预加载共享对象。如果能找到办法,代码会在加载的时候执行,不用考虑劫持某个系统函数,比如geteuid。

GCC中有一个C语言扩展修饰符_ _ attribute _),允许它修饰的函数在main之前执行。如果它出现在共享对象中,那么由__attribute__)修饰的函数将在共享对象被系统加载后立即执行。

__attribute__)

构造函数参数允许系统在执行主函数之前调用函数)。

__attribute__)

析构函数参数允许系统在主函数退出或退出被调用后修改函数。

所以只要在php中设置了LD_PRELOAD,派生出一个新的进程,就会执行LD_PRELOAD的文件。

__attribute__)。

测试3.c

#包括

#包括

__attribute__)无效负载{

unsetenv

const char * cmd = getenv

系统;

}

test2.php

< php

putenv

putenv

error _ log

>

可以看到执行是成功的。

0x03参考链接

获取消息或私人消息。

 
友情链接
鄂ICP备19019357号-22