sankettaware16/sigma-rules-moodle

GitHub: sankettaware16/sigma-rules-moodle

一套面向 Moodle 学习管理系统的 Sigma 威胁检测规则,基于 Web 服务器访问日志覆盖凭证攻击、数据外发、Web Shell 等十二类检测场景。

Stars: 0 | Forks: 0

# Moodle 的 Sigma 规则 用于 Moodle 学习管理系统的检测规则,基于 Web 服务器访问日志编写。 Moodle 是教育领域部署最广泛的应用之一,目前尚无针对它的公开 Sigma 覆盖。 本规则包是一个起点:包含十二条规则,涵盖了凭证攻击、Web 服务 token 滥用、批量个人数据收集、Web Shell 以及侦察活动。 ## 目录结构 ``` rules/web/moodle/ Rules intended for upstream contribution to SigmaHQ internal/ Organisation-specific rules - NOT for upstream pipelines/ pySigma conversion pipeline and placeholder examples ``` ## 日志源 所有上游规则均使用 `logsource: category: webserver` 以及在该类别的 [Sigma 分类附录](https://sigmahq.io/sigma-specification/specification/sigma-appendix-taxonomy.html) 中定义的 W3C 字段名: | Sigma 字段 | 含义 | ECS 等效字段 | | --------------- | -------------------- | -------------------------- | | `c-ip` | 客户端地址 | `source.ip` | | `cs-method` | HTTP 方法 | `http.request.method` | | `cs-uri-stem` | 请求路径 | `url.path` | | `cs-uri-query` | 查询字符串 | `url.query` | | `sc-status` | HTTP 状态码 | `http.response.status_code`| | `cs-user-agent` | user agent | `user_agent.original` | | `cs-referer` | referrer | `http.request.referrer` | Apache 和 nginx 的 combined 日志格式将路径和查询记录为一个单独的请求字段。如果你的采集 pipeline 没有将它们拆分,请在解析时拆分它们,或者在转换之前将 `cs-uri-stem` 的匹配方式 调整为 `contains`。 ## 转换 ``` pip install sigma-cli pysigma-backend-elasticsearch sigma convert -t lucene -p pipelines/moodle_ecs_apache.yml rules/web/moodle/ ``` 首先编辑 pipeline 的 `moodle_scope_to_log_source` 转换中的 `event.module` 值,以便 将转换后的查询范围限定为你的 Moodle 访问日志,而不是你收集的每一条 Web 日志。 关联规则需要支持它们的后端。在撰写本文时,支持情况参差不齐;如果你的 后端不支持,请转换基础规则并原生实现聚合功能(例如 Elastic threshold 规则、Splunk 的 `stats` 子句等)。基础规则及其关联位于同一个文件中, 以 `---` 分隔。 ## 规则 ### 凭证访问 | 规则 | 触发条件 | | ---- | ------- | | `web_moodle_login_brute_force.yml` | 5 分钟内来自同一来源的 15 次失败登录 | | `web_moodle_webservice_token_brute_force.yml` | 10 分钟内来自同一来源的对 `/login/token.php` 的 20 次请求 | | `web_moodle_session_key_reuse.yml` | 30 分钟内从 3 个以上的源地址呈现同一个 `sesskey` 值 | 关于 Moodle 的登录行为,有两点值得了解,它们都会悄无声息地破坏以常规方式编写的规则: - **失败的登录返回 HTTP 200**,而不是 401 或 403。Moodle 会重新渲染登录表单并附带错误 消息。成功的登录会返回 30x 重定向。任何基于 4xx 状态码过滤 `/login/index.php` 的规则都不会触发。 - **对于错误的凭证,`/login/token.php` 会返回 HTTP 200 以及 JSON 错误主体**。状态码 同样无法在此区分成功与失败,因此 token 规则以请求速率为关键指标。 ### 收集与数据外发 | 规则 | 触发条件 | | ---- | ------- | | `web_moodle_webservice_sensitive_wsfunction_call.yml` | 5 分钟内 20 次调用批量 用户/选课/成绩 的 `wsfunction` | | `web_moodle_bulk_assignment_submission_download.yml` | 5 分钟内 50 次单个作业提交文件下载 | ### 执行与持久化 | 规则 | 触发条件 | | ---- | ------- | | `web_moodle_php_execution_in_upload_path.yml` | 对 Moodle 上传或静态路径下的 `.php` 文件返回 200 响应 | | `web_moodle_executable_download_from_file_storage.yml` | 通过 `pluginfile.php` 提供可执行文件或脚本 | | `web_moodle_cron_endpoint_external_access.yml` | 从非私有地址请求 `/admin/cron.php` | ### 侦察与可用性 | 规则 | 触发条件 | | ---- | ------- | | `web_moodle_path_enumeration.yml` | 5 分钟内来自同一来源的针对 Moodle 路径的 30 次 404 响应 | | `web_moodle_webservice_server_errors.yml` | 5 分钟内 Web 服务端点产生 10 次 5xx 响应 | | `web_moodle_ajax_service_flood.yml` | 2 分钟内来自同一来源的 200 次 AJAX 服务请求 | | `web_moodle_admin_interface_external_access.yml` | 从非私有地址成功访问 `/admin/` | ## 调优 本规则包中的每个阈值都是初始值,而非建议值。有两个环境因素 主导了误报率: **共享出口地址。** 如果你的用户通过校园 NAT、企业代理或 运营商网络访问 Moodle,单个 `c-ip` 代表数千人。基于速率的规则 —— AJAX 泛洪、 路径枚举、登录暴力破解 —— 将不断触发。要么大幅提高阈值, 要么排除这些范围并依赖其他信号来监控内部流量。 **反向代理。** 如果 Web 服务器记录的是代理地址而不是真实客户端,本规则包中的每个 `c-ip|cidr` 过滤器都会反转:CIDR 规则将无法匹配任何内容,并且 `internal/` 中的 地理位置规则将不会产生有用的输出。在部署任何 以客户端地址为关键指标的规则之前,请确认你记录了 `X-Forwarded-For`。 ### 改进 session key 规则 `web_moodle_session_key_reuse.yml` 按原始查询字符串进行分组,这只会将完整查询在字节上完全相同的请求分在一组——因此它存在检测不足的问题。要解决此问题,请在提取时将 sesskey 值提取到其自己的 字段中,并将 `group-by` 更改为该字段。使用 Elastic ingest pipeline: ``` { "grok": { "field": "url.query", "patterns": ["sesskey=%{WORD:moodle.sesskey}"], "ignore_missing": true, "ignore_failure": true } } ``` 然后使用 `group-by: [moodle.sesskey]`。此更改将一种近似方法转变为可靠的会话 劫持检测。 ## 覆盖盲区 这些规则仅查看 Web 访问日志,这意味着它们无法看到任何未更改 URL 的内容。特别是,它们无法检测角色分配、能力重写、Web 服务 token 创建、站点配置更改或插件安装——所有这些都是 Moodle 站点上 最为关键的权限提升步骤。 这些活动在 Moodle 自己的事件日志(`\core\event\role_assigned`、 `\core\event\webservice_token_created`、`\core\event\config_log_created` 等)中可见,可以使用其中一个 `logstore_*` 插件将其发送到 SIEM。针对这些事件的规则需要 一个 Sigma 分类中尚不存在的 `category: application, product: moodle` 日志源, 添加它需要向规范存储库提交提案。这显然是下一阶段的工作。 ## 许可证 旨在根据 [Detection Rule License 1.1](https://github.com/SigmaHQ/Detection-Rule-License) 贡献给 SigmaHQ。
标签:AMSI绕过, Moodle, Reconnaissance, Sigma规则, Web安全, 威胁检测, 安全, 实时处理, 数据泄露, 目标导入, 蓝队分析, 超时处理