SirBruceWoodland/azure-sentinel-honeypot-lab

GitHub: SirBruceWoodland/azure-sentinel-honeypot-lab

一个基于 Azure Sentinel 的蜜罐实验室项目,通过暴露诱饵服务器捕获真实攻击流量,演示完整的 SIEM 部署、威胁检测与事件响应流程。

Stars: 0 | Forks: 0

# Azure Sentinel SIEM 蜜罐实验室 **网络安全作品集项目 - Edward Antonucci - 2026年6月** ## 概述 本项目演示了使用 Microsoft Azure 进行云原生 SIEM 的端到端部署与运营。一台 Windows Server 2022 蜜罐 VM 被故意暴露在公共互联网上的三个服务(RDP、SSH、HTTP)中,以吸引真实的攻击流量,这些流量随后被 Microsoft Sentinel 和 Microsoft Defender XDR 接收、分析、可视化并进行响应。 **门户说明:** 在此项目期间,Microsoft 开始将 Sentinel 从 Azure 门户迁移到统一的 Microsoft Defender 门户(`security.microsoft.com`)。截图反映了这两种环境——这镜像了活跃过渡期间的真实场景(完全迁移预计在 2027 年 3 月 31 日)。 ## 仪表板摘要 | 指标 | 数值 | |---|---| | 安全事件总数 | 80,800+ | | 触发的警报总数 | 95 | | 事件总数 | 6 | | 唯一攻击者 IP | 43+ | | 来源国家 | 遍布 5 大洲的 15 个国家 | | SSH 探测事件 (NOUSER) | 5,742+ | | IIS Web 探测请求 | 599+ | image ## 架构 所有资源均部署在专用的资源组(`RG-Sentinel-Lab`,West US 区域)中: | 组件 | 详情 | |---|---| | **Log Analytics Workspace** | `LAW-Sentinel-Lab` - 集中式数据存储 | | **Microsoft Sentinel** | 工作区之上的 SIEM 层 | | **蜜罐 VM** | Windows Server 2022 Datacenter, Standard D2s v3 | | **网络安全组** | `DANGER_AllowAnyInbound` 规则 - 暴露所有端口;在事件响应 (IR) 期间添加了针对性的拒绝规则 | | **数据收集规则** | `DCR-Honeypot` - Azure Monitor Agent 流式传输安全事件 + IIS 日志 | | **暴露的服务** | RDP (3389), SSH (22 通过 OpenSSH), HTTP (80 通过 IIS) | ### 为什么要禁用防火墙? 禁用 Windows 防火墙并将 NSG 入站设置为允许所有流量,是为了最大限度地提高蜜罐的有效性。在生产环境中,这将是灾难性的配置错误,但在这里是故意的,旨在创建尽可能大的攻击面,并观察自动扫描仪和僵尸网络首先探测的内容。 ### 为什么拒绝规则的优先级是 200? NSG 规则按数字从小到大进行评估。优先级 100 已被 `DANGER_AllowAnyInbound` 占用,因此针对攻击者的特定拒绝规则被置于优先级 200。在生产环境中,“允许所有”的规则将不存在,而针对性的拒绝规则将处于较低的优先级编号,位于更宽松的规则之上。 ## 实时攻击仪表板 多面板 Sentinel Workbook 可视化攻击流量,并进行 5 分钟自动刷新。 ### Workbook 描述(标题块) ### 面板 1:全球攻击地图 通过自定义 Sentinel Watchlist (`AttackerGeoDataV2`) 对 IP 地址进行地理扩充,其中填充了来自 ipinfo.io 的纬度/经度。热力图按失败登录次数进行缩放。 **KQL:** ``` SecurityEvent | where EventID == 4625 | summarize FailedLogins = count() by AttackerIP = IpAddress | join kind=inner (_GetWatchlist('AttackerGeoDataV2')) on $left.AttackerIP == $right.IPAddress | project AttackerIP, FailedLogins, Country, Latitude, Longitude ``` ### 面板 2:攻击国家/地区 Top 10 柱状图 ``` SecurityEvent | where EventID == 4625 | where isnotempty(IpAddress) | summarize FailedLogins = count() by AttackerIP = IpAddress | join kind=inner (_GetWatchlist('AttackerGeoDataV2')) on $left.AttackerIP == $right.IPAddress | summarize TotalAttempts = sum(FailedLogins) by Country | sort by TotalAttempts desc | take 10 ``` image ### 最终攻击地图统计(所有时间) | 国家/地区 | 尝试次数 | 值得注意的 ASN | |---|---|---| | 🇳🇱 荷兰 | 441 | SKYNET NETWORK LTD (AS214295), Liteserver | | 🇮🇩 印度尼西亚 | 232 | PT Telekomunikasi Indonesia | | 🇺🇸 美国 | 120 | 多家 VPS 提供商 | | 🇻🇳 越南 | 76 | VNPT Corp | | 🇫🇷 法国 | 46 | Contabo GmbH, OVH | | 🇸🇬 新加坡 | 36 | Contabo Asia, Tencent | | 🇧🇷 巴西 | 28 | BattleHost, Gamers Club | | 🇬🇧 英国 | 26 | Contabo, Kamatera | | 🇵🇪 秘鲁 | 22 | Red Cientifica Peruana, ON Empresas | | 其他 | 20 | 罗马尼亚、芬兰、德国、比利时、中国香港 | ## 关键发现:SSH 攻击流量与 NOUSER 现象 在启用 OpenSSH Server 后,**出现了 5,742 个失败的身份验证事件,这些事件没有 IP 地址,账户名为 `NOUSER` 或为空白**。 ### 为什么 SSH 失败在 Windows 日志中不显示 IP 这是 SSH 和 RDP 在操作系统身份验证层的一个根本区别: 当 SSH 连接在到达 Windows 身份验证**之前**失败时——例如,客户端在密钥交换之后但在发送凭据之前断开连接——Windows 会记录事件 ID 4625,但**没有可记录的 IP 上下文**,因为失败发生在 SSH 协议层而不是 Windows 安全层。 此外,Windows 上的 OpenSSH 会记录到其自己的文件 (`C:\ProgramData\ssh\logs\`) 中,与 Windows 安全事件日志分开。到达密码身份验证阶段的失败 SSH 尝试可能根本不会生成事件 ID 4625,这取决于尝试的身份验证方法。 ### 这意味着什么 这 5,742 个 NOUSER 事件代表了**处于侦察阶段的自动化 SSH 扫描器**——它们探测开放的 SSH,检查支持的 身份验证方法,并在尝试凭据之前断开连接。这与针对 SSH 的僵尸网络行为一致。 ### 如何正确捕获 SSH IP(生产环境方法) - 在蜜罐旁边部署一台 **Linux VM** - Linux 的 `sshd` 日志可捕获完整的 IP 上下文 - 启用 **Azure Defender for Servers** 以获取额外的网络级遥测数据 - 在 Windows 上配置 **OpenSSH 详细日志记录 (verbose logging)**,并通过自定义 Log Analytics 数据收集规则进行摄取 - 使用 **Azure Network Watcher NSG 流日志** 来捕获所有连接级别的数据,无论身份验证结果如何 image ## 编写的 KQL 查询 ### 事件清单 - 所有安全事件类型 ``` SecurityEvent | summarize count() by EventID, Activity | sort by count_ desc ``` ### 按攻击者 IP 进行的失败登录分析 ``` SecurityEvent | where EventID == 4625 | where isnotempty(IpAddress) | summarize FailedLogins = count() by AttackerIP = IpAddress | sort by FailedLogins desc ``` ### 完整登录事件时间线 ``` SecurityEvent | where EventID in (4625, 4624, 4648) | summarize count() by EventID, Activity, IpAddress | sort by count_ desc ``` ### 暴力破解检测 (Analytics Rule) ``` SecurityEvent | where EventID == 4625 | where TimeGenerated > ago(5m) | summarize FailedAttempts = count() by AttackerIP = IpAddress, Computer, Account | where FailedAttempts >= 10 ``` ### 使用 Watchlist 地理扩充的攻击地图 ``` SecurityEvent | where EventID == 4625 | summarize FailedLogins = count() by AttackerIP = IpAddress | join kind=inner (_GetWatchlist('AttackerGeoDataV2')) on $left.AttackerIP == $right.IPAddress | project AttackerIP, FailedLogins, Country, Latitude, Longitude ``` ### Top 10 国家/地区柱状图 ``` SecurityEvent | where EventID == 4625 | where isnotempty(IpAddress) | summarize FailedLogins = count() by AttackerIP = IpAddress | join kind=inner (_GetWatchlist('AttackerGeoDataV2')) on $left.AttackerIP == $right.IPAddress | summarize TotalAttempts = sum(FailedLogins) by Country | sort by TotalAttempts desc | take 10 ``` ### Web 攻击探测检测 (IIS) ``` W3CIISLog | where csUriStem in ("/wp-admin", "/wp-login.php", "/.env", "/phpmyadmin", "/admin", "/administrator", "/xmlrpc.php", "/.git/config", "/config.php", "/backup", "/.aws/credentials") | summarize ProbeCount = count() by AttackerIP = cIP, csUriStem | where ProbeCount >= 1 ``` ## Analytics 规则 image ### 规则 1:暴力破解检测 - 失败登录 | 设置 | 值 | |---|---| | 严重性 | 中 | | 查询频率 | 每 5 分钟 | | 查找窗口 | 过去 5 分钟 | | 警报阈值 | 当查询返回 > 0 个结果时触发 | | 逻辑 | 当单个 IP 在 5 分钟内有 10 次以上失败登录时发出警报 | | MITRE ATT&CK | 凭据访问 — **T1110 (暴力破解)** | | 警报分组 | 同一 IP 在 5 小时内被归为单个事件 | ### 规则 2:Web 攻击探测检测 | 设置 | 值 | |---|---| | 严重性 | 中 | | 查询频率 | 每 1 小时 | | 查找窗口 | 过去 1 小时 | | 警报阈值 | 当查询返回 > 0 个结果时触发 | | 逻辑 | 当任何 IP 探测 IIS 上的常见 Web 攻击路径时发出警报 | | MITRE ATT&CK | 侦察 — **T1595 (主动扫描)** | | 警报分组 | 同一 IP 在 1 小时内被归为单个事件 | ## 自动化响应 - Logic App Playbook 构建了一个 Logic App playbook (`Notify-BruteForce-Alert`) 来自动化事件通知。该 playbook 使用 Microsoft Sentinel 事件触发器,并在暴力破解事件触发时向 ntfy.sh 发送 HTTP POST 请求。 **HTTP 操作(针对 email connector 验证限制的替代方案):** ``` { "Send_an_alert": { "type": "Http", "inputs": { "method": "POST", "uri": "https://ntfy.sh/sentinel-honeypot-alert", "body": "Brute Force Detected on honeypot-vm - check Microsoft Sentinel" } } } ``` **RBAC 限制说明:** 通过“自动化”选项卡将 playbook 连接到 Analytics rule 时,需要在 Sentinel 托管标识上拥有 `Microsoft Sentinel Automation Contributor` 角色。此角色在免费层上不可用。在生产环境中,可以通过在资源组级别通过 IAM 授予该角色来解决此问题。Playbook 本身已成功构建并发布。 ## 事件响应演练 针对主要威胁行为者(`45.142.193.166` / SKYNET NETWORK LTD,荷兰)执行的完整 SOC 事件响应工作流: | 步骤 | 操作 | |---|---| | **1. 检测** | 通过针对事件 ID 4625 的 KQL 发现了 14 次失败的 RDP 登录尝试。IP 归属于荷兰的 SKYNET NETWORK LTD (AS214295)。 | | **2. 创建事件** | 在 Microsoft Defender XDR 中创建了事件 #2。严重性:中。类别:凭据访问 (MITRE ATT&CK)。资产:honeypot-vm。 | | **3. 分配与分类** | 将事件分配给分析师,状态从新建 (New) 更改为进行中 (In Progress)。 | | **4. 调查** | KQL 确认来自攻击者 IP 的成功登录为零。匿名网络扫描被评估为低风险(登录类型 3,无凭据)。 | | **5. 补救** | 为 `45.142.193.166`(优先级 200)添加了 NSG 入站拒绝规则,以在网络边界阻止进一步的访问。 | | **6. 关闭** | 事件分类:**真阳性 — 恶意用户活动**。状态:已解决。导出了官方 Microsoft Security 事件报告 PDF。 | image ## 威胁情报观察 ### Contabo GmbH - 频繁出现的基础设施 Contabo GmbH (AS51167) 是一家低成本的德国 VPS 提供商,出现在法国、新加坡和其他地区。威胁情报报告中经常将 Contabo 引用为被攻击者大量滥用的基础设施,因为其成本低、身份验证极少,并且历史上对滥用行为的响应缓慢。 ### SKYNET NETWORK LTD - 头号攻击者 头号攻击者 SKYNET NETWORK LTD(AS214295,荷兰)通过同一 /24 子网 (`45.142.193.x`) 中的 3 个 IP 累计了 **441 次失败的登录尝试**。来自同一 ASN 的多个 IP 同时进行攻击,表明这是一个**自动化的僵尸网络操作**,而不是手动攻击者。 ### 协调的僵尸网络行为 观察到共享相同 ASN 的多个 IP 同时针对蜜罐进行攻击(荷兰、越南/VNPT、芬兰/Bashinskii、法国/Contabo)。这与共享凭据列表的僵尸网络一致,而不是独立的攻击者。 ## 激活的数据连接器 - 通过 AMA 传输的 Windows 安全事件 *(主要 - 蜜罐 VM 日志)* - Azure Activity - Microsoft Defender XDR - Microsoft Defender for Endpoint - Microsoft Defender for Cloud Apps - Microsoft Defender for Identity - Microsoft Entra ID Protection - Microsoft Defender for Office 365 - Microsoft 365 Insider Risk Management ## 展示的技能 | 技能 | 详情 | |---|---| | **云基础设施** | Azure VM, NSG, Log Analytics Workspace, Data Collection Rule | | **SIEM 管理** | Microsoft Sentinel 部署,10+ 个数据连接器配置 | | **KQL** | 用于威胁检测、聚合、Watchlist 联接、地理扩充的自定义查询 | | **威胁检测工程** | 两个带有计划查询、MITRE ATT&CK 映射、实体映射的自定义 Analytics rule | | **事件响应** | 完整的 SOC 工作流:检测 → 分类 → 调查 → 补救 → 关闭 | | **仪表板与可视化** | 带有实时攻击地图、热力图、自动刷新、柱状图的多面板 Workbook | | **威胁情报** | IP/ASN 归属、僵尸网络模式识别、Contabo/SKYNET 行为者分析 | | **网络安全** | NSG 规则管理、边界级别的 IP 阻断、多服务攻击面分析 | | **SOAR** | 用于自动化事件通知的 Logic App playbook 设计与部署 | | **进攻性安全** | 使用来自 Kali Linux 的 ncrack 和 xfreerdp 进行 RDP 暴力破解模拟 | ## 工具与技术 - Microsoft Azure (Virtual Machines, NSG, Log Analytics, Resource Groups, Azure Monitor) - Microsoft Sentinel (SIEM) + Microsoft Defender XDR (统一门户) - KQL — Kusto Query Language - Monitor Agent (AMA) + Data Collection Rules (DCR) - Sentinel Workbooks (多面板仪表板,自动刷新) - Sentinel Watchlists (自定义地理扩充) - Azure Logic Apps (SOAR playbook) - Windows Server 2022 Datacenter (OpenSSH Server, IIS Web Server) - Kali Linux (ncrack, xfreerdp 用于攻击模拟) - ipinfo.io (IP 地理定位和 ASN 归属) - MITRE ATT&CK 框架 (T1110, T1595) ## 道德披露 此蜜罐部署在完全隔离的 Azure VM 上,未连接到任何生产系统或敏感数据。显示的所有攻击流量均是来自外部威胁行为者的真实、未经请求的流量。该 VM 是为了研究和教育目的而故意配置为易受攻击的。所有暴力破解模拟仅针对此 VM 进行,该 VM 由作者拥有和控制。 *构建使用:Microsoft Azure · Microsoft Sentinel · KQL · Windows Server 2022 · Kali Linux*
标签:KQL, Microsoft Sentinel, PE 加载器, 库, 应急响应, 底层分析, 红队行动, 蜜罐, 证书利用