Pecker Scanner

简介:
Pecker Scanner是一个PHP语言编写的基于php语法扫描、词法分析的webshell扫描工具,相比基于字符串用正则表达式检测的做法,有超高的准确性。默认检测eval语言结构,无法配置,默认强制检测。该项目Pecker Scanner托管在Github,项目起源见《基于语法分析的PHP webshell扫描工具》欢迎各位的建议反馈。
使用方法:
参见index.php

//配置下面三个地方
$config = array(
    'scandir' => dirname(__FILE__),    //配置需要扫描的目录,绝对路径。
    'extend' => array('php','inc','php5'),    //配置需要扫描的扩展名
    'function' => array('exec','system','create_function','passthru','shell_exec','show_source','include','require_once',...等等...),    //配置需要扫描的危险函数(或语言结构)
);

try {
    $scaner = new Pecker_Scanner();
    $scaner->setPath($config['scandir']);    // set directory to scan
    $scaner->setExtend($config['extend']);
    $scaner->setFunction($config['function']);
    $scaner->run();
    $result = $scaner->getReport();

    $html = '';
// ......
    echo '<a href="'.$filename.'">Completed,View report.</a>';    //生成报告
}
catch (Exception $e)
{
    print_r($e);
}

配置好之后,访问index.php即可,报告将生成在同级目录,阅读扫描报告即可。 Pecker Scanner 报告样例

下载地址(请遵守开源协议 GPL v2):
Pecker Scanner v0.4.4 beta

服务端校验
目前已收集如下开源项目、webshell后门特征

  • DedeCMS-V5.7-UTF8-SP1-Full
  • Discuz_7.2_FULL_SC_UTF8
  • Discuz_X3.0_SC_UTF8
  • Discuz_X3.1_SC_UTF8
  • espcms_utf8_5.7.13.09.10_b
  • HDWiki-v5.1UTF8-20121102
  • Joomla_2.5.14-Stable-Full_Package
  • Joomla_3.1.5-Stable-Full_Package
  • KingCMS_6.1.1641(Sp2)
  • none
  • phpcms_v9.4.2_UTF8
  • phpMyAdmin-4.0.7-all-languages
  • phpspy 2011
  • phpspy 2013
  • phpspy 2013 加密版
  • phpwind_UTF8_8.7
  • phpwind_v9.0_utf8
  • WeCenter_2-2-1
  • wordpress-3.6.1

CHANGE LOGS:
Pecker Scanner-0.4.4 [2014-05-27]
fixed typos.(Secend param of substr function “,” by “.”)
fixed checklist with complex curly syntax. thanks for https://github.com/chinurho to report it.

