AhmetPayaslioglu/web-log-anomaly-detector

GitHub: AhmetPayaslioglu/web-log-anomaly-detector

一款轻量级的 Web 访问日志异常检测工具,通过正则规则与滑动窗口分析自动识别 OWASP Top 10 攻击、webshell、CVE 利用及暴力破解行为。

Stars: 1 | Forks: 1

# 日志异常检测器 (LAD) [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Tests](https://img.shields.io/badge/tests-40%20passing-brightgreen)]() ## 为什么需要? Web 访问日志几乎记录了触及你服务器的每一次攻击 —— 问题在于没有人去阅读它们。`grep` 适用于查找单一模式;但当你需要知道昨天是五十种不同攻击类别中的*哪一种*击中了你,在哪一行,来自哪个 IP,以及服务器是否放行了它时,`grep` 就无能为力了。 **LAD** 只需解析一次日志,即可生成一份彩色的报告,回答以下问题: - **什么**被发送到了服务器(涵盖 16 种攻击类别的 90 多条 regex 规则) - **在哪里**(日志中的行号 + 哪个 HTTP 字段 —— path / query / UA / referer) - **谁**发送了它(源 IP、扫描器 User-Agent 指纹) - **攻击成功了吗?**(HTTP 状态码 —— 绿色 = 2xx 成功,红色 = 4xx/5xx 被拦截) ## 功能 - 开箱即用的**三种日志格式**:nginx combined、Apache combined、 IIS W3C(动态 `#Fields:` header —— 适用于任何列布局) - 根据文件头或文件名**自动检测格式** - **90 多条模式规则**,涵盖 OWASP Top 10、webshell 和 CVE 漏洞利用路径 - 针对 Web 身份验证暴力破解、流量尖峰和 目录爆破的**有状态检测器**(滑动窗口逻辑,而不仅仅是 regex) - **丰富的终端输出** —— 彩色严重程度、行号、高亮匹配项、 状态码着色(成功与失败) - **JSON 输出**,可通过管道传入 SIEM / 仪表盘 / 脚本 - **Tail 模式**(`--follow`),用于实时监控活动日志 - **自定义规则** —— 每个 regex 和阈值都位于一个单独的 YAML 文件中 - **没有沉重的依赖** —— `click`、`rich`、`pyyaml`。仅此而已。 ## OWASP Top 10 (2021) 覆盖范围 | OWASP | 检测到的类别 | |----------------------------------------|----------------------------------------------| | A01 Broken Access Control | `traversal`, `forced_browse`, `ssrf` | | A02 Cryptographic Failures | *(无法从访问日志中检测)* | | A03 Injection | `sqli`, `nosqli`, `xss`, `cmdi`, `ssti`, `xxe` | | A04 Insecure Design | *(设计层面,无法检测)* | | A05 Security Misconfiguration | `sensitive_files`(`.env`、`.git`、`actuator`、`web.config`、备份文件、数据库转储) | | A06 Vulnerable & Outdated Components | `log4shell`, `spring4shell`, `shellshock`, `cve_paths`(Struts2、ProxyShell、GitLab CVE-2021-22205、PHPUnit、Confluence、ThinkPHP、Solr、F5 BIG-IP、Citrix、vCenter 等) | | A07 Identification & Auth Failures | `auth_brute`(滑动窗口 401/403/419/429)、`scanner` | | A08 Software & Data Integrity Failures | `deserialization`(Java `rO0AB`、.NET ViewState、PHP `O:n:`、Python pickle) | | A09 Security Logging Failures | *(检测器本身有助于解决此问题)* | | A10 Server-Side Request Forgery | `ssrf`(AWS/GCP/Azure 元数据、RFC1918、`file://`、`gopher://`) | **超越 OWASP:** | 类别 | 捕获内容 | |-------------|--------------------------------------------------------------------| | `webshell` | c99 / r57 / wso / b374k / alfa / China Chopper / antSword / 双扩展名上传 / `.php` 上的 `cmd=` 参数 | | `scanner` | sqlmap、nikto、nmap、gobuster、feroxbuster、ffuf、nuclei、Burp、ZAP、Acunetix、Nessus 等(User-Agent + 目录爆破启发式检测) | | `traffic` | 每个 IP 的滑动窗口每秒请求数 (RPS) 尖峰 | ## 快速开始 ``` git clone https://github.com//web-log-anomaly-detector cd web-log-anomaly-detector python -m pip install -e . ``` 扫描其中一个内置的合成日志,立即查看输出: ``` python -m log_anomaly_detector.cli scan examples/owasp_sample.log ``` 这会在一个 46 行的文件上生成**涵盖 41 条不同规则的 52 个发现结果** —— 涵盖每一个 OWASP 类别,以及 webshell、CVE 和暴力破解突发流量。 ### 用法 ``` # 自动检测格式 lad scan /var/log/nginx/access.log # 强制指定格式 lad scan u_ex260616.log --format iis # 为下游工具编写 JSON lad scan access.log --json-out findings.json # 使用你自己的规则 lad scan access.log --rules my_rules.yaml # Tail 模式 — 持续读取新行(按 Ctrl+C 停止) lad scan /var/log/nginx/access.log --follow ``` ### 示例输出 ``` L# SEV ST CATEGORY RULE FIELD MATCH --------------------------------------------------------------------------------- 2 HIGH 200+ sqli union_select query UNION SELECT 6 CRITICAL 500- cmdi shell_chain query ;cat 12 CRITICAL 200+ ssrf aws_metadata query 169.254.169.254 17 CRITICAL 200+ log4shell jndi_lookup query ${jndi:ldap: 20 CRITICAL 500- shellshock bash_function_def user_agent () { :; }; 27 CRITICAL 200+ webshell common_webshell_name path /c99.php 31 CRITICAL 500- cve_paths struts2_ognl query #_memberAccess 42 HIGH 401- auth_brute web_auth_brute path 8x 401 on /wp-login.php Status legend: '+' = 2xx success '-' = 4xx/5xx failure '~' = other ``` **绿色**状态意味着服务器*成功响应* —— 如果它与 CRITICAL(严重)发现结果配对,那这就是你需要优先调查的行。 ## 自定义规则 每个 regex、阈值和严重程度都位于一个单独的文件中: [`src/log_anomaly_detector/rules/default.yaml`](src/log_anomaly_detector/rules/default.yaml)。 ``` injection: sqli: - name: union_select severity: HIGH pattern: "\\bunion\\b.{0,40}\\bselect\\b" webshell: - name: common_webshell_name severity: CRITICAL pattern: "/(c99|r57|wso|b374k|alfa|...)\\.(php|asp|aspx|jsp)" auth_brute: login_path_pattern: "(login|signin|wp-login|api/auth|...)" window_seconds: 60 min_failures: 8 failure_statuses: [401, 403, 419, 429] severity: HIGH ``` 复制该文件,进行调整,然后通过 `--rules my_rules.yaml` 传入。 ## 项目布局 ``` src/log_anomaly_detector/ parsers/ nginx / apache / IIS (W3C dynamic #Fields:) line parsers detectors/ injection (regex pack), scanner (UA + dir-bust), traffic (RPS), auth_brute (sliding 401/403) reporters/ rich terminal table + JSON rules/ default.yaml — all patterns and thresholds cli.py click entry point: `lad scan ...` tests/ pytest suite (40 tests, OWASP coverage) examples/ synthetic logs covering every category ``` ## 工作原理 1. **解析** —— 每一行都被转换为 `LogEntry`(时间戳、IP、method、 path、query、状态码、UA、referer)。IIS 解析会读取 `#Fields:` 指令,因此适用于任何列顺序。 2. **扫描** —— 每个 `LogEntry` 被输入到四个检测器系列: - `InjectionDetector` —— 对六个 候选字段(path、query、URL 编码的 URL、解码后的 URL、UA、referer)运行 `rules.yaml` 中的每一条 regex, 因此跨越 path+query 或隐藏在 header 中的攻击仍然可以匹配。 - `ScannerDetector` —— User-Agent 匹配 + 每个目录爆破的 IP( 不同 path 数量 × 4xx 比例)。 - `TrafficDetector` —— 每个源 IP 的滑动窗口 RPS 尖峰。 - `AuthBruteDetector` —— 类似登录 endpoint 上的滑动窗口身份验证失败。 3. **报告** —— 发现结果按行号排序,根据严重程度和 HTTP 状态着色,并作为 `rich` 表格打印;可选择序列化为 JSON。 每个发现结果都记录了 `line_no`、匹配的子字符串、发现它的字段, 以及服务器返回的 HTTP 状态,以便你立即判断 攻击是被拦截了还是通过了。 ## 路线图 - [ ] 用于 `--follow` 模式的 Discord / Slack / Telegram webhook - [ ] GeoIP 丰富信息(MaxMind GeoLite2) - [ ] 按 IP 分组报告(`--group-by ip`) - [ ] 用于 RPS / endpoint 异常的 ML 基线(Isolation Forest) - [ ] 用于自定义检测器的插件架构 - [ ] HTML 报告 ## 测试 ``` pip install pytest python -m pytest -q ``` 40 个测试覆盖了解析器、每个 OWASP 类别、webshell 模式、CVE 指纹以及身份验证暴力破解检测器。 ## 许可证 [MIT](LICENSE) —— 可免费使用、修改和分发。如果 LAD 帮助你在生产环境中捕获了 恶意攻击,欢迎在 GitHub 上点个 star ⭐。
标签:AMSI绕过, CISA项目, Python, Web安全, 威胁检测, 恶意代码分类, 无后门, 蓝队分析, 逆向工具