通过 LD_PRELOAD 禁用 disable_functions (不需要 /usr/sbin/sendmail)
通过 LD_PRELOAD 禁用 disable_functions (不需要 /usr/sbin/sendmail)
抱歉,红队又赢了 agaaaain。我知道,你通过 php.ini 中定义的 PHP 目录,禁用了所有危险的函数,例如 system()、exec() 或 shell_exec() 以及更少人知的函数,如 dl()。
大家都知道,Unix 类系统会设置 LD_PRELOAD 变量,以在其他程序之前预加载共享对象 (*.so)。因此,我希望能够在应用程序中注入一些代码。在 PHP 中,mail() 函数会在内部启动 /usr/sbin/sendmail,而 script kiddy 会在 sendmail 中钩入一些系统 API(如 getuid()),以注入恶意代码。这并不是坏事,但是如果 bluuuue 团队卸载 sendmail 工具,那么,你会说什么呢?别担心,我已经找到了一个新方法,无论 sendmail 是否存在,红队总是可以通过 LD_PRELOAD 绕过 disable_functions。
bypass_disablefunc.php 有三个 GET 选项: cmd, outpath 和 sopath。这些选项都很简单,cmd 是你的恶意命令,outpath 是命令输出文件的路径(可读可写),sopath 是我们的共享对象 bypass_disablefunc_x64.so 的绝对路径。例如:
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so顺便说一句, bypass_disablefunc.php 可以绕过常见的防止 Web 后门的工具, 逃避 总是有好处的。因此, bypass_disablefunc.php 在任何环境中都是你的好帮手。 祝您愉快的黑客活动! 千辛万苦获得的 webshell 竟然无法执行系统命令: 怀疑服务器 disable_functions 禁用了命令执行函数,果然如此: 通过环境变量 LD_PRELOAD 绕过系统函数,目标根本没有安装 sendmail: 无法执行命令的 webshell 是毫无意义的,必须被突破!
一般来说,利用漏洞控制 Web 启动新进程 a.bin(即使进程名无法任意指定),a.bin 内部调用系统函数 b(),b() 位于系统共享对象 c.so 中,因此系统会为该进程加载共享对象 c.so,想法是在 c.so 前优先加载可控的 c_evil.so,c_evil.so 中包含与 b() 同名的恶意函数,由于 c_evil.so 优先级较高,因此,a.bin 将调用到 c_evil.so 中的 b(),而不是系统的 c.so 中的 b(),同时,c_evil.so 可控,从而达到执行恶意代码的目的。基于这一思路,常见的突破 disable_functions 限制执行操作系统命令的方式包括:
暂无开放 Issues,或尚未同步最近议题。