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, 扫描框架, 暴力破解检测, 红队行动