goubx/hunting-exposed-vm-bruteforce

GitHub: goubx/hunting-exposed-vm-bruteforce

利用 Microsoft Defender for Endpoint 和 KQL 查询,对公网暴露虚拟机的暴力破解登录尝试进行威胁狩猎与入侵排查。

Stars: 0 | Forks: 0

# 排查针对暴露在公网的 VM 的暴力破解尝试 这是一个通过 Microsoft Defender for Endpoint 进行的实操威胁狩猎。共享服务集群中的一台虚拟机被误暴露在公共互联网上。本项目旨在排查针对该虚拟机的暴力破解登录尝试,并确认是否有攻击者成功入侵。 | | | |---|---| | **平台** | Microsoft Defender for Endpoint (Advanced Hunting) | | **查询语言** | KQL | | **战术** | Credential Access | | **MITRE 技术** | T1110 Brute Force | | **结果** | 尝试了暴力破解,未发生成功入侵 | ## 目录 - [背景](#background) - [假设](#hypothesis) - [狩猎](#the-hunt) - [发现](#findings) - [时间线](#timeline) - [入侵指标](#indicators-of-compromise) - [MITRE ATT&CK 映射](#mitre-attck-mapping) - [响应](#response) - [经验与改进](#lessons-and-improvements) - [文件](#files) ## 背景 在例行维护期间,安全团队调查了共享服务集群(DNS、Domain Services、DHCP)中可能被误暴露在公共互联网上的 VM。目标是识别配置错误的 VM,并检查是否存在来自外部源的暴力破解登录尝试或成功登录。 目标设备 `WIN-TARGET-01` 被确认面向互联网大约三天。在暴露期间,一台可通过网络登录的面向互联网的 VM 会被机器人发现并遭到大量登录尝试。本次狩猎要回答的问题是,这些尝试中是否有任何一次成功了。 ## 假设 由于环境中的旧设备未针对过多的登录失败配置账户锁定策略,当 `WIN-TARGET-01` 在不知情的情况下暴露在互联网上时,外部攻击者可能会通过暴力破解进入。 ## 狩猎 狩猎遵循结构化的生命周期:构建假设、收集数据、进行分析、调查发现、做出响应并进行记录。 ### 第一步:确认暴露情况 ``` DeviceInfo | where DeviceName == "WIN-TARGET-01" | where IsInternetFacing == true | order by Timestamp desc ``` 确认了该设备曾面向互联网。最后一次面向互联网的时间是 `2026-06-10T07:19:25Z`,暴露持续了大约三天。 ### 第二步:查找失败的登录 ``` DeviceLogonEvents | where DeviceName == "WIN-TARGET-01" | where LogonType has_any("Network", "Interactive", "RemoteInteractive", "Unlock") | where ActionType == "LogonFailed" | where isnotempty(RemoteIP) | summarize Attempts = count() by ActionType, RemoteIP, DeviceName | order by Attempts ``` 超过 100 次失败的登录尝试来自外部 IP。尝试的用户名包括 `user1`、`Admin` 和 `administrator`。这些是暴力破解工具或机器人首选攻击的账户,证实了自动化的暴力破解行为。 ### 第三步:检查是否有攻击者 IP 成功登录 ``` let RemoteIPsInQuestion = dynamic(["194.180.48.149","143.92.36.175", "80.94.95.83", "121.30.214.172", "83.222.191.62", "45.41.204.12", "192.109.240.116"]); DeviceLogonEvents | where LogonType has_any("Network", "Interactive", "RemoteInteractive", "Unlock") | where ActionType == "LogonSuccess" | where RemoteIP has_any(RemoteIPsInQuestion) ``` 提取了高频违规的 IP,并检查了每一个 IP 是否有成功登录。均未成功。 ### 第四步:检查该主机的所有成功登录记录 ``` DeviceLogonEvents | where DeviceName == "WIN-TARGET-01" | where LogonType has_any("Network", "Interactive", "RemoteInteractive", "Unlock") | where ActionType == "LogonSuccess" ``` 每一次成功的登录都来自网络内部,且使用的是同一个内部账户。 ### 第五步:确认内部登录是否合法 ``` DeviceLogonEvents | where DeviceName == "WIN-TARGET-01" | where LogonType has_any("Network") | where ActionType == "LogonSuccess" | where AccountName == "" | summarize LoginCount = count() by DeviceName, ActionType, AccountName, RemoteIP ``` 该内部账户仅有 4 次成功登录,全部来自预期的内部源。没有异常,没有外部访问。 ## 发现 该设备在暴露于互联网期间显然成为了暴力破解的目标,针对常见用户名有 100 多次失败尝试。尽管如此,没有证据表明存在成功的入侵。唯一成功的登录都可追溯到单一的内部账户,且全部属于正常行为。假设经过了测试但未被证实。这台 VM 防守住了。 ## 时间线 | 时间 (UTC) | 事件 | |------------|-------| | ~2026年6月7日 | `WIN-TARGET-01` 面向互联网(暴露开始,约 3 天窗口期) | | 暴露窗口期 | 来自外部 IP 的 100 多次网络登录失败,使用账户 `Admin`, `administrator`, `user1` | | 2026-06-10 07:19:25 | 最后一次确认的面向互联网的记录 | | 2026年6月12日至13日 | 开展威胁狩猎,未发现入侵 | ## 入侵指标 在失败的登录尝试中观察到的外部攻击者源 IP: | 类型 | 值 | |------|-------| | IP | 194.180.48.149 | | IP | 143.92.36.175 | | IP | 80.94.95.83 | | IP | 121.30.214.172 | | IP | 83.222.191.62 | | IP | 45.41.204.12 | | IP | 192.109.240.116 | ## MITRE ATT&CK 映射 | 战术 | 技术 | ID | 证据 | |--------|-----------|----|----| | Reconnaissance | Active Scanning | T1595 | 设备在暴露于公共互联网后被机器人发现并成为目标 | | Initial Access | External Remote Services | T1133 | 攻击者试图对暴露于互联网的远程服务进行网络登录 | | Credential Access | Brute Force | T1110 | 来自外部 IP 的 100 多次失败登录 | | Credential Access | Brute Force: Password Guessing | T1110.001 | 针对常见用户名(`Admin`, `administrator`, `user1`)的反复尝试 | | Persistence / Defense Evasion | Valid Accounts | T1078 | 暴力破解的目标,未实现。未观察到外部成功登录 | ## 响应 由于没有发生入侵,因此这是遏制和加固,而不是事件恢复: - 消除该设备的互联网暴露。它本不应为网络登录提供面向公共网络的攻击面。 - 在网络边界封锁违规的外部 IP。 - 启用账户锁定策略,以便在暴力破解得逞之前,通过重复的登录失败来锁定账户。 - 将远程登录限制在 VPN 或受信任的 IP 范围内,而不是开放互联网。 - 强制使用强且唯一的密码,这样即使账户可被访问,也无法通过猜测破解。 ## 经验与改进 **什么可以防止这种情况:** - 根本原因是将一台 VM 暴露在公共互联网上,并且允许网络登录。让它远离公共互联网可以完全消除攻击面。 - 账户锁定是一种控制手段,可以阻止暴力破解无休止地进行。 - 网络登录服务应位于 VPN 之后,或通过防火墙规则将其限制在已知 IP 范围内。 **什么能让下一次狩猎更敏锐:** - 捕获每个 IP 第一次和最后一次失败尝试的确切时间戳,以构建更紧凑的时间线。 - 将攻击者 IP 与威胁情报源进行交叉比对,以查看它们是否是已知的恶意攻击者。 - 为面向互联网的设备上的重复登录失败构建定时的检测规则,以便自动标记此情况,而不是在手动审查时才发现。 ## 文件 - `README.md` - 本篇说明文档 - `queries.kql` - 狩猎中使用的每一个 KQL 查询 作者 Mohamed Yagoub 的威胁狩猎与 SOC 调查系列的一部分。
标签:KQL查询, 免杀技术, 入侵分析, 安全运营, 微软Defender, 扫描框架, 暴力破解检测, 红队行动