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安全, 威胁检测, 安全, 实时处理, 数据泄露, 目标导入, 蓝队分析, 超时处理