dgcyberfolio/Threat-Hunting-CTF-RDP-Password-Spray

GitHub: dgcyberfolio/Threat-Hunting-CTF-RDP-Password-Spray

一个基于真实攻击场景的威胁狩猎 CTF 案例,通过 KQL 查询分析 RDP 密码喷溅攻击的完整入侵链。

Stars: 0 | Forks: 0

# 隐藏您的 RDP:密码喷溅导致全面沦陷 (CTF)
## 边界 完成日期:***2025-09-20*** 模拟环境:`LOG(N) Pacific - Cyber Range` 受感染主机 VM 设备名包含 `flare` 事件日期:***2025-09-14*** 应用框架:***MITRE ATT&CK***, ***NIST 800-61***
## 概述 针对暴露在互联网上的 RDP endpoint 进行的密码喷溅攻击导致了来自公共 IP 的成功登录。认证后,入侵者执行了一个伪装的二进制文件,通过 **Scheduled Task** 建立持久性,通过添加文件夹排除项削弱了 **Microsoft Defender**,进行了主机发现,在本地归档数据,并在尝试通过非标准端口进行 HTTP 数据渗出之前与外部基础设施进行了通信。
## 钻石模型分析 | 特征 | 详情 | |---|---| | **对手** | 利用密码喷溅和动手操作的 Windows 技巧的外部攻击者。熟悉 PowerShell 和 Windows 任务调度。 | | **基础设施** | 来自 **159.26.106.84** 的初始访问 (RDP)。通过 HTTP 到 **185.92.220.87:8081** 的 C2 / 投递。使用 Web 协议和常见的公共目录。 | | **能力** | 伪装的二进制文件,带有 `-ExecutionPolicy Bypass` 的 PowerShell,通过 **Scheduled Task** (**MicrosoftUpdateSync**) 持久化,Defender 排除 **`C:\Windows\Temp`**,使用 `systeminfo` 进行发现,本地暂存到 **backup_sync.zip**,通过 HTTP 渗出。 | | **受害者** | 标记为 **"flare"** 的 Windows 服务器(例如 `slflarewinsysmo`)。受损账户:**slflare**。RDP 暴露在互联网上。 |
## MITRE ATT&CK 表 | 阶段 | 标志 | 战术 | 技术ID | 技术 | |---|---|---|---|---| | 初始访问 | 1 | 凭证访问 → 初始访问 | **T1110.001** | 暴力破解:密码猜测 | | 初始访问 | 2 | 初始访问 | **T1078** | 有效账户 | | 执行 | 3 | 执行 | **T1059.003** | 命令和脚本解释器:Windows 命令行 | | 执行 | 4 | 执行 | **T1059** | 命令和脚本解释器 | | 持久化 | 5 | 持久化 | **T1053.005** | 计划任务/作业:计划任务 | | 防御规避 | 6 | 防御规避 | **T1562.001** | 损害防御:禁用/修改安全工具 | | 发现 | 7 | 发现 | **T1082** | 系统信息发现 | | 收集 | 8 | 收集 | **T1560.001** | 归档收集的数据:本地归档 | | 命令与控制 | 9 | C2 | **T1071.001**, **T1105** | Web 协议;入口工具传输 | | 渗出 | 10 | 渗出 | **T1048.003** | 通过非加密协议渗出 |
## 补救措施 1. **RDP 暴露与认证** - 将 RDP 限制在 VPN/特权访问工作站;应用即时访问。 - 强制执行 MFA;收紧锁定阈值;审核失败登录以发现喷溅模式。 2. **Defender 加固** - 移除未授权的排除项;启用篡改保护;对 Defender 策略更改进行基线化并发出警报。 3. **持久化清理** - 审核 **Task Scheduler** (`TaskCache\Tree`) 以查找恶意任务(例如 *MicrosoftUpdateSync*);移除并阻止重新创建。 4. **PowerShell 控制** - 强制执行受限语言模式;启用脚本块/模块日志记录;集中收集。 5. **出口与 C2 控制** - 阻止向未批准的 IP/端口(例如 **185.92.220.87:8081**)的出站 HTTP;通过 DLP/CASB 实施 DNS/HTTP 出口过滤。 6. **凭证卫生** - 重置 **slflare** 及相关管理员的凭证;轮换密钥;审查横向移动痕迹。 7. **检测工程** - 针对非管理员上下文下的 `ExecutionPolicy Bypass`、在 **Temp/Public** 中创建归档以及计划任务创建进行检测。
## 经验教训 - 没有 MFA 且暴露在互联网上的 RDP 仍然是密码喷溅的高风险载体。 - 伪装的二进制文件和公共目录有效地与合法活动融合——命名控制和 AMSI/EDR 遥测至关重要。 - Defender 排除项制造了持久的盲点;监控并管控所有 AV 策略的更改。 - Task Scheduler 仍然是可靠的持久化载体;注册表支持的遥测 (`TaskCache\Tree`) 对于检测来说非常宝贵。
## 结论 调查重构了完整的入侵链:密码喷溅 → 有效的 RDP 登录 → 执行和策略绕过 → 计划任务持久化 → Defender 规避 → 发现 → 暂存到归档 → C2 联系 → 渗出尝试。派生的 IOC 和行为支持立即遏制、根除持久性以及后续的检测工程,以减少类似技术的检测时间。

