欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

审计某系统从解密到GetShell

来源:本站整理 作者:佚名 时间:2019-06-18 TAG: 我要投稿

要对公司内部的某系统做测试审计,但是碰到了加密的PHP文件,因为是采购的第三方整套设备所以只能自己做解密啦。
加密形式如下图:

收集信息
收集了一下PM9SCREW的信息,该使用的加密拓展名字叫PHP_Screw,这是一款免费的针对PHP源码进行加密的PHP的扩展,可以自定义加密的key,加密后的文件运行效率还不会下降。原理是通过压缩取反然后跟加密的key做异或加密的方式,在使用的时候通过.so文件的拓展文件进行解密然后再运行。并且找到了两个前人写好的工具,参考文章及工具链接如下:
https://www.skactor.tk/2018/03/26/php-screw%E7%9A%84%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86%E6%8E%A2%E7%A9%B6%EF%BC%88%E4%BA%8C%EF%BC%89%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95%E4%B8%8Epython%E5%AE%9E%E7%8E%B0/
https://github.com/firebroo/screw_decode
解密过程
通过前文得知有加密密钥存储的.so拓展文件很关键,所以先寻找文件:

找到了之后发现也是二进制文件:

于是IDA搞起,先找到pm9screw相关函数:

然后追踪相关变量:

找到加密的密钥口令:

hex转为十进制:

然后另一个函数中找到头部变量(这里为默认值):

然后将找到的密钥和头部放入前文的工具中使用即可解密。
在这里感谢前人的工具,以及如果使用该拓展加密,记得改掉或者隐去头部的字符不要留下线索,以及把.so文件隐藏好。
审计
接上篇blog解密php,该系统听说是处于行业领导地位的运维管理系统,不少大厂也在使用,并且传说该系统没有高危安全漏洞,那我们就来挖掘看看吧。
系统结构

#index.php片段
@session_start();
$sid = session_id();
@session_destroy();
$CONFIG["img"] = true;
$CONFIG["nomaster"] = true;
$CONFIG["not_http_referer"] = true;1
require_once("include/common.php");
require_once("include/Validate.php");
require('include/integrity.php');
require_once("include/common.php");
check_perm("admin");
我们可以看到从上图看出该系统因为历史悠久,在架构上还是使用静态php文件的路由方式,并没有使用MVC的结构,整体的系统架构略显臃肿。
从头部引入可以发现,该系统是采用定义$CONFIG数组定义一些环境变量并包含common.php等文件的设置,利用check_perm方法做权限的限制与鉴定。其中具体结构的实现细节与本文无关,就不多聊结构问题。
第一个getshell漏洞
不得不说该系统其实对于安全还是处理的比较到位的,各种sql、xss等注入都过滤处理的比较好,也验证了referer防止了csrf。这时候我想到堡垒机系统肯定需要与系统底层进行一些特殊的操作,譬如底层运维的信息的增删改查要与php动态交互,而此系统采用的是调用python的方法来实现这些功能。那这里面会不会有些问题呢?要是有就是直接getshell的大漏洞了。
function python_exec($code) {
    $descs = array();
    $descs[0] = array("pipe", "r");
    $descs[1] = array("pipe", "w");
    $descs[2] = array("pipe", "w");
    if (is_array($code)) $code = join("\n", $code);
    $p = proc_open("/usr/bin/python2.6 -", $descs, $pipes);
    fputs($pipes[0], $code);
    fclose($pipes[0]);
    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    $result = proc_close($p);
    return array($result, $stdout, $stderr);
}
方法代码如上,很普通的proc_open调用python的方法。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载