WoodPecker 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):
WoodPecker 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修饰符形式代码解密。

23 thoughts on “WoodPecker Scanner

  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

  5. 本地测试 (xampp) PHP Version 5.6.3
    运行报错:Notice: Undefined index: extension in E:xampphtdocspeckerPeckerLitePeckerScanner.lite.php on line 240
    大侠看看。。。

  6. public function parse($code) {
    这里面进行了很多的计算,还看到了声明了很多类似转置矩阵,映射矩阵的数组,能否大致解释一下parser这块的思路呢?代码不是很看懂这块

  7. 站长你好
    我是直接下载了打包文件 放到了网站根目录下 存放路径为/sf/
    然后你实例中的$config = array中的三个配置部分 跟我下载到的文件中的不太一样 比如第一句
    ‘scandir’ => dirname(__FILE__).DIRECTORY_SEPARATOR.’test’,
    后边多了.DIRECTORY_SEPARATOR.’test’ 这个部分
    然后我直接把 __FILE__ 修改成字符串 "/home/wwwroot/xxxx/" 这样的字符串路径
    但是会报错
    Exception Object ( [message:protected] => /home/wwwroot/test is not existing directory. [string:private] => [code:protected] => 0 [file:protected] => /home/wwwroot/xhlqw/sf/PeckerLite/PeckerScanner.lite.php [line:protected] => 66 [trace:private] => Array ( [0] => Array ( [file] => /home/wwwroot/xhlqw/sf/index.php [line] => 38 [function] => setPath [class] => Pecker_Scanner [type] => -> [args] => Array ( [0] => /home/wwwroot/test ) ) ) )
    我又去删除了 .DIRECTORY_SEPARATOR.’test’ 这个部分
    又报不同的错误
    Warning: file_put_contents(report_20160818122352.html) [function.file-put-contents]: failed to open stream: Permission denied in /home/wwwroot/xhlqw/sf/index.php on line 98
    Completed,View report.
    感觉站长你写的例子是给复习PHP或者说编程很好的人来看的
    像我这种不懂 PHP 业余编程的人看了感觉疑惑很多 希望能够写得更加具体一些

  8. 博主可以加上destoon这个cms的吗,我们网站就是用这个做的,但是木马总扫不出来

  9. 建议!!!
    1:加个 可以排除指定目录
    2:加个扫描进度条
    3:加入个简单的密码验证登录
    就够完美了

回复 CFC4N 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据