实战 | 记一次PHP混淆后门的分析利用
【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。
作者:小老弟你怎么回事@深信服深蓝实验室天慧战队
目标一个站发现版权和标题都是XX源码下载网,那目标源码可能是网上下载的,于是我也搞了一套源码回本地开始测试。
我习惯网上这种能下载到的源码一般很大可能是存在后门,先D盾杀查一把梭,果然源码有混淆,然后一个藏在images目录下的php非常可疑,还调用了phpinfo()。
当然事情远没有这么简单,打开该文件后发现进行了混淆编码,于是尝试哪些php解密工具进行解密。
但是并不能解开,或者说不是一些常见的加密和混淆的方案。尝试手工分析
先把源码格式化一下,虽然看着还是很自闭,但是至少能下手了。
看到这种数字+字母最高只出现个F的,那就是16进制了,特别还用了pack函数。
随便选一段然后用burpsuite的解码器选择 ASCII hex的方式
66696C655F6765745F636F6E74656E7473->file_get_contents
当然如果不放心可以直接把代码抠出来,在打印一下结果都是一样的。
于是我把这些16进制的全部转换了下作为注释,发现全部都是文件操作。
$GLOBALS[pack(chr(72) . chr(42), "415F4141415F5F") ] = pack(chr(72) . chr(42), "6670757473");//A_AAA__ fputs
其实像这种也不难理解,其实就是定义全局变量和对函数做了个别名这个是php的一个特性。就是把函数名赋值给变量,在变量直接传参就等于调用了哪个函数。
比如把base64_decode赋值给b变量,然后b当成函数直接使用,其实就是在用base64_decode()这个函数。
换句话说以上哪些什么AAA_AA的其实就只是把关键函数换了个名字,是一个变量函数。
直接访问马是空白页面,我想先访问到phpinfo看一下,必须要进入这个判断。
$GLOBALS[A_A_AAA][(0 - 1072 + 67 * E_CORE_ERROR) ][pack(chr(72) . chr(42), "70") ]
来分析下这个全局的三维数组
首先$GLOBALS[A_A_AAA]里面存放了$_GET, $_SERVER这两个的地址。既然是数组那么存放的方式是如下的
$GLOBALS[A_A_AAA][0]==$_GET
$GLOBALS[A_A_AAA][1]== $_SERVER
0 – 1072 + 67 * E_CORE_ERROR 其实运算后就是等于0
$GLOBALS[A_A_AAA][(0 – 1072 + 67 * E_CORE_ERROR) ] 就等于$_GET
pack(chr(72) . chr(42), “70”) 解码后等于p
所以
$GLOBALS[A_A_AAA][(0 - 1072 + 67 * E_CORE_ERROR) ][pack(chr(72) . chr(42), "70") ]
其实就是$_GET[‘p’]
686A这个16进制转文本就是hj
?p=hj 即可
在它的一个条件中发现它在获取远程一些东西。
解码后,而且这种
AA_____
AA____A
其实在开头就赋值过了,其实就是个变量函数。
在结合上下文
其实就是file_get_contents去请求加载Base64_self.png这个马,然后在通过file_put_contents写成yjh.php。
把马拉到本地一看,混淆程度相比刚才,有过之而无不及。原以为经过一层了应该不会在有啥混淆了,还是太年轻了。同样扔到在线解密的php网站,同样提示无果不能识别。
看不懂没关系,挑你看的懂的看,毕竟混淆就是让你看不懂,目的就达到了。
这些16进制转成文本看看。
使用burpsuite解码模块一把梭,它会尽可能的把能转的给转了。
这哥几个不就来了嘛,找到eval了,你懂的。
其实这就差不多了,不过我们还是可以在跟一下。从eval中开始回溯。
全局定义了个$A97vPEJ变量放入eval中执行。
$A97vPEJ的值是和$c拼接。
$c的值是从$A97tIEK获取
$A97tIEK从$A97eF0获取
$A97eF0是base64_decode解码后的内容
在看看
call_user_func_array(“base64_decode”,$A97zA1)中的$A97zA1的值
是个数组。A97tIEJ的值从$_POST[‘mima123’];中获取
饶了一个大圈子其核心就是
这样就完成利用。
原创文章,作者:moonsec,如若转载,请注明出处:https://www.moonsec.com/6257.html