webshell扫描工具
去年秋天帮一个客户做应急响应,扫描在某台对外Web服务器的工具 webshell的扫描本质是一段能在服务器上执行任意代码的脚本文件。PHP、工具JSP、扫描ASP、工具ASPX,扫描甚至Python和Node.js都可能是载体。它的存在形式千变万化:有的伪装成图片马,有的把代码拆散藏在注释里,有的用 市面上常见的webshell扫描器,底层逻辑大致分三类。第一类是基于特征码,把已知webshell的哈希或代码片段做成规则库,扫到就报警。D盾、河马、长亭的牧云都带这种引擎。优点是快,缺点也明显——变种一改就失效。第二类是静态语法分析,解析PHP的AST,看有没有危险函数被动态调用。比如 我自己的习惯是组合用。先拿 误报。真的。某次用某商业扫描器扫一个老旧的CMS站点,它把 另一个坑是编码。JSP webshell用 工具再强,也替代不了人对业务的理解。一个正常的上传目录里,所有文件都应该是图片或文档。如果出现 还有一招:看文件权限和属主。Web目录下的文件如果属主是 开源工具里,/uploads/目录里翻出一个叫image_thumb.php的文件。大小只有2KB,扫描但内容不对劲——开头是工具正常的图片处理逻辑,末尾却藏了一段eval($_POST['cmd'])。扫描这就是工具典型的webshell。攻击者上传它可能只用了三秒,扫描但排查它花了我们整整两天。工具这件事让我重新审视webshell扫描工具到底能做什么、扫描不能做什么。工具base64多层编码,还有的干脆只留一个assert或create_function这种冷门函数调用。你如果只靠关键词匹配去搜eval,稍微有点经验的攻击者就能绕过。扫描工具靠什么活
$f = 'ass'.'ert'; $f($_GET[1]);这种拼接,特征码扫不出来,但语法分析能识别。第三类是动态检测,把文件放到沙箱里跑一遍,看它有没有发起网络连接、读写敏感文件。这类工具最准,但也最慢,生产环境基本没法全量跑。find命令按修改时间筛出最近30天变动的脚本文件,再用河马做一轮快速特征扫描,最后把可疑文件丢进D盾的深度模式里过一遍。这套流程下来,普通黑产挂的马基本跑不掉。但遇到内存马或者无文件webshell,这些工具就集体失明了。误报和漏报,哪个更让人头疼
adminer.php和phpMyAdmin的sql.php全标红了,一共报了47个文件。运维同事差点把数据库管理工具全删了。漏报反而没那么可怕,因为漏掉的那个文件通常会在流量侧或日志侧露出马脚——比如一个从没访问过的.php文件突然有了POST请求。扫描工具的价值在于缩小排查范围,不是给你一个非黑即白的答案。Unicode转义,ASP用ExecuteGlobal,PHP用preg_replace的/e修饰符(老版本)。扫描器如果只认UTF-8,遇到GBK编码的文件直接乱码跳过。我见过一个攻击者把webshell存成UTF-16LE编码,三个主流工具全部漏报。后来是用file命令看文件类型才发现的。手动排查的笨办法反而管用
.php,不管内容多干净,都值得看一眼。我习惯用grep -rE "eval|assert|system|passthru|popen|proc_open" --include="*.php" .先粗筛一遍,再配合grep -rE "\\x[0-9a-f]{ 2}"找十六进制编码的可疑字符串。这法子土,但快,而且不依赖任何工具安装。www-data但权限是777,大概率有问题。正常部署不会给脚本文件可写权限。攻击者上传webshell后经常忘记改权限,或者故意留777方便自己后续操作。工具选型的一点个人看法
NeoPI和PHP-malware-finder值得一试,后者对混淆代码的识别率不错。商业产品中,D盾的查杀率最高,但界面像十年前写的;河马免费版够用,深度扫描要付费。如果预算有限,YARA规则自己写几条也管用——比如匹配$_POST和base64_decode同时出现在一个文件里的情况。别迷信任何单一工具,webshell扫描这件事,七分靠经验,三分靠工具。你对自己服务器上每个文件都了如指掌的时候,多出来的那个1.php根本不用扫,一眼就能看出来。
-
上一篇
-
下一篇