# 夺旗赛 ## 事件时间线 | **时间戳 (UTC)** | **事件** | **目标设备** | **详情** | |------------------------------|---------------------------------------------|------------------------|-------------------------------------------| | **2025-09-17 ~** | 最早的 RDP 密码喷溅尝试 | flare 主机 | 外部 IP 159.26.106.84 (Flag 1) | | **2025-09-17 ~** | 首次成功的 RDP 登录 | flare 主机 | 受损账户:slflare (Flag 2) | | **2025-09-17 ~** | 登录后执行的可疑二进制文件 | flare 主机 | msupdate.exe (Flag 3) | | **2025-09-17 ~** | 使用绕过策略执行载荷 | flare 主机 | "msupdate.exe" -ExecutionPolicy Bypass -File C:\Users\Public\update_check.ps1 (Flag 4) | | **2025-09-17 ~** | 创建计划任务持久性 | flare 主机 | 任务:MicrosoftUpdateSync (Flag 5) | | **2025-09-17 ~** | 添加 Defender 排除项 | flare 主机 | C:\Windows\Temp (Flag 6) | | **2025-09-17 ~** | 运行发现命令 | flare 主机 | "cmd.exe" /c systeminfo (Flag 7) | | **2025-09-17 ~** | 创建用于暂存的归档文件 | flare 主机 | backup_sync.zip (Flag 8) | | **2025-09-17 ~** | 建立 C2 连接 | flare 主机 | 185.92.220.87 (Flag 9) | | **2025-09-17 ~** | 尝试渗出到 IP:Port | flare 主机 | 185.92.220.87:8081 (Flag 10) |
## 已完成标志映射表 | 标志 | 目标 | 值 | |--------|---------------------------------------------|--------------------------------------------------| | **1** | 攻击者 IP 地址 | 159.26.106.84 | | **2** | 受损账户 | slflare | | **3** | 执行的二进制名称 | msupdate.exe | | **4** | 用于执行二进制文件的命令行 | "msupdate.exe" -ExecutionPolicy Bypass -File C:\Users\Public\update_check.ps1 | | **5** | 持久化机制(计划任务) | MicrosoftUpdateSync | | **6** | Defender 设置修改(排除路径) | C:\Windows\Temp | | **7** | 运行的发现命令 | "cmd.exe" /c systeminfo | | **8** | 创建的归档文件 | backup_sync.zip | | **9** | C2 连接目的地 | 185.92.220.87 | | **10** | 渗出尝试目的地 (IP:Port) | 185.92.220.87:8081 | ### 阶段 1:初始访问 — *威胁行为者正试图进入您的网络。* ### Flag 1:攻击者 IP 地址 **目标:** 识别在多次失败后通过 RDP 成功登录的最早外部 IP。 **搜寻内容:** 来自“flare”主机上公共 `RemoteIP` 的第一个 `ActionType == "LogonSuccess"`。 **TTP:** T1110.001(密码猜测)→ T1078(有效账户)。 **重要性:** 锚定初始访问和沦陷源头。 **KQL 查询:** ***// flare 主机上具有 RDP LogonSuccess 的最早公共 IP*** ``` let StartTime = datetime(2025-09-13T00:00:00Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceLogonEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "flare" | where isnotempty(RemoteIP) and RemoteIPType == "Public" | project Timestamp, DeviceName, AccountName, RemoteIP, ActionType, LogonType | sort by Timestamp asc ``` **输出:** `159.26.106.84` **发现:** 来自公共来源的最早 `LogonSuccess` 是 **159.26.106.84**,与成功登录前的密码喷溅尝试一致。 Pasted Graphic 5 ### Flag 2:受损账户 **目标:** 确定成功 RDP 登录期间使用的用户名。 **搜寻内容:** 与 Flag 1 的 `LogonSuccess` 事件相关联的账户。 **TTP:** T1078(有效账户)。 **重要性:** 确立攻击者的操作身份和权限范围。 **KQL 查询:** ***// flare 主机上首次成功 RDP 登录的账户*** ``` let StartTime = datetime(2025-09-13T00:00:00Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceLogonEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "flare" | where isnotempty(RemoteIP) and RemoteIPType == "Public" | where ActionType == "LogonSuccess" | project Timestamp, DeviceName, AccountName, RemoteIP, ActionType, LogonType | sort by Timestamp asc ``` **输出:** `slflare` **发现:** 来自外部 IP 的首次成功 RDP 认证使用了账户 **slflare**。 Pasted Graphic 4 ### Flag 3:执行的二进制名称 **目标:** 识别 RDP 访问后执行的二进制文件。 **搜寻内容:** **slflare** 从 `Public/Temp/Downloads` 位置执行或带有下载/绕过标志的可疑执行。 **TTP:** T1059.003 (Cmd) / T1204.002(恶意文件)。 **重要性:** 揭示对手执行的初始载荷/工具。 **KQL 查询:** ***// slflare 下启动的可疑二进制文件*** ``` let StartTime = datetime(2025-09-13T00:00:00Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceProcessEvents | where Timestamp between (StartTime .. EndTime) | where AccountName contains "slflare" | where ProcessCommandLine has_any ("Bypass","Invoke-WebRequest","DownloadString","certutil","bitsadmin","powershell","public","Temp","Download") | sort by Timestamp asc | project Timestamp, ProcessCommandLine, FileName ``` **输出:** `msupdate.exe` **发现:** 在 **slflare** 下,进程列表显示执行了 **msupdate.exe**,这是一个听起来合法的名称,通常用于伪装恶意载荷。 Pasted Graphic 7 ### Flag 4:用于执行二进制文件的命令行 **目标:** 提供用于启动 Flag 3 中二进制文件的完整命令行。 **搜寻内容:** 包含 **msupdate.exe** 的 `ProcessCommandLine`。 **TTP:** T1059(命令和脚本解释器)。 **:** 参数暴露了执行策略绕过和载荷路径。 **KQL 查询:** ***// msupdate.exe 的完整命令行*** ``` let StartTime = datetime(2025-09-13T00:00:00Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceProcessEvents | where Timestamp between (StartTime .. EndTime) | where AccountName contains "slflare" | where ProcessCommandLine contains "msupdate.exe" | project ProcessCommandLine ``` **输出:** `"msupdate.exe" -ExecutionPolicy Bypass -File C:\Users\Public\update_check.ps1` **发现:** 该二进制文件被调用时带有 **ExecutionPolicy Bypass**,执行了 `C:\Users\Public\update_check.ps1`,表明存在基于脚本的后续活动。 › msupdate exe -ExecutionPolicy Bypass -File C UsersPublicupdate_check ps1 ### Flag 5:创建的持久化机制 **目标:** 识别攻击者创建的计划任务。 **搜寻内容:** 任务创建痕迹(例如 `TaskCache\Tree\*`)以及与攻击者活动窗口相关的近期条目。 **TTP:** T1053.005(计划任务)。 **重要性:** 确认在重启/注销后幸存的持久化方法。 **KQL 查询:** ***// 可疑的 TaskCache 注册表条目*** ``` let StartTime = datetime(2025-09-16T18:40:57.3785102Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceRegistryEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "slflarewinsysmo" | where isnotempty(RegistryKey) and RegistryKey contains "TaskCache\\Tree" | project Timestamp, RegistryKey, RegistryValueName, RegistryValueData, InitiatingProcessAccountName | order by Timestamp asc ``` **输出:** `MicrosoftUpdateSync` **发现:** **TaskCache\Tree** 下的新条目显示了一个名为 **MicrosoftUpdateSync** 的计划任务,与初始访问后几分钟创建的持久化一致。 •  Sep 17,2605 24644 AM ### Flag 6:修改了哪个 Defender 设置? **目标:** 识别添加到 Defender 排除项的文件夹路径。 **搜寻内容:** Defender 排除项注册表更新。 **TTP:** T1562.001(损害防御:禁用/修改 Defender)。 **重要性:** 排除项使磁盘上的载荷能够逃避扫描。 **KQL 查询:** ***// Defender 排除项注册表修改*** ``` let StartTime = datetime(2025-09-16T19:39:45.4135161Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceRegistryEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "slflarewinsysmo" | where RegistryKey contains "Windows Defender" and (isnotempty(RegistryValueName) or isnotempty(RegistryValueData)) | project Timestamp, RegistryValueName, RegistryValueData, RegistryKey | order by Timestamp asc ``` **输出:** `C:\Windows\Temp` **发现:** 为 **C:\Windows\Temp** 添加了一个 Defender 排除项,这是临时载荷和归档文件的常见暂存文件夹。 Sep 1R 2075 8 16 ### Flag 7:攻击者运行了什么发现命令? **目标:** 识别最早的系统发现命令。 **搜寻内容:** 持久化之后的 `whoami` / `systeminfo` 调用。 **TTP:** T1082(系统信息发现)。 **重要性:** 验证侦察阶段和攻击者的上下文感知。 **KQL 查询:** ***// 最早的发现命令*** ``` let StartTime = datetime(2025-09-16T18:40:57.3785102Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceProcessEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "slflarewinsysmo" | where ProcessCommandLine contains "systeminfo" or ProcessCommandLine contains "whoami" | project Timestamp, ProcessCommandLine | order by Timestamp asc ``` **输出:** `"cmd.exe" /c systeminfo` **发现:** 攻击者在建立持久性后不久通过 **systeminfo**(通过 `cmd /c`)发起了主机枚举。 Timestamp ### Flag 8:攻击者创建的归档文件 **目标:** 识别为数据渗出而创建的归档文件。 **搜寻内容:** 来自可疑位置的 `.zip` / `.7z` / `.rar` 创建或使用。 **TTP:** T1560.001(本地归档)。 **重要性:** 确认出站传输前的数据暂存。 **KQL 查询:** ***// 进程命令行中观察到的归档操作*** ``` let StartTime = datetime(2025-09-16T18:40:57.3785102Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceProcessEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "slflarewinsysmo" | where ProcessCommandLine contains ".zip" or ProcessCommandLine contains ".rar" or ProcessCommandLine contains ".7z" | project Timestamp, ProcessCommandLine | order by Timestamp asc ``` **输出:** `backup_sync.zip` **发现:** 行为者将收集的数据暂存到 **backup_sync.zip** 中,这是一个听起来良性的归档名称,是伪装技术的典型特征。 Pasted Graphic 15 ### Flag 9:C2 连接目的地 **目标:** 识别为远程访问/工具而联系的 C2 目的地。 **搜寻内容:** 暂存/持久化后立即发生的出站 HTTP/S 调用。 **TTP:** T1071.001(Web 协议),T1105(入口工具传输)。 **重要性:** 查明用于控制主机的外部基础设施。 **KQL 查询:** ***// 与归档或工具检索相关的出站 URL/IP*** ``` let StartTime = datetime(2025-09-16T18:40:57.3785102Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceProcessEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "slflarewinsysmo" | where ProcessCommandLine contains "http" and ProcessCommandLine contains ".zip" | project Timestamp, ProcessCommandLine | order by Timestamp asc ``` **输出:** `185.92.220.87` **发现:** 进程遥测显示重复回调到 **185.92.220.87**,表明外部 C2/工具检索。 Pasted Graphic 16 ### Flag 10:检测到渗出尝试 **目标:** 识别渗出目的地和端口。 **搜寻内容:** 归档创建后到外部 IP:端口 的出站连接。 **TTP:** T1048.003(通过非加密协议渗出)。 **重要性:** 确认数据出口尝试并有助于遏制/IOC。 **KQL 查询:** ***// 外部渗出目的地*** ``` let StartTime = datetime(2025-09-16T18:40:57.3785102Z); let EndTime = datetime(2025-09-22T23:59:59Z); DeviceProcessEvents | where Timestamp between (StartTime .. EndTime) | where DeviceName contains "slflarewinsysmo" | where ProcessCommandLine contains "http" and ProcessCommandLine contains ".zip" | project Timestamp, ProcessCommandLine | order by Timestamp asc ``` **输出:** `185.92.220.87:8081` **发现:** 暂存的归档文件被发送(或尝试发送)到 **185.92.220.87:8081**,与观察到的 C2 基础设施和非加密渗出路径一致。 Pasted Graphic 17
## 分析师工作流 ### 从调查的角度来看,工作流程进展如下: **认证审查** – 调查了失败的登录。确认了暴力破解尝试,随后是来自外部 IP 的成功 RDP 登录。 **进程和执行检查** – 审查了进程树。识别了登录后执行的可疑二进制文件,该文件随后生成了 PowerShell 脚本以执行载荷。 **持久化和规避审查** – 验证了通过文件夹排除对 Defender 设置的更改。发现了攻击者创建的计划任务,以在重启期间维持访问。 **侦察和网络分析** – 追踪了攻击者用于主机发现的命令,包括系统枚举。观察到了到外部命令和控制基础设施的出站网络流量。 **渗出审查** – 检测到了暂存数据归档的创建。将其与显示试图渗出到外部 IP 和端口的出站流量相关联。 **完成这个 CTF 做得好! 🎉** 您成功追踪了从暴力破解入侵到恶意 PowerShell 执行、持久化创建以及导致准备渗出的暂存数据的出站连接的入侵链。
标签:Cloudflare, Conpot, DAST, DNS 解析, Flare-On, HTTP工具, Microsoft Defender, MITRE ATT&CK, OPA, OpenCanary, RDP攻击, Windows安全, Writeup, 嗅探欺骗, 密码喷洒, 恶意软件分析, 数字取证, 数据窃取, 无线安全, 权限维持, 横向移动, 私有化部署, 编程规范, 网络安全, 网络靶场, 自动化脚本, 计划任务, 防御规避, 隐私保护, 靶场