Pecker Scanner-0.4.0 [2014-03-03]
fix bugs for some of the syntax with “{” and “[“.
fix bugs with code : (require ’1.dat’).’.php’; thanks for poker付
add “include” to default checklist .

Pecker Scanner-0.3.0 [2013-09-22]
* Feature: 服务器云判断确认恶意代码功能

Pecker Scanner-0.2.3 [2013-09-16]
* Improve: 精确只获取恶意函数中,参数部分的token。
* Bugfix: 变量类名也捕获bug。
* Bugfix: 修复捕获T_ENCAPSED_AND_WHITESPACE中变量函数的bug。
* Buffix: 修复计算当前token的下一个token时,key计算错误。

Pecker Scanner-0.2.2 [2013-09-14 23:00]
* Feature: 增加assert函数到默认检测列表。 (感谢bgho4t的反馈)
* Bugfix:修复危险函数后面用段注释、区块注释分割时,被漏掉的BUG。(感谢bgho4t的反馈)

Pecker Scanner-0.2.1 [2013-09-14]
* Feature: 增加危险函数附近代码的去除空白字符、行注视、段注释之后的token的hash生成,便于后续云判断,跟服务器校对该hash是否已经被举报为木马
* Bugfix:修复变量函数名检查误报BUG
* Bugfix:修复执行超时问题

Pecker Scanner-0.2 [2013-09-13]
* Feature: 增加危险函数附近代码的展示功能
* Feature: 增加对include\require系列语言结构的扫描检查
* Bugfix:修复变量函数名检查误报BUG
* Bugfix:修复类方法出现被扫描函数时,误报问题

Pecker Scanner-0.1 [2013-09-12]
* Feature: 支持对扫描的文件拓展名,文件路径的自定义配置,自定义扫描关键字配置。
* Feature: 实现对变量函数的扫描检查
* Feature: 实现对eval语言结构的扫描检查
* Feature: 实现扫描报告输出

反馈建议:
请下方留言,谢谢。

回复“反馈建议”:
感谢黑哥的推荐,让很多朋友知道了她的存在。今天得到一个朋友的测试记录webshell扫描工具(Pecker Scanner) – 测试,感谢作者bgho4t的测试。日志中提到一下几点:

  • 程序执行超时
  • 变量函数未检测到
  • 记录所有EVAL语言结构不妥
  • 部分误报(见下方截图)

Pecker Scanner扫描误报-来自http://sucure.net/的反馈

Pecker Scanner扫描误报-来自http://sucure.net/的反馈


感谢bgho4t的测试日志,尽管没直接反馈到我。

  • 关于执行超时,这确实是我的疏忽,已经修复。
  • 关于变量函数未检测到,这个是我的马虎,之前代码里pecker scanner有对变量函数的扫描的,后来我调试时,误删掉了,已经修复了;
  • 关于不该所有eval 语言结构都不该捕获,这个我认为不妥,应该全部记录。您举例的eval(‘abc’)这种代码,压根无法真行的,没人会把这种代码作为后门。这都不是合法的php代码。 我觉得,没必要为这种代码做太多特殊处理。所以,我坚持目前的做法
  • 如截图中的误报,这个确实有,安全人员可以借助这个工具,阅读报告,自行决定如何处理。对于普通站长,已经有计划实现云判断,这也跟黑哥交流过,做个恶意代码做指纹的。精确到每段token,抛开空白字符等非phptoken,做唯一ID, 到木马特征库中查询是否为恶意代码。如果是,那么属于哪种webshell;不是的话提交到服务器,由专业人员判断,再决定是否入库。之后再遇到的话,就可以检测到了。而且这个版本已经有新的特性在里面,就是为了实现这个功能而做的前期工作。

再次感谢bgho4t的测试,不过对于您的结论“基本上可以断定这个东西的实用价值基本很小了”,伤了我的心。我觉得基于语法扫描的实现方式,跟目前主流的基于正则匹配字符串的方式,不是一个级别的吧。或许不能说一个是石器时代,pecker是铁器时代。起码pecker也能算上青铜器时代吧。 Pecker Scanner很年轻,3天,只是个beta版本,仍需要大量改进,也欢迎您的后续反馈。

关于反馈方式:
建议大家直接联系到我,将反馈告诉我。不然测试报告我不但收不到,而且还不能及时修复,没法完善这个工具,没法更好的帮助到大家。

广告:
eval gzinflate base64_decode pack gzuncompress 等php函数在线解密支持任何格式的以eval语法结构,任意调换顺序,以及其他任何php自带函数的加密(转码)形式的解密。同时支持preg_replace函数的e修饰符形式代码解密。

  1. 我再说一句,呵呵,如果我是互联网公司,我要忍不住奖励给你一个公仔或者Iphone 5s了,可惜,我只是个码农。

    • 第四点那个忘记测试了,呵呵,语法分析在区分代码和字符串方面应该不错,赞一个。
      关于误报和云判断这里就不再纠结了,期待投入生产使用的效果。
      后续会继续关注pecker的发展,有什么想法再和博主交流,哈。

  2. 你好,站长,你一定要帮帮我,因为我的网站最近一年一直被黑,基本上是VPS里的所有wordpress的主要文件如config.php,core.php,主题文件header.php ,footer.php,functions.php,page.php等及wp-includes下的index.php,functions.php等均被加入一段加密的代码
    不知道到底是什么原因,找过插件的原因,换过密码等均不行,至今仍在苦B中,求超度。。

  3. 这位同学,咱能别那么大火气吗?坐下来,静心好好聊。
    这个项目里,哪里用正则去匹配eval了?请点名…谢谢。。。

  4. 执行出现问题呢 atal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes) in /var/www/html/phpcms/pecker/PeckerLite/PeckerScanner.lite.php on line 375