raf-k1/Soc-Home-Lab-v6

GitHub: raf-k1/Soc-Home-Lab-v6

一个基于 Elastic Stack 8.x 的企业级 SOC 家庭实验室,通过三索引架构、Kibana 检测规则和 Telegram 告警实现完整的蓝队威胁检测演练环境。

Stars: 0 | Forks: 0

# 🛡️ SOC 家庭实验室 v6.0 ![状态](https://img.shields.io/badge/Status-Active-brightgreen?style=flat-square) ![版本](https://img.shields.io/badge/Version-6.0.0-blue?style=flat-square) ![技术栈](https://img.shields.io/badge/Stack-Elastic%208.x-005571?style=flat-square&logo=elasticsearch) ![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white) ![MITRE](https://img.shields.io/badge/Framework-MITRE%20ATT%26CK-FF0000?style=flat-square) ![许可证](https://img.shields.io/badge/License-MIT-lightgrey?style=flat-square) ## 📌 目录 - [项目概述](#-project-overview) - [核心功能](#-key-features) - [系统架构](#-architecture) - [索引架构](#-index-architecture) - [技术栈](#-tech-stack) - [前置条件](#-prerequisites) - [文件结构](#-file-structure) - [安装说明](#-setup-instructions) - [Canary Token 设置](#-canary-token-setup-deception-technology) - [Pi-hole DNS 设置](#-pi-hole-dns-setup) - [Kibana Action 文档](#-kibana-action-document) - [攻击模拟 — 杀伤链](#-attack-simulation--kill-chain) - [检测覆盖范围](#-detection-coverage) - [截图](#-screenshots) - [未来改进](#-future-improvements) ## 🔭 项目概述 SOC Home Lab v6.0 是一个完全可运行、借鉴企业级标准的 SOCs(安全运营中心),它模拟了真实的蓝队环境。该实验室通过三个专用的 Elasticsearch 索引来摄取实时的 Windows 端点遥测数据,使用 Kibana Security 检测规则检测威胁,并将实时警报发送至 Telegram Bot——全程自动化,零手动步骤。 **v6.0 引入了专业的 3 索引架构**,它消除了因在单一索引中混合 Sysmon、防火墙和 DNS 字段而导致的映射爆炸问题——这是家庭实验室设置中常见的错误,当字段类型冲突时,会导致 Elasticsearch 拒绝文档。 ## ✨ 核心功能 - **3 索引架构** — 为 Sysmon/Security、防火墙和 DNS 日志提供专用索引,防止映射冲突并提高查询性能 - **纯 ECS 规范化** — Logstash 在索引前将所有字段规范化为 Elastic Common Schema,从而兼容 Kibana 预置检测规则 - **Kibana 原生检测** — 所有威胁检测逻辑均位于 Kibana Security Rules 中,与摄取和传输层完全分离 - **欺骗技术** — Canary Token 蜜罐文件 (`passwords.txt`) 在被任何形式的访问时,会产生零误报的 CRITICAL(严重)警报 - **DNS 可见性** — Pi-hole 作为 DNS 沉洞,阻止 C2 域名并在 Kibana 中提供完整的 DNS 查询可见性 - **智能字段提取** — Python 引擎使用 `get_f()` 回退函数来处理不同 Winlogbeat 版本中的扁平化和嵌套 ECS 字段路径 - **零警报疲劳** — 基于 `_id` 的去重机制即使在重启时也能消除重复的 Telegram 消息 - **防崩溃检查点** — 警报 ID 在每次发送后保存;当在第 25/50 个警报时发生崩溃,将从第 26 个恢复,而不是从第 1 个重新开始 - **动态警报标题** — Telegram 标题由 `kibana.alert.rule.name` 驱动——新规则无需更改代码即可生成正确的通知 - **从源头降噪** — Beats 处理器在大量良性事件消耗带宽之前将其丢弃 ## 🏗️ 系统架构 ``` ┌──────────────────────────────────────────────────────────────────────────────┐ │ TIER 1 — GATHER & FILTER (Ingestion + Normalization) │ │ │ │ Windows Victim (192.168.2.11) │ │ ├─ Sysmon → Process, Network, File events (EID 1,3,11,4663...) │ │ ├─ Windows Firewall → pfirewall.log (DROP/ALLOW per connection) │ │ ├─ Winlogbeat → Sysmon + Security logs → Logstash :5055 │ │ └─ Filebeat → pfirewall.log → Logstash :5055 │ │ │ │ Pi-hole (Docker on Manager) │ │ └─ DNS queries + blocked domains → Filebeat → Logstash :5055 │ │ │ │ Logstash (192.168.2.7:5055) — Pure ECS Normalization │ │ ├─ Branch A: agent.type=winlogbeat → ECS rename → winlogbeat-* │ │ ├─ Branch B: agent.type=filebeat + windows_firewall → dissect → │ │ │ filebeat-firewall-* │ │ └─ Branch C: agent.type=filebeat + pihole → grok → pihole-logs-* │ └──────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ TIER 2 — DETECT (Kibana Security Rules) │ │ │ │ Rules monitor: winlogbeat-* + filebeat-firewall-* + pihole-logs-* │ │ ├─ Port Scan → filebeat-firewall-* | Threshold >500 DROPs/1min │ │ ├─ Successful Logon → winlogbeat-* | EID 4624 │ │ ├─ PowerShell Exec → winlogbeat-* | Sysmon EID 1 (whoami etc.) │ │ ├─ Persistence → winlogbeat-* | EID 4698 new scheduled task │ │ ├─ Canary Token → winlogbeat-* | EID 4663 on passwords.txt │ │ ├─ Suspicious Outbound → winlogbeat-* | Sysmon EID 3 on port 4444 │ │ ├─ C2 Exfiltration → winlogbeat-* | Threshold on outbound volume │ │ └─ DNS C2 → pihole-logs-* | Blocked domain queries │ │ │ │ On trigger → Index Action → .alerts-security.alerts-default │ └──────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ TIER 3 — NOTIFY (Python Telegram Engine) │ │ │ │ soc_alert_engine_v6.py (runs on Manager 192.168.2.7) │ │ ├─ Polls .alerts-security.alerts-default every 60 seconds │ │ ├─ Deduplicates by _id → sent_ids.json (crash-safe) │ │ ├─ get_f() extracts fields via nested + flat fallback chain │ │ ├─ Formats Classic Style Markdown with dynamic rule name title │ │ └─ Delivers to Telegram Bot via Bot API → 📱 Telegram │ └──────────────────────────────────────────────────────────────────────────────┘ ``` ## 📊 索引架构 3 索引架构是 v6.0 的核心改进。每个日志源都有一个具有自己字段映射的专用索引——消除了 Elasticsearch 映射冲突。 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ Source │ Agent │ Tag │ Index │ ├─────────────────────────────────────────────────────────────────────────┤ │ Sysmon + Security │ winlogbeat │ sysmon, windows │ winlogbeat-* │ │ Windows Firewall │ filebeat │ windows_firewall │ filebeat- │ │ │ │ │ firewall-* │ │ Pi-hole DNS │ filebeat │ pihole │ pihole-logs-* │ └─────────────────────────────────────────────────────────────────────────┘ ``` **为什么这很重要:** 在单索引设置中,Sysmon 的 `winlog.event_data.DestinationPort`(字符串)和防火墙的 `destination.port`(整数)会产生字段类型冲突。Elasticsearch 会拒绝其中之一。3 索引架构为每个源提供了自己的映射命名空间——零冲突,保证完整的数据完整性。 ## 🛠️ 技术栈 | 层级 | 技术 | 作用 | |-------|-----------|------| | **SIEM** | Elasticsearch | 日志存储,3 个专用索引 | | **检测** | Kibana Security | 检测规则,警报生成 | | **流水线** | Logstash | ECS 规范化,3 索引路由 | | **端点代理** | Winlogbeat | Sysmon + Security 日志转发器 | | **防火墙代理** | Filebeat | pfirewall.log 转发器 | | **DNS 防御** | Pi-hole (Docker) | DNS 沉洞 + 查询可见性 | | **遥测** | Sysmon | 深度 Windows 事件日志记录 | | **告警** | Python 3.10+ | Kibana 警报 → Telegram | | **通知** | Telegram Bot API | 实时 SOC 通知 | | **攻击者** | Kali Linux | 攻击模拟 | | **受害者** | Windows 10 | 目标端点 | ## 📋 前置条件 ### 基础设施 - **管理机**(Linux Mint,IP:`192.168.2.7`)运行 Elasticsearch、Kibana、Logstash、Docker - **Windows 10 虚拟机**(IP:`192.168.2.11`)配置有 Sysmon、Winlogbeat、Filebeat - **Kali Linux 虚拟机**(IP:`192.168.2.5`)—— 可从受害者机器通过网络访问 ### Python ``` pip install elasticsearch requests ``` ### Telegram Bot 1. 搜索 `@BotFather` → `/newbot` → 复制 `BOT_TOKEN` 2. 搜索 `@userinfobot` → `/start` → 复制 `CHAT_ID` ### Windows 防火墙日志记录(受害者虚拟机 — 以管理员身份运行) ``` netsh advfirewall set allprofiles logging droppedconnections enable netsh advfirewall set allprofiles logging allowedconnections enable netsh advfirewall set allprofiles logging filename "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" netsh advfirewall set allprofiles logging maxfilesize 32767 ``` ### Windows 安全审计(受害者虚拟机) ``` auditpol /set /subcategory:"Logon" /success:enable /failure:enable auditpol /set /subcategory:"File System" /success:enable /failure:enable auditpol /set /subcategory:"Other Object Access Events" /success:enable ``` ## 📁 文件结构 ``` soc-home-lab-v6/ │ ├── README.md ├── .gitignore │ ├── Logstash/ │ └── all-in2.conf ← 3-index routing pipeline │ ├── Beats/ │ ├── winlogbeat.yml ← Sysmon + Security forwarder │ └── filebeat.yml ← Firewall log forwarder │ ├── Docker/ │ └── docker-compose.yml ← Pi-hole DNS sinkhole setup │ ├── Python/ │ └── soc_alert_engine_v6.py ← Kibana alerts → Telegram │ └── ELK_Screenshots/ ├── Nmap.png ├── Nmap2.png ├── Telegram_Nmap.jpg ├── Logon.png ├── Logon2.png ├── Telegram_Logon.jpg ├── Process.png ├── Process2.png ├── Telegram_process.jpg ├── Rules.png ← Overview of Detection Rules ├── sch_task.png ├── sch_task2.png ├── Telegram_sch_task.jpg ├── Canary.png ├── Canary2.png ├── Telegram_Canary.jpg ├── C2.png ├── C2_2.png ├── Telegram_C2.jpg ├── Outbound.png ├── Outbound2.png ├── Telegram_outbound.jpg └── Telegram_start.jpg ``` ## ⚙️ 安装说明 ### 1. Logstash 流水线 ``` cp logstash/all-in.conf /etc/logstash/conf.d/ # 在输出块中编辑密码 sudo systemctl restart logstash sudo journalctl -u logstash -f ``` ### 2. Windows 受害者机上的 Beats ``` # Winlogbeat cd "C:\Program Files\Winlogbeat" .\winlogbeat.exe test config -c .\winlogbeat.yml .\winlogbeat.exe test output -c .\winlogbeat.yml Start-Service winlogbeat # Filebeat cd "C:\Program Files\Filebeat" .\filebeat.exe test config -c .\filebeat.yml .\filebeat.exe test output -c .\filebeat.yml Start-Service filebeat ``` ### 3. 验证 3 个索引已创建 启动 Beats 后,在 Kibana 中验证: ``` Stack Management → Index Management ``` 你应该能看到:`winlogbeat-*`、`filebeat-firewall-*`、`pihole-logs-*` ### 4. Python 引擎 ``` # 在 soc_alert_engine_v6.py 中编辑 ES_HOST = "http://192.168.2.7:9200" ES_PASSWORD = "YOUR_ELASTIC_PASSWORD" TELEGRAM_TOKEN = "YOUR_BOT_TOKEN" TELEGRAM_CHATID = "YOUR_CHAT_ID" ``` ``` python3 python/soc_alert_engine_v6.py ``` ## 🪤 Canary Token 设置(欺骗技术) Canary Token 是放置在明显位置的蜜罐文件。任何访问都是活跃攻击者的**零误报指标**——没有合法的流程应该打开此文件。 ### 步骤 1 — 创建蜜罐文件(受害者虚拟机) ``` # 创建具有说服力的虚假凭据文件 New-Item -Path "C:\Users\$env:USERNAME\Desktop\passwords.txt" -ItemType File Set-Content -Path "C:\Users\$env:USERNAME\Desktop\passwords.txt" -Value @" # 公司管理员凭据 - 机密 Administrator: P@ssw0rd!2024 backup_admin: Backup#9981 domain_admin: D0m@in`$ecure sql_service: SqlSvc!Pass123 remote_access: RDP_Acc3ss! "@ ``` ### 步骤 2 — 启用文件系统审计 ``` # 启用审计策略 auditpol /set /subcategory:"File System" /success:enable /failure:enable # 仅对 canary 文件应用审计规则 $file = "C:\Users\$env:USERNAME\Desktop\passwords.txt" $acl = Get-Acl $file $rule = New-Object System.Security.AccessControl.FileSystemAuditRule( "Everyone", "ReadData", "Success" ) $acl.SetAuditRule($rule) Set-Acl -Path $file -AclObject $acl # 验证 (Get-Acl -Path $file -Audit).Audit # 预期:Everyone | ReadData | Success ``` ### 步骤 3 — Kibana 检测规则 ``` Security → Rules → Create New Rule → Custom Query Index: winlogbeat-* ``` ``` winlog.event_id: 4663 AND file.path: *passwords.txt* ``` | 设置项 | 值 | |---------|-------| | 名称 | `🪤 CANARY TOKEN — Password File Accessed` | | 严重性 | 严重 | | 风险评分 | 99 | | 运行频率 | 每 1 分钟 | ### 工作原理 ``` Attacker opens passwords.txt → Windows EID 4663 fires (File System Audit) → Winlogbeat → Logstash → winlogbeat-* → Kibana Rule matches (file.path: *passwords.txt*) → Alert → .alerts-security.alerts-default → Python Engine → Telegram CRITICAL 🚨 ``` ## 🌐 Pi-hole DNS 设置 Pi-hole 作为整个实验室网络的 DNS 沉洞。每台设备的每个 DNS 查询都流经 Pi-hole,提供完整的 DNS 可见性,并在已知的 C2 域名解析前将其阻止。 ### 部署 Pi-hole(管理机 — Docker) ``` mkdir -p /home/raf/pihole/etc-pihole mkdir -p /home/raf/pihole/etc-dnsmasq.d docker run -d \ --name pihole \ -p 53:53/tcp -p 53:53/udp \ -p 8080:80 \ -e TZ="Europe/Athens" \ -e WEBPASSWORD="YOUR_PIHOLE_PASSWORD" \ -e PIHOLE_DNS_1=8.8.8.8 \ -e PIHOLE_DNS_2=1.1.1.1 \ -v /home/raf/pihole/etc-pihole:/etc/pihole \ -v /home/raf/pihole/etc-dnsmasq.d:/etc/dnsmasq.d \ --restart unless-stopped \ pihole/pihole:latest ``` ### 将所有虚拟机的 DNS 指向 Pi-hole 在 **Windows 受害者机**上(以管理员身份运行): ``` # 将 Pi-hole 设置为主 DNS netsh interface ip set dns "Ethernet" static 192.168.2.7 # 验证 nslookup google.com 192.168.2.7 ``` 在 **Kali Linux** 上: ``` echo "nameserver 192.168.2.7" | sudo tee /etc/resolv.conf ``` ### Pi-hole 如何提供 C2 可见性 ``` Malware on victim beacons to: evil-c2.tk → DNS query → Pi-hole (192.168.2.7) ├─ Domain in gravity blocklist → BLOCKED → returns 0.0.0.0 └─ Domain not blocked → forwarded to 8.8.8.8 Pi-hole logs ALL queries → Filebeat → Logstash → pihole-logs-* → Kibana Rule: "Blocked domain" OR "suspicious TLD (.tk .ml .xyz)" → Alert → Telegram 🌐 ``` ### 用于检测 DNS C2 的 Kibana 检测规则 ``` # 已屏蔽域名 dns.question.name: * AND dns.resolved_ip: "0.0.0.0" ``` ``` # 可疑 TLD dns.question.name: *.tk OR dns.question.name: *.ml OR dns.question.name: *.xyz OR dns.question.name: *.pw ``` ## 📦 Kibana Action 文档 对于每个 Security Detection Rule,设置 **Index Connector** 动作,将 ECS 字段映射到 `.alerts-security.alerts-default` 中: ``` { "@timestamp": "{{date}}", "kibana.alert.rule.name": "{{rule.name}}", "kibana.alert.severity": "{{context.rule.severity}}", "kibana.alert.risk_score": "{{rule.riskScore}}", "kibana.alert.reason": "{{context.reason}}", "host.name": "{{context.alerts.[0].host.name}}", "user.name": "{{context.alerts.[0].user.name}}", "source.ip": "{{context.alerts.[0].source.ip}}", "destination.ip": "{{context.alerts.[0].destination.ip}}", "destination.port": "{{context.alerts.[0].destination.port}}", "network.transport": "{{context.alerts.[0].network.transport}}", "process.command_line": "{{context.alerts.[0].process.command_line}}", "process.name": "{{context.alerts.[0].process.name}}", "file.path": "{{context.alerts.[0].file.path}}", "winlog.event_id": "{{context.alerts.[0].winlog.event_id}}", "winlog.event_data.CommandLine": "{{context.alerts.[0].winlog.event_data.CommandLine}}", "winlog.event_data.Image": "{{context.alerts.[0].winlog.event_data.Image}}", "event.action": "{{context.alerts.[0].event.action}}", "tags": ["soc_alert", "kibana_rule"] } ``` ## ☠️ 攻击模拟 — 杀伤链 ### 杀伤链概览 | # | 阶段 | MITRE 战术 | 技术 | 来源 | 检测 | |---|-------|-------------|-----------|--------|-----------| | 1 | 侦察 | TA0043 | T1595 — 主动扫描 | Kali | filebeat-firewall-* 阈值 | | 2 | 初始访问 | TA0001 | T1078 — 有效账户 | Windows | winlogbeat-* EID 4624 | | 3 | 执行 | TA0002 | T1059.001 — PowerShell | Windows | winlogbeat-* Sysmon EID 1 | | 4 | 持久化 | TA0003 | T1053.005 — 计划任务 | Windows | winlogbeat-* EID 4698 | | 5 | 收集 | TA0009 | T1005 — 本地数据 | Windows | winlogbeat-* EID 4663 Canary | | 6 | 命令与控制 | TA0011 | T1071 — 应用层协议 | Windows | winlogbeat-* Sysmon EID 3 | | 7 | 数据渗出 | TA0010 | T1041 — 通过 C2 通道渗出 | Windows | winlogbeat-* 阈值 | ![规则预览](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/582719dcbf211206.png) ![Python 脚本启动](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/79fceffa33211207.jpg) ### 步骤 1 — 侦察:Nmap 端口扫描 (T1595) **目标:** 在 `filebeat-firewall-*` 上触发 Kibana 阈值规则——在 1 分钟内来自单一源 IP 的超过 500 个 DROP 事件。 ``` # 在 Kali (192.168.2.5) 上 # -sS = SYN 隐蔽扫描 | -A = 操作系统检测 + 脚本 | -p- = 所有 65535 个端口 # -Pn = 跳过主机发现(将主机视为在线) sudo nmap -Pn -sS -A -p- --min-rate 1000 192.168.2.11 ``` **发生过程:** - Windows 防火墙将数百个 DROP 事件记录到 `pfirewall.log` - Filebeat 将它们发送 → Logstash → `filebeat-firewall-*` - 当计数在 1 分钟内超过 500 时,Kibana 阈值规则触发 - Telegram 接收到:`🟠 PORT SCAN DETECTED` ![Nmap 扫描 — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/b98580c219211209.png) ![Nmap 扫描 — Discover](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c18dc404c3211210.png) ![Telegram Nmap 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/942ad4aeed211212.jpg) ### 步骤 2 — 初始访问:成功登录检测 (T1078) **发生过程:** - 成功交互式登录到 `labuser` 账户会生成 Windows EID 4624 - Winlogbeat 将事件发送 → Logstash → `winlogbeat-*` - Kibana Custom Query Rule 检测到成功登录 - Telegram 接收到:`🔴 SUCCESSFUL LOGON DETECTED` ``` winlog.event_id: 4624 AND winlog.logon.type: "3" AND user.name: "labuser" ``` ![成功登录 — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e6c2ca0601211214.png) ![成功登录 — Discover](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/116e9c92b0211216.png) ![Telegram 登录警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d44d98be25211217.jpg) ### 步骤 3 — 执行:PowerShell 命令检测 (T1059.001) **在 Windows 受害者虚拟机上**,执行基本的 PowerShell 命令,以模拟攻击者在获取访问权限后进行信息收集: ``` # 像攻击者那样运行——简单的发现命令 whoami Get-LocalUser ipconfig /all ``` **发生过程:** - Sysmon EID 1(进程创建)捕获每次 PowerShell 调用 - `process.command_line` 字段记录确切的命令(例如 `whoami`) - Kibana Custom Query Rule 在 PowerShell 执行时触发 - Telegram 接收到所运行的确切命令 ``` winlog.event_id: 1 AND process.name: "powershell.exe" ``` ![PowerShell 执行 — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/348561721d211219.png) ![PowerShell 执行 — Discover](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/2a276f918f211220.png) ![Telegram PowerShell 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/cf5ec11baa211222.jpg) ### 步骤 4 — 持久化:计划任务创建 (T1053.005) **在 Windows 受害者虚拟机上**,创建计划任务以模拟攻击者建立持久化: **发生过程:** - Windows Security EID 4698(计划任务已创建)立即触发 - Winlogbeat 将事件发送 → Logstash → `winlogbeat-*` - Kibana Custom Query Rule 匹配 EID 4698 - Telegram 接收到:`🔴 PERSISTENCE — SCHEDULED TASK CREATED` ``` winlog.event_id: 4698 AND winlog.event_data.TaskName: *WindowsUpdateHelper* ``` ![计划任务 — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/da42bab496211224.png) ![计划任务 — Discover](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/154851655e211225.png) ![Telegram 持久化警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/becfe587c7211227.jpg) ### 步骤 5 — 收集:Canary Token 已激活 (T1005) **在 Windows 受害者虚拟机上**,攻击者发现并打开了蜜罐凭据文件: ``` # 模拟攻击者在获取访问权限后打开 honeypot 文件 notepad.exe "C:\Users\$env:USERNAME\Desktop\passwords.txt" ``` **发生过程:** - Windows 文件系统审计在文件打开时立即触发 EID 4663 - `file.path` 字段确认访问了确切的 Canary 文件 - Kibana Custom Query Rule 匹配——风险评分 99(最高可能值) - Telegram 接收到:`🚨 CANARY TOKEN TRIGGERED`——确认主机上存在攻击者 ``` winlog.event_id: 4663 AND file.path: *passwords.txt* ``` ![Canary Token — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/76c3178262211228.png) ![Canary Token — Discover](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/311cc81d74211230.png) ![Telegram Canary 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/cf95ad125e211232.jpg) ### 步骤 6 — 命令与控制:可疑出站连接 (T1071) **MITRE ATT&CK:** 命令与控制 — [T1071 应用层协议](https://attack.mitre.org/techniques/T1071/) **场景:** 建立持久化后,攻击者向 Kali 机器上模拟的命令与控制服务器发起出站连接。此步骤验证 SOC 是否能检测到 `powershell.exe` 建立到非标准、可疑端口的网络连接。 在 Kali 攻击者机器上打开一个 `netcat` 监听器,以模拟等待信标的 C2 服务器: ``` # 在 Kali (192.168.2.5) 上 — 在端口 4444 开启 C2 监听器 nc -lvnp 4444 ``` 在 **Windows 受害者机**上,以下 PowerShell 命令模拟 C2 信标: ``` PS C:\Windows\system32> Test-NetConnection -ComputerName 192.168.2.5 -Port 4444 ``` **发生过程:** - Sysmon EID 3(网络连接)捕获到出站 TCP 连接 - 关键字段:`process.name: powershell.exe`、`destination.ip: 192.168.2.5`、`destination.port: 4444` - 端口 4444 是默认 C2 框架的已知指标——来自用户端点到此端口的任何出站连接都具有高可信度 - Kibana Custom Query Rule 立即触发 - Telegram 接收到:`🚨 SUSPICIOUS OUTBOUND CONNECTION DETECTED` ``` winlog.event_id: 3 AND destination.port: 4444 AND process.name: "powershell.exe" ``` | 设置项 | 值 | |---------|-------| | 规则类型 | Custom Query | | 严重性 | 高 | | 风险评分 | 73 | | 索引 | `winlogbeat-*` | ![可疑出站连接 — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7a74bd2b99211234.png) ![可疑出站连接 — Discover 中的 Sysmon EID 3](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c198ef0aca211235.png) ![Telegram 出站连接警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d387719f35211239.jpg) ### 步骤 7 — 数据渗出:潜在 C2 数据渗出 (T1041) **MITRE ATT&CK:** 数据渗出 — [T1041 通过 C2 通道渗出](https://attack.mitre.org/techniques/T1041/) **场景:** 在步骤 6 中建立了 C2 通道后,攻击者通过向同一外部 IP 生成大量出站网络连接来模拟数据渗出。这模拟了恶意软件暂存和传输收集到的数据(如文件、凭据或屏幕截图)回传到攻击者基础设施的模式。 此步骤具体演示了**纵深防御**:C2 通道在步骤 6 中通过特征(端口 4444)被检测到,而渗出在步骤 7 中通过**数量异常**被检测到——这是一个不同且互补的检测层。 **模拟 — 生成大量出站流量:** ``` # 在 Windows 受害者上 — 模拟重复的出站连接 # 模拟到 C2 服务器的数据窃取循环 1..50 | ForEach-Object { Test-NetConnection -ComputerName 192.168.2.5 -Port 4444 Start-Sleep -Milliseconds 200 } ``` **发生过程:** - 每次迭代都会在 `winlogbeat-*` 中生成一个 Sysmon EID 3 事件 - Kibana 阈值规则统计滚动时间窗口内到同一目标 IP 的 EID 3 事件 - 当数量超过阈值时,它标志着异常的数据传输——不是一次性连接,而是与分阶段渗出一致的持续出站通道 - Telegram 接收到:`🚨 POTENTIAL C2 EXFILTRATION — VOLUME ANOMALY DETECTED` ``` winlog.event_id: 3 AND destination.ip: "192.168.2.5" AND process.name: "powershell.exe" ``` **Kibana 阈值规则:** | 设置项 | 值 | |---------|-------| | 规则类型 | Threshold | | 分组依据 | `destination.ip` | | 阈值条件 | `2 分钟内` `IS ABOVE 20` | | 严重性 | 严重 | | 风险评分 | 90 | | 索引 | `winlogbeat-*` | ![C2 渗出 — Kibana 警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8376382b25211240.png) ![C2 渗出 — Discover 中的流量](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c0fc4898c3211242.png) ![Telegram 渗出警报](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c44ecb8878211244.jpg) ### 杀伤链关联查询 以下单条 KQL 查询可在 Kibana Discover 中重建所有 7 个步骤的**整个攻击时间线**: ``` (winlog.event_id: (4624 OR 4663 OR 4698)) OR (winlog.event_id: 1 AND process.name: "powershell.exe") OR (winlog.event_id: 3 AND destination.port: 4444) OR (winlog.event_id: 3 AND destination.ip: "192.168.2.5") OR (event.action: "drop" AND source.ip: "192.168.2.5") ``` ## 🎯 检测覆盖范围 下表列出了**此 SOC 实验室能够执行的所有检测**,包括上述杀伤链中演示的检测以及其他独立功能。 ### 杀伤链检测 | 攻击 | MITRE 战术 | 技术 | 源索引 | 规则类型 | |--------|-------------|-----------|-------------|-----------| | Nmap 端口扫描 | 侦察 | T1595 | filebeat-firewall-* | Threshold | | 成功登录 | 初始访问 | T1078 | winlogbeat-* | Custom Query | | PowerShell 执行 (`whoami`) | 执行 | T1059.001 | winlogbeat-* | Custom Query | | 计划任务创建 | 持久化 | T1053.005 | winlogbeat-* | Custom Query | | Canary Token 已激活 | 收集 | T1005 | winlogbeat-* | Custom Query | | 可疑出站端口 | 命令与控制 | T1071 | winlogbeat-* | Custom Query | | 潜在 C2 数据渗出 | 数据渗出 | T1041 | winlogbeat-* | Threshold | ### 附加功能 以下检测在实验室中已配置并激活。它们不属于上述线性杀伤链模拟的一部分,但已完全可操作: | 检测项 | MITRE 技术 | 源索引 | 规则类型 | 备注 | |-----------|----------------|-------------|-----------|-------| | DNS C2 信标 | T1071.004 | pihole-logs-* | Custom Query | 通过 Pi-hole 检测被阻止的域名和可疑的 TLD (.tk .ml .xyz) | | 新增 Windows 服务 | T1543.003 | winlogbeat-* | Custom Query | EID 7045 — 常见的恶意软件持久化方法 | | 审计日志被清除 | T1070.001 | winlogbeat-* | Custom Query | EID 1102 — 攻击者掩盖痕迹 | | PowerShell 编码命令 | T1059.001 | winlogbeat-* | Custom Query | `-EncodedCommand` / `-enc` 标志检测 | ## 📸 截图 所有截图均位于 `ELK_Screenshots/` 文件夹中,并直接嵌入到上方的杀伤链部分。下表提供了参考摘要: | 文件 | 阶段 | 描述 | |------|-------|-------------| | `Nmap.png` | 步骤 1 | Kibana — Nmap 扫描产生的 filebeat-firewall-* DROP 事件 | | `Nmap2.png` | 步骤 1 | Kibana — Nmap 阈值警报已触发 | | `Telegram_Nmap.jpg` | 步骤 1 | Telegram 端口扫描警报 | | `Logon.png` | 步骤 2 | Kibana — 成功登录警报 | | `Logon2.png` | 步骤 2 | Kibana — Discover 中的 EID 4624 | | `Telegram_Logon.jpg` | 步骤 2 | Telegram 成功登录警报 | | `Process.png` | 步骤 3 | Kibana — Sysmon EID 1 PowerShell / whoami 检测 | | `Process2.png` | 步骤 3 | Kibana — process.command_line 字段详细信息 | | `Telegram_process.jpg` | 步骤 3 | Telegram PowerShell 执行警报 | | `sch_task.png` | 步骤 4 | Kibana — 持久化警报已触发 | | `sch_task2.png` | 步骤 4 | Kibana — Discover 中的 EID 4698 计划任务 | | `Telegram_sch_task.jpg` | 步骤 4 | Telegram 持久化警报 | | `Canary.png` | 步骤 5 | Kibana — Canary Token CRITICAL 警报 | | `Canary2.png` | 步骤 5 | Kibana — 风险评分 99 警报详细信息 | | `Telegram_Canary.jpg` | 步骤 5 | Telegram CRITICAL Canary 警报 | | `C2.png` | 步骤 6 | Kibana — Sysmon EID 3 powershell.exe → 端口 4444 | | `C2_2.png` | 步骤 6 | Kibana — Discover 中的可疑出站连接详细信息 | | `Telegram_C2.jpg` | 步骤 6 | Telegram 可疑出站连接警报 | | `Outbound.png` | 步骤 7 | Kibana — C2 渗出阈值警报已触发 | | `Outbound2.png` | 步骤 7 | Kibana — Discover 中的大量出站连接 | | `Telegram_outbound.jpg` | 步骤 7 | Telegram 潜在 C2 数据渗出警报 | | `Telegram_start.jpg` | 设置 | Telegram — Python 引擎启动通知 | ## 🚀 未来改进 - **TheHive 集成** — 根据 Kibana 警报自动创建事件案例,以实现完整的事件生命周期管理 - **MITRE ATT&CK Navigator** — 将检测覆盖范围导出为 Navigator 层,以可视化盲区 - **GeoIP 富化** — Logstash GeoIP 过滤器,将 `source.ip` 映射到 Kibana 世界地图上的国家 - **Elastic Defend EDR** — 在发生 CRITICAL 警报时,主动隔离端点并阻止进程 - **Sigma 规则导入** — 自动将社区 Sigma 规则转换为 Kibana 检测规则 - **自动化响应剧本** — 在发生 CRITICAL 警报时触发 Python 脚本以禁用账户或阻止 IP ## ⚠️ 法律与道德声明 所有攻击模拟均在我自己拥有的系统上,于隔离的家庭实验室环境中专门进行。本项目仅用于教育目的和 SOC 作品集展示。切勿对您不拥有或未获得明确书面测试许可的系统使用这些技术。 ## 📄 许可证 MIT License — 详见 `LICENSE`。
**为蓝队社区而建 🛡️** ![Elasticsearch](https://img.shields.io/badge/Elastic-005571?style=flat&logo=elasticsearch&logoColor=white) ![Kibana](https://img.shields.io/badge/Kibana-005571?style=flat&logo=kibana&logoColor=white) ![Logstash](https://img.shields.io/badge/Logstash-005571?style=flat&logo=logstash&logoColor=white) ![Python](https://img.shields.io/badge/Python-3776AB?style=flat&logo=python&logoColor=white) ![Docker](https://img.shields.io/badge/Docker-2496ED?style=flat&logo=docker&logoColor=white) ![Windows](https://img.shields.io/badge/Windows-0078D6?style=flat&logo=windows&logoColor=white) ![Kali](https://img.shields.io/badge/Kali_Linux-557C94?style=flat&logo=kali-linux&logoColor=white) ![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?style=flat&logo=telegram&logoColor=white) ![MITRE](https://raw.githubusercontent.com/raf-k1/Soc-Home-Lab-v6/main/://img.shields.io/badge/MITRE%20ATT%26CK-FF0000?style=flat)
标签:AMSI绕过, Canary Tokens, Cloudflare, DNS安全, Elasticsearch 8.x, Elastic Stack, IP 地址批量处理, MITRE ATT&CK, OISF, PE 加载器, Pi-hole, Python, SOC实验室, Sysmon, Telegram机器人, 企业级安全架构, 内容过滤, 威胁检测, 子域名变形, 安全运营中心, 家庭实验室, 开源安全工具, 插件系统, 无后门, 日志管理, 杀伤链, 流量重放, 端点遥测, 网络安全, 网络安全审计, 网络攻击模拟, 网络映射, 蜜罐, 证书利用, 请求拦截, 越狱测试, 逆向工具, 逆向工程平台, 防御欺骗技术, 隐私保护