jazz-max/scan-webshells
GitHub: jazz-max/scan-webshells
一款基于 Python 的多进程 webshell 扫描与清理工具,用于在服务器被入侵后搜索、隔离和清除 PHP 后门及被注入的恶意代码。
Stars: 0 | Forks: 0
# scan-webshells.py — webshell 扫描与清理工具
用于在服务器遭到入侵后搜索、隔离和清理 webshell / PHP 加载器。
**自主**遍历目录树(不依赖 `xargs` 和参数列表长度),
根据**文件内容**进行扫描(不仅限于扩展名),
支持**全核心**运行,**即时流式输出**发现结果并显示进度。
## 快速开始
```
# 1. 查看受感染情况(不做任何更改,占用所有核心,名称会立即显示)
python3 scan-webshells.py /var/www | tee found.txt
# 2. 预览治疗 + 隔离 — 在不触碰文件的情况下查看计划 ← 首先执行此操作
python3 scan-webshells.py /var/www --quarantine /root/Q --clean-index --dry-run | tee plan.txt
# 3. 实战启动:治疗 index.php + 将完整 shell 移至隔离区
python3 scan-webshells.py /var/www --quarantine /root/Q --clean-index | tee clean.log
```
仅需 Python 3(使用标准库,无需外部包)。
## 参数标志
| 标志 | 功能 |
|---|---|
| `path` | 要扫描的目录(默认为当前目录) |
| `--quarantine DIR` | 将**完整的 shell** 移动到 `DIR`(保留路径) |
| `--clean-index` | 从受感染的 `index.php` 中切除注入代码(备份至 `.bak`) |
| `--dry-run` | 仅显示将要执行的操作 — **不进行任何更改** |
| `--quiet` | 不显示进度条(适用于 cron/日志记录) |
| `-j N`, `--jobs N` | 并行进程数(默认为 CPU 核心数) |
| `-h`, `--help` | 帮助信息 |
## 输出与进度
- **实时输出发现结果**(输出至 `stdout`),一旦检测到即打印 —
无需等待扫描结束:
=== 发现结果 (随检测实时输出) ===
[INJECT] /var/www/.../index.php => goto 加载器 A
[FULL] /var/www/.../accesson.php => accesson 后门
- **进度**信息以单独的可重写行输出至 `stderr` 并显示百分比:
[661800/1412292 46% 发现:95] 32 核心
完成:处理结束,共发现 312 个
- 如果输出未直接连接到交互式终端(
`| tee`、`> file`、`| grep`),进度显示将**自动关闭**,以免造成干扰。也可使用 `--quiet` 标志强制关闭。
- **Ctrl+C** 会安全停止程序:打印“已中断 ... 发现 N 个”且不抛出 traceback;
中断时操作(`--quarantine`/`--clean-index`)**不会执行**
(因为列表不完整)。对于正式环境的运行,请让扫描完整执行完毕。
## 常用运行命令
```
# 仅显示找到的文件列表(不含操作区块)
python3 scan-webshells.py /var/www --dry-run | grep -E '^\[(FULL|INJECT)\]'
# 仅治疗 index.php(不隔离其他内容)
python3 scan-webshells.py /var/www --clean-index
# 仅隔离完整 shell(不触碰 index.php)
python3 scan-webshells.py /var/www --quarantine /root/Q
# 限制负载(负载下的生产环境 - 使用 8 个核心而非 32 个)
python3 scan-webshells.py /var/www -j 8
# 旧单线程模式(调试 / 对比)
python3 scan-webshells.py /var/www --jobs 1
```
## 生产环境推荐流程
```
# 1. 查看计划(写入文件 - 即使终端关闭也会保留完整列表)
python3 scan-webshells.py /var/www --quarantine /root/Q --clean-index --dry-run | tee /root/plan.txt
# 2. 执行(让其运行至结束,请勿中断)
python3 scan-webshells.py /var/www --quarantine /root/Q --clean-index | tee /root/clean.log
# 3. 检查网站是否正常运行
# 4. 之后再删除备份和隔离区
find /var/www -name '*.bak' -newermt '-1 hour' # сначала посмотреть, что удалится
```
在庞大的目录树(数百万文件)中,即使在 32 核心上扫描也会需要几分钟 —
文件名会实时滚动显示,表明进程正在运行。
## 发现结果的分类:FULL 与 INJECT
- **`[FULL]`** — 文件**完全是恶意代码**(`accesson.php`、`cache.php`、`w.php`、`.tmp`,
伪装成媒体的空文件 `.ico/.gif/.wma/.wmv`、BOM-webshell 等)。
这些将由 `--quarantine` 处理(移动即备份)。
- **`[INJECT]`** — **带有顶部恶意插入的正常网站文件**(例如主 `index.php`)。
`--quarantine` **不会触碰**它,而是由 `--clean-index` 仅切除开头的恶意
`` 代码块,并将原件备份到旁边的 `.bak` 文件中。
这两个集合互不相交:`--clean-index` 和 `--quarantine` 可以同时运行。
## 取证:文件日期与清单
`--quarantine` 在移动文件时会保留 **mtime**(修改时间 = 文件写入/出现的时间),
并在隔离文件夹中写入 CSV 清单 `_quarantine_manifest.csv`:
```
original_path,mtime,ctime,size,signatures
/var/www/.../accesson.php,2026-05-12 03:41:09,2026-05-12 03:41:09,212,accesson бэкдор
```
在输出中可直接看到修改时间:`隔离: …/shell.php [修改时间: 2026-05-12 03:41:09]`。
细节说明:
- **mtime** — “文件何时出现”的主要取证指标,原封不动地转移;
- **ctime**(inode 时间)在任何移动/复制时都会改变 — 因此它会在
移动**之前**被提取并记录到清单中;
- 攻击者可能伪造了 mtime(`touch`),因此请将其与 Web 服务器日志及同一文件夹中的相邻
文件进行比对。
## 检测目标
该扫描器针对已知的恶意代码集进行了优化,可捕获多个家族:
- goto 混淆加载器(range 注入、隐藏标记、hex/octal 字符串);
- `Sy1Lz` 打包的 shell(多层 gzinflate/base64);
- WSO / FilesMan(`Watching webshell`、ASCII 伪图形变量);
- xleet shell(`//Pass: xleet`);
- 微型后门 `accesson.php`(`eval(base64_decode($_REQUEST))` + 上传);
- AES 验证的文件管理器(`pw_name_*`);
- 伪装成媒体的空文件的 base64/`zip://` 包含;
- WP 伪装且带有 `eval(pre_term_name())`;
- BOM-webshell(双重 BOM + `@session_start`);
- 微注释 `/*-…-*/` 混淆及十六进制编码的 superglobals;
- 隐藏在媒体/`.txt` 文件中的 PHP 代码(仅在包含危险函数时触发),
以及内部带有 `.tmp` 加载器的 `.zip`。
扫描基于**文件内容**,因此即使是命名为 `logo.png` 的 shell 或
没有扩展名的文件也会被找到。
为了提高速度,会跳过 `vendor/`、`node_modules/`、`.git/` 目录;
每个文件仅读取前 3 MB(注入型加载器总是位于文件开头)。
## 误报
启发式规则经过了调整,以避免在庞大的混合目录树中产生噪音:
- WSO/FilesMan:会在所有文件中搜索字符串 `Watching webshell`,而 ASCII 伪图形变量 `$▛`
**仅在 PHP 文件中**搜索 — 否则字节 `▛` 会大量误报 JPEG 及其他二进制文件;
- `/*-` 混淆**仅在 PHP 文件中检查**(根据扩展名或以 `
标签:DNS 反向解析, Python, WebShell查杀, 库, 应急响应, 恶意软件清理, 文档结构分析, 无后门, 逆向工具