DetectEng-SOCLabs/detection-rule-bypass-analyzer

GitHub: DetectEng-SOCLabs/detection-rule-bypass-analyzer

专为检测工程师设计的AI技能,通过分析命令解析特性发现规则盲点并生成绕过测试用例,以提升检测规则鲁棒性。

Stars: 4 | Forks: 0

# 检测规则绕过分析器 ## 📖 简介 **Detection Rule Bypass Analyzer** 是专门为检测工程师和安全工程师创建的 Skill。 其主要目的是帮助检测工程师发现 **系统命令执行** 检测规则中的覆盖盲点。通过利用真实操作系统的命令解析特性,它评估规则绕过的风险,并自动生成具体的绕过测试用例,从而减少漏报,提高检测规则的鲁棒性。 ## 🚀 使用方法 此 Skill 支持 Claude Code、Cursor、Codex 和其他类似的 AI 编程助手。 **示例查询:** ## 📊 示例输出 一旦触发,模型将严格遵循预定义的结构输出分析结果: # 检测规则绕过分析:`split -b` **分析对象规则:** ``` index=detectiontable Image="/usr/bin/split" ParentImage="/usr/bin/bash" | Regex CommandLine="split\s-b" ``` ## 🎯 1. 规则背景与检测目标 `split -b` 命令将文件分割成固定大小的字节块,允许攻击者将大型敏感文件(例如数据库转储、归档文件、凭据存储)拆分成小块,以便通过带宽受限或受监控的通道进行隐蔽传输。 ## 🔍 2. 规则匹配逻辑解构 ### 条件分解 | 条件 | 字段 | 操作符 | 值 | 识别出的缺陷 | |:---|:---|:---|:---|:---| | 进程镜像 | `Image` | 精确 `=` | `/usr/bin/split` | 硬编码路径;遗漏 `/bin/split` 或相对路径调用 | | 父进程 | `ParentImage` | 精确 `=` | `/usr/bin/bash` | 硬编码为 bash;遗漏 `zsh`、`sh`、`dash`、`fish`、`csh`、`cron`、`systemd` | | 命令行 | `CommandLine` | 正则 | `split\s-b` | 要求 `split` 后紧跟 **一个** 空白字符,然后是 `-b`;遗漏长选项、选项捆绑、交错参数 | ## ⚠️ 3. 绕过可行性结论 ## 🛡️ 4. 绕过测试用例 *注意:以下命令均可在标准 Linux 系统上成功执行,并实现按字节大小分割文件的相同目标。* ### 4.1 参数与语法绕过(核心命令) | # | 命令 | 结果 | 绕过技术 | 命中/遗漏原因 | |:--|:---|:---:|:---|:---| | 1 | `split -b 1m largefile.tar` | 🟢 命中 | 原始基线 | 匹配所有条件:镜像路径、ParentImage 和正则模式 `split\s-b` | | 2 | `split --bytes=1m largefile.tar` | 🔴 遗漏 | **长选项替换** | 正则要求 `-b`;`--bytes` 是 GNU 长格式等效项,但命令行包含 `split --bytes`,不匹配 `split\s-b` | | 3 | `split --bytes 1m largefile.tar` | 🔴 遗漏 | **长选项(空格分隔)** | 同上;使用空格分隔值的 `--bytes` 也不匹配正则 | | 4 | `split -d -b 1m largefile.tar` | 🔴 遗漏 | **参数交错** | 正则在 `split` 位置匹配并看到 `split -d`,而不是 `split -b`;`-b` 出现在后面,但前面没有紧跟 `split` | | 5 | `split -a3 -b 1m largefile.tar` | 🔴 遗漏 | **参数交错** | 正则将 `split\s` 匹配到 `split -a`,而不是 `split -b`;后缀长度选项 `-a3` 破坏了所需的相邻关系 | | 6 | `split -db 1m largefile.tar` | 🔴 遗漏 | **选项捆绑 (POSIX)** | `-db` 捆绑了 `-d`(数字后缀)和 `-b`(字节);正则看到 `split -db`,不匹配 `split\s-b`,因为 `\s` 之后的字符是 `-d` 而不是 `-b` | | 7 | `split -b1m largefile.tar` | 🟢 命中 | 值连接(仍然匹配) | 命令行为 `split -b1m ...`;正则 `split\s-b` 仍然匹配,因为存在 `split -b` 子字符串 | | 8 | `split -C 1m largefile.tar` | 🔴 遗漏 | **等效选项替换** | `-C` / `--line-bytes` 按字节大小分割,同时遵守行边界 — 实现相同的渗出目标;完全在正则范围之外 | | 9 | `split --line-bytes=1m largefile.tar` | 🔴 遗漏 | **等效长选项** | `--line-bytes` 是 `-C` 的长格式;相同的分割能力,完全不匹配 | | 10 | `split -n 10 largefile.tar` | 🔴 遗漏 | **等效选项 (`-n` / `--number`)** | 将文件分割为 N 个大小相等的块;实现相同的分块目标,根本不使用 `-b` | ### 4.2 执行上下文绕过(ParentImage / Image) | # | 场景 | 结果 | 绕过技术 | 遗漏原因 | |:--|:---|:---:|:---|:---| | 11 | 从 `zsh` 调用 (ParentImage=`/usr/bin/zsh`) | 🔴 遗漏 | **父进程变化** | `ParentImage="/usr/bin/bash"` 是精确匹配;`zsh` 被排除 | | 12 | 从 `sh` 调用 (ParentImage=`/bin/sh` 或 `/usr/bin/sh`) | 🔴 遗漏 | **父进程变化** | `sh` 不是 `bash`;许多脚本使用 `#!/bin/sh` | | 13 | 从 `dash` 调用 (ParentImage=`/usr/bin/dash`) | 🔴 遗漏 | **父进程变化** | `dash` 是 Debian/Ubuntu 上的默认 `/bin/sh` | | 14 | 从 `cron` 调用 (ParentImage=`/usr/sbin/cron`) | 🔴 遗漏 | **非 Shell 父进程** | 计划任务在 `cron` 下执行,而不是 `bash` | | 15 | 从 `systemd` 或服务单元调用 | 🔴 遗漏 | **非 Shell 父进程** | 服务在 `systemd` 下生成进程 | | 16 | 二进制文件位于 `/bin/split` 的系统 | 🔴 遗漏 | **镜像路径变化** | 在 `/bin` 未符号链接到 `/usr/bin` 的系统上,`Image` 字段不同 | | 17 | 通过 `env split -b 1m file` 调用 | 🔴 遗漏 | **包装器执行** | `Image` 变为 `/usr/bin/env`,而不是 `/usr/bin/split` | | 18 | 从另一个 Shell 通过 `bash -c "split -b 1m file"` 调用 | 🔴 遗漏 | **嵌套执行** | 如果外部 Shell 是 `zsh`,则 `bash -c` 生成 bash,但该 bash 的 ParentImage 是 `zsh` | ### 4.3 替代工具绕过(相同渗出目标,不同二进制文件) | # | 命令 | 结果 | 技术 | 备注 | |:--|:---|:---:|:---|:---| | 19 | `dd if=largefile.tar bs=1m count=1 skip=0 of=chunk_00` | 🔴 遗漏 | 不同二进制文件 (`dd`) | 具有偏移量控制的手动分块;多个块需要循环 | | 20 | `csplit largefile.tar 1048576 {*}` | 🔴 遗漏 | 不同二进制文件 (`csplit`) | 基于上下文的分割;可以按字节偏移分割 | | 21 | `python3 -c "d=open('f','rb').read();[open(f'c{i}','wb').write(d[i:i+1048576]) for i in range(0,len(d),1048576)]"` | 🔴 遗漏 | 脚本语言绕过 | 完全不同的进程树 | | 22 | `perl -e 'open F,"<","largefile";while(read F,$b,1048576){open O,">","chunk_".$i++;print O $b}'` | 🔴 遗漏 | 脚本语言绕过 | 通过 Perl 实现相同功能 | ## 🔧 5. 推荐的规则改进 ### 选项 A:改进正则(最小更改) ``` index=detectiontable (Image="/usr/bin/split" OR Image="/bin/split") | regex CommandLine="(?i)split\s+.*(-b[\s=]?\d|--bytes[\s=]\d|-C[\s=]?\d|--line-bytes[\s=]\d|-n[\s=]?\d|--number[\s=]\d)" ``` **更改:** - 完全移除 `ParentImage` 约束(或扩展为广泛的 Shell 列表) - 添加 `/bin/split` 作为备用镜像路径 - 使用 `split\s+.*` 允许 `split` 和目标标志之间有任意选项 - 覆盖 `-b`、`--bytes`、`-C`、`--line-bytes`、`-n`、`--number` - 使用 `(?i)` 进行不区分大小写的匹配 ### 选项 B:更广泛的检测策略 ``` index=detectiontable (Image IN ("/usr/bin/split", "/bin/split", "/usr/bin/csplit", "/bin/csplit")) | regex CommandLine="(split|csplit)\s+" ``` 结合针对基于 `dd` 的分块的单独规则: ``` index=detectiontable (Image IN ("/usr/bin/dd", "/bin/dd")) | regex CommandLine="dd\s+.*if=.*bs=.*of=" ``` ### 关键改进原则 | 当前弱点 | 建议 | |:---|:---| | 硬编码 `ParentImage="/usr/bin/bash"` | 移除或扩展为 `IN ("/usr/bin/bash", "/bin/bash", "/usr/bin/sh", "/bin/sh", "/usr/bin/zsh", "/usr/bin/dash", "/usr/bin/fish")` | | 硬编码 `Image="/usr/bin/split"` | 使用 `IN ("/usr/bin/split", "/bin/split")` | | 正则 `split\s-b` 要求紧邻 | 使用 `split\s+.*-b` 或 `split\s+.*--bytes` 允许交错选项 | | 仅匹配 `-b` | 添加 `--bytes`、`-C`、`--line-bytes`、`-n`、`--number` | | 不覆盖选项捆绑 | 使用字符类模式 `-[a-z]*b` 捕获 `-db` 等捆绑选项 | ## 📋 6. 绕过维度总结 | 维度 | 绕过数量 | 严重性 | |:---|:---:|:---| | 长/短选项替换 | 3 | 高 — 攻击者极易实现 | | 参数交错 / 重排 | 2 | 高 — 实际使用中常见 | | 选项捆绑 (POSIX) | 1 | 中 — 需要特定标志组合 | | 等效选项替换 (`-C`, `-n`) | 3 | 高 — 目标相同,标志不同 | | 父进程变化 | 5 | 高 — 任何非 bash 上下文 | | 镜像路径变化 | 2 | 中 — 取决于系统 | | 替代工具绕过 | 4 | 高 — 完全不同的二进制文件 | | **唯一绕过向量总计** | **20** | | *Analysis generated by Detection Rule Bypass Analyzer* Produced by **SOCLabs**
标签:AI编程助手, C2, 命令执行, 安全运营, 应用安全, 扫描框架, 漏斗分析, 系统命令解析, 网络安全, 规则分析, 误报降低, 隐私保护