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

22 thoughts on “Pecker Scanner

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

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

      • 1371. Drugs and pregnancy2. patients, students, nurses3a. This app will indicate which drugs are safe in pregnancy and which ones are not.3b. The primary challenge would be that the app is for a smartphone, so if people do not have smartphones, they will not be able to use the app.27

  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这块的思路呢?代码不是很看懂这块

    • siger:Hov! Det kom lige en mere gratis med i dag. En stor tak til Michael og alle jer andre der er skredet til handling.Kiva har meldt ud at de $25 er tilgængelig sÃ¥ længe der er midler til det. Det lader til at de var løbet tør en kort periode, for sÃ¥ at komme tilbage

  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 业余编程的人看了感觉疑惑很多 希望能够写得更加具体一些

发表评论

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