BetaHydri/RDP-Forensic

GitHub: BetaHydri/RDP-Forensic

一款专为 Windows 环境设计的 PowerShell 取证工具包,通过聚合多源事件日志实现 RDP 会话全生命周期的追踪、关联分析与异常检测。

Stars: 3 | Forks: 0

# RDP-Forensic 用于分析和追踪 Windows 环境中远程桌面协议 (RDP) 连接的综合 PowerShell 工具包。提供对多个 Windows 事件日志源的 RDP 活动进行取证分析、实时监控和详细报告。 [![PowerShell Gallery (with prereleases)](https://img.shields.io/powershellgallery/vpre/RDP-Forensic?label=RDP-Forensic%20Preview)](https://www.powershellgallery.com/packages/RDP-Forensic/) [![PowerShell Gallery](https://img.shields.io/powershellgallery/v/RDP-Forensic?label=RDP-Forensic)](https://www.powershellgallery.com/packages/RDP-Forensic/) ## 行为准则 本项目已采纳此[行为准则](CODE_OF_CONDUCT.md)。 ## 发布 每次合并到 `main` 分支时,预览版本将被 部署到 [PowerShell Gallery](https://www.powershellgallery.com/)。 周期性地,版本标签将被推送,这将把 完整版本部署到 [PowerShell Gallery](https://www.powershellgallery.com/)。 ## 对比 | 功能 | 本工具包 | 基础 PowerShell
(Get-EventLog) | 手动事件查看器 | |---------|--------------|-------------------------------------|---------------------| | **成本** | ✅ 免费且开源 | ✅ 内置 | ✅ 内置 | | **事件覆盖** | ✅ 15+ 事件 ID | ⚠️ 手动查询 | ⚠️ 手动过滤 | | **多日志关联** | ✅ 5 个日志源 | ❌ 一次一个 | ❌ 手动切换 | | **事件关联** | ✅ 按 LogonID 分组会话 | ❌ 无 | ❌ 无 | | **生命周期追踪** | ✅ 6 个阶段 | ❌ 无 | ❌ 无 | | **暴力破解检测** | ✅ 内置 | ❌ 手动分析 | ❌ 无 | | **会话时长分析** | ✅ 自动 | ❌ 无 | ❌ 无 | | **导出能力** | ✅ CSV + 摘要 | ⚠️ 基础 | ⚠️ 手动导出 | | **实时监控** | ✅ 当前会话 | ❌ 无 | ⚠️ 有限 | | **过滤** | ✅ 用户/IP/日期 | ⚠️ 基础 Where-Object | ⚠️ 基础 | | **文档** | ✅ 全面 | ⚠️ Microsoft Docs | ⚠️ 基础 | | **学习曲线** | ✅ 低(包含示例) | ⚠️ 中等 | ✅ 低 | | **部署** | ✅ 复制并运行 | ✅ 内置 | ✅ 内置 | | **定制化** | ✅ 完整源码访问 | ✅ 自行编写脚本 | ❌ 无 | | **取证重点** | ✅ 专用构建 | ❌ 通用目的 | ❌ 通用目的 | | **事件响应** | ✅ 即用型场景 | ❌ 自己动手 | ❌ 手动 | | **无需网络** | ✅ 离线可用 | ✅ 是 | ✅ 是 | | **脚本大小** | ✅ 轻量级 (~25KB) | N/A | N/A | ### 关键差异点 **对比基础 PowerShell 命令:** - 🎯 预构建的取证工作流,替代手动查询 - 🔍 自动关联 5 个不同的日志源 - 📊 生成统计摘要和报告 - 🛡️ 内置暴力破解攻击检测 - 📝 全面的事件解析(无需 regex) - 📺 **带自动刷新的实时会话监控** - 📝 **用于取证分析的自动变更日志** **对比手动事件查看器:** - ⚡ 跨多个日志的自动收集 - 🔗 通过 LogonID 和 SessionID 关联事件 - 📈 统计分析和趋势 - 💾 导出为适合分析的格式 - ⏱️ 节省数小时的手动调查时间 - 🔴 **实时监控模式** - 实时追踪会话 - 📋 **变更检测** - 记录新增/结束的会话及状态变化 ## 概述 此工具包提供对 RDP 连接所有阶段的详细分析: 1. **网络连接** - 初始 RDP 连接尝试 (EventID 1149) 2. **凭据提交** - 显式凭据使用 (EventID 4648) 3. **认证** - 成功和失败的认证 (EventID 4624, 4625) 4. **登录** - 会话建立 (EventID 21, 22) 5. **锁定/解锁** - 工作站锁定状态变化 (EventID 4800, 4801) 6. **断开/重连** - 会话状态变化 (EventID 24, 25, 39, 40, 4778, 4779) 7. **注销** - 会话终止 (EventID 23, 4634, 4647, 9009) ## Cmdlets ### Get-RDPForensics 主要的取证分析 cmdlet,从多个 Windows 事件日志源收集和分析 RDP 连接日志。 **功能:** - 从 Security、TerminalServices 和 System 日志收集事件 - **事件关联** - 跨所有日志源按 LogonID/SessionID 对事件进行分组 - **会话生命周期追踪** - 可视化完整会话阶段(连接 → 认证 → 登录 → 活动 → 断开 → 注销) - **会话时长分析** - 计算实际会话时间 - 按日期范围、用户名或源 IP 过滤 - 将结果导出为 CSV 格式(事件 + 会话) - 生成摘要报告 - 支持出站 RDP 连接追踪 - **实时监控** - 带自动刷新的观察模式 - **变更日志** - 追踪会话状态变化至 CSV **要求:** - Windows Server 2012 R2 或更高版本 / Windows 8.1 或更高版本 - 管理员权限(读取 Security 事件日志所需) - PowerShell 5.1 或更高版本 - **启用 Windows 审核策略**(见下文) **事件日志位置(重要):** | 事件类型 | 事件 ID | 记录位置 | 工具范围 | |------------|-----------|-----------|------------| | **RDP 会话** | 1149, 21-25, 39, 40, 4624, 4778, 4779 | 终端服务器 | ✅ 主要用例 | | **凭据提交** | 4648 | 终端服务器 | ✅ v1.0.8 新增 | | **Kerberos 认证** | 4768-4772 | **域控制器** | ⚠️ 仅限 DC | | **NTLM 认证** | 4776 | **域控制器** | ⚠️ 仅限 DC | ⚠️ **关键限制:** 此工具查询运行它的**本地 Security 日志**。Kerberos 和 NTLM 认证事件 (4768-4772, 4776) 记录在域控制器上,而非终端服务器。在终端服务器上运行时,`-IncludeCredentialValidation` 参数将返回零个事件。 **审核策略要求:** 大多数 RDP 事件 (1149, 21-25, 39, 40, 9009) 默认记录在 Terminal Services Operational 日志中。但是,**Security 日志事件需要启用特定的审核策略**: **需要审核策略的事件(在终端服务器上):** - EventID 4624, 4625 (登录/登录失败) - 需要 "Audit Logon Events" - EventID 4634, 4647 (注销) - 需要 "Audit Logon Events" - EventID 4648 (显式凭据使用) - 需要 "Audit Logon Events" - v1.0.8 新增 - EventID 4778, 4779 (会话重连/断开) - 需要 "Audit Other Logon/Logoff Events" - EventID 4800, 4801 (工作站锁定/解锁) - 需要 "Audit Other Logon/Logoff Events" **需要审核策略的事件(在域控制器上):** - **EventID 4768-4772 (Kerberos) - 需要 "Audit Kerberos Authentication Service" (可选,仅限 DC)** - **EventID 4776 (NTLM) - 需要 "Audit Credential Validation" (可选,仅限 DC)** **通过 PowerShell 启用(推荐):** ``` # 在 Terminal Server 上运行 - RDP 会话跟踪所需 auditpol /set /subcategory:"Logon" /success:enable /failure:enable auditpol /set /subcategory:"Logoff" /success:enable auditpol /set /subcategory:"Other Logon/Logoff Events" /success:enable /failure:enable # 在 Domain Controller 上运行 - Kerberos/NTLM 身份验证跟踪可选 # ⚠️ 警告:仅在 DC 上运行此操作,不要在 Terminal Servers 上运行 auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable auditpol /set /subcategory:"Credential Validation" /success:enable /failure:enable # 验证设置 auditpol /get /category:"Logon/Logoff" # Check on Terminal Server auditpol /get /category:"Account Logon" # Check on Domain Controller ``` **通过组策略启用(用于域环境):** ``` Computer Configuration → Policies → Windows Settings → Security Settings → Advanced Audit Policy Configuration → Audit Policies **Required:** Logon/Logoff: - Audit Logon (Success, Failure) - Audit Logoff (Success) - Audit Other Logon/Logoff Events (Success, Failure) **Optional (for -IncludeCredentialValidation):** Account Logon: - Audit Kerberos Authentication Service (Success, Failure) - Audit Credential Validation (Success, Failure) ``` **注意:** 大多数 Windows 系统默认启用登录审核。即使没有这些策略,工具仍然可以工作,但事件关联可能不够完整(缺少 4624/4634/4778/4779 事件)。 **PowerShell 5.1 & 7.x 兼容性:** 此工具包完全兼容 PowerShell 5.1 和 7.x: - ✅ **制表符绘制** - 美观的 Unicode 边框在两个版本中均可工作 (╔═╗║╚╝) - ✅ **图标** - PS 7.x 显示完整 emoji (💻📊⏱️),PS 5.1 使用 Unicode 符号 (▣■◔) - ✅ **日志记录** - 不带 BOM 的 UTF-8 编码,以实现最大兼容性 - ✅ **所有功能** - 实时监控、变更日志和取证分析在两个版本中工作方式相同 - ✅ **性能** - 针对两个版本的 Windows 控制台进行了优化 该工具会自动检测您的 PowerShell 版本并相应地调整输出,确保无论您使用哪个版本都能获得专业且美观的体验。 **安装:** ``` # 从 PowerShell Gallery 安装(推荐) Install-Module -Name RDP-Forensic -Scope CurrentUser # 或者进行系统级安装(需要提升的命令提示符) Install-Module -Name RDP-Forensic # 导入模块 Import-Module RDP-Forensic # 现在你可以调用 cmdlets Get-RDPForensics Get-RDPCurrentSessions ``` **使用示例:** ``` # 获取今天的所有 RDP 事件 Get-RDPForensics # 获取最近 7 天的 RDP 事件 Get-RDPForensics -StartDate (Get-Date).AddDays(-7) # 获取特定用户的 RDP 事件 Get-RDPForensics -Username "john.doe" -StartDate (Get-Date).AddMonths(-1) # 按源 IP 地址筛选 (IPv4) Get-RDPForensics -SourceIP "192.168.1.100" # 按 IPv6 地址筛选 Get-RDPForensics -SourceIP "fe80::1" -StartDate (Get-Date).AddDays(-7) # 将结果导出为 CSV Get-RDPForensics -StartDate (Get-Date).AddDays(-30) -ExportPath "C:\Reports\RDP" # 通过关联按会话对事件进行分组 Get-RDPForensics -GroupBySession # 分析完整的会话生命周期并导出 Get-RDPForensics -StartDate (Get-Date).AddDays(-7) -GroupBySession -ExportPath "C:\Reports\RDP" # 包含 Kerberos (4768-4772) 和 NTLM (4776) 身份验证事件 # ⚠️ 注意:这些事件位于 Domain Controller 上,而不是 Terminal Server # 仅在 DC 上运行工具时显示事件 Get-RDPForensics -IncludeCredentialValidation -GroupBySession # 结合凭据验证和 Event 4648 的深度取证分析 # 按用户名、源 IP 和特定 LogonID 进行筛选以完成完整的会话关联 Get-RDPForensics -IncludeCredentialValidation -Username "AO-VPN\Administrator" -SourceIP "172.16.0.2" -LogonID 0x144533 # 包含出站 RDP 连接 Get-RDPForensics -IncludeOutbound # 获取上个月的事件并导出 Get-RDPForensics -StartDate (Get-Date).AddMonths(-1) -ExportPath "C:\RDP_Analysis" -IncludeOutbound ``` **示例:完整取证调查** 以下示例演示了带凭据验证的综合 RDP 取证分析,显示 Event 4648(凭据提交)、Event 4624(成功登录)和完整的会话关联: ``` Get-RDPForensics -IncludeCredentialValidation -Username "AO-VPN\Administrator" -SourceIP "172.16.0.2" -LogonID 0x144533 ``` ![RDP 取证完整分析示例](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/39ae4709e5125615.png) 此截图显示: - **Event 4648** - 带源 IP 和目标用户的凭据提交 - **Event 4624** - 登录类型为 10 (RemoteInteractive) 的成功登录 - **完整时间线** - 从凭据输入到会话建立的完整认证流程 - **关联** - 所有事件通过 LogonID 链接,呈现完整会话图景 **参数:** | 参数 | 类型 | 描述 | 默认值 | |-----------|------|-------------|---------| | `StartDate` | DateTime | 日志收集的开始日期 | 当天开始 | | `EndDate` | DateTime | 日志收集的结束日期 | 当前时间 | | `ExportPath` | String | 导出 CSV 文件的路径 | 无(仅显示) | | `Username` | String | 按特定用户名过滤 | 无 | | `SourceIP` | String | 按源 IP 地址过滤 | 无 | | `IncludeOutbound` | Switch | 包含出站 RDP 连接 | False | | `GroupBySession` | Switch | 按 LogonID/SessionID 关联事件 | False | | `LogonID` | String | 按特定 LogonID 过滤(十六进制格式:0x12345) | 无 | | `SessionID` | String | 按特定 SessionID 过滤 | 无 | | 参数 | 类型 | 描述 | 默认值 | |-----------|------|-------------|---------| | `IncludeCredentialValidation` | Switch | 包含 Kerberos/NTLM 事件(仅限 DC) | False | ``` ## 🎯 取证分析最佳实践 ### 理解 LogonID 与 SessionID 过滤 ⚠️ **IMPORTANT:** LogonID and SessionID parameters are **mutually exclusive** - you cannot use both in the same command. PowerShell enforces this automatically via Parameter Sets and will display an error if you attempt to use both. When investigating RDP sessions, understanding the difference between **LogonID** and **SessionID** filtering is crucial for comprehensive forensic analysis: #### **LogonID 过滤(推荐用于完整调查)** **Use `-LogonID` when you need:** - ✅ **Complete session correlation** across all log sources - ✅ **Security log events** (4624 auth, 4778/4779 reconnect/disconnect) - ✅ **TerminalServices events** (21-25 session lifecycle) - ✅ **Full forensic picture** including authentication and reconnection history - ✅ **Cross-log correlation** (Security + TerminalServices-LocalSessionManager) **Example:** ```powershell # 获取包含所有 Security 和 TerminalServices 事件的完整会话 Get-RDPForensics -GroupBySession -Username administrator -LogonID 0x6950A4 ``` **输出包括:** - 来自 Security 日志的 4778/4779 重连/断开事件 - 4624 认证事件 - 来自 TerminalServices 的 Event 21-25 会话事件 - 包含所有状态变化的完整会话时间线 - 多次重连/断开循环 **为何 LogonID 是优先级 1:** - **跨日志一致** - 相同的 LogonID 出现在 Security 和 TerminalServices 日志中 - **在认证时创建** - 在用户认证时分配(4624 事件) - **会话期间持久** - 即使经过重连/断开也保持不变 - **十六进制格式** - 唯一标识符(例如,0x6950A4) #### **SessionID 过滤(有限用例)** **仅在以下情况使用 `-SessionID`:** - ⚠️ 您需要隔离**仅 TerminalServices** 的事件 - ⚠️ 您正在调查来自 TerminalServices 日志的**特定会话 ID** - ⚠️ 您想查看**部分会话视图**,无需 Security 日志上下文 **示例:** ``` # 仅获取 SessionID 4 的 TerminalServices 事件 Get-RDPForensics -GroupBySession -Username administrator -SessionID 4 ``` **输出仅限于:** - Event 21: Session Logon Succeeded - Event 22: Shell Start Notification - Event 23: Session Logoff Succeeded - Event 24: Session Disconnected - **缺少:** 4624 认证事件,来自 Security 日志的 4778/4779 重连事件 **为何 SessionID 受限:** **仅限 TerminalServices** - 不存在于 Security 日志事件中 - **缺少认证上下文** - 没有 4624 事件显示用户如何认证 - **无重连历史** - 缺少 Security 日志中的 4778/4779 事件 - **部分时间线** - 仅显示 TerminalServices 视角 ### 推荐的取证工作流 **1. 从广泛关联开始(无过滤器):** ``` # 获取调查期间的所有会话 Get-RDPForensics -GroupBySession -StartDate (Get-Date).AddDays(-7) -Username targetuser ``` **2. 识别感兴趣的会话:** - 查看会话摘要表 - 记录 LogonID 值(例如,"LogonID:0x6950A4") - 检查会话持续时间和生命周期完整性 **3. 使用 LogonID 过滤器深入挖掘:** ``` # 获取特定会话的完整取证视图 Get-RDPForensics -GroupBySession -LogonID 0x6950A4 -Username targetuser ``` **4. 导出以供进一步分析:** ``` # 导出包含所有关联事件的完整会话 Get-RDPForensics -GroupBySession -LogonID 0x6950A4 -ExportPath "C:\Forensics\Investigation" ``` ### 为何基于 LogonID 的关联更优越 | 方面 | LogonID 关联 | SessionID 关联 | |--------|---------------------|----------------------| | **日志覆盖** | Security + TerminalServices | 仅 TerminalServices | | **事件类型** | 4624, 4778/4779, 21-25 | 仅 21-25 | | **认证上下文** | ✅ 是(4624 事件) | ❌ 无 | | **重连历史** | ✅ 是(4778/4779) | ❌ 无 | | **会话时长** | ✅ 准确(完整时间线) | ⚠️ 部分(仅 TS 事件) | | **取证价值** | ✅ 完整调查 | ⚠️ 视图有限 | | **最适合** | 安全调查 | TS 日志故障排除 | ### 示例:调查可疑的长会话 ``` # 步骤 1:查找长时间运行的会话 $sessions = Get-RDPForensics -GroupBySession -StartDate (Get-Date).AddDays(-1) $longSessions = $sessions | Where-Object { $_.Duration -and [timespan]::Parse($_.Duration).TotalHours -gt 8 } # 步骤 2:识别可疑会话的 LogonID $suspiciousLogonID = $longSessions[0].LogonID # e.g., "0x6950A4" # 步骤 3:使用 LogonID 过滤器获取完整的会话详情 Get-RDPForensics -GroupBySession -LogonID $suspiciousLogonID -ExportPath "C:\Investigation" ``` **此方法为您提供:** - 带登录类型的初始认证事件 (4624) - 所有重连/断开循环 (4778/4779) - 完整的 TerminalServices 会话事件 (21-25) - 显示会话何时以及如何活动的完整时间线 - 断开与注销的证据 ### 参数组合 **✅ 有效组合:** ``` # 带有其他参数的 LogonID Get-RDPForensics -GroupBySession -LogonID 0x12345 -Username user -ExportPath "C:\Reports" # 带有其他参数的 SessionID Get-RDPForensics -GroupBySession -SessionID 4 -SourceIP "192.168.1.100" -ExportPath "C:\Reports" # 无过滤(所有会话) Get-RDPForensics -GroupBySession -Username user -SourceIP "192.168.1.100" ``` **❌ 无效组合(PowerShell 将拒绝):** ``` # 这将会产生一个错误: Get-RDPForensics -GroupBySession -LogonID 0x12345 -SessionID 4 # 错误信息: # 无法使用指定的命名参数解析参数集。 # 发出的一个或多个参数不能一起使用,或者提供的参数数量不足。 ``` ### 快速参考 | 调查目标 | 推荐命令 | |-------------------|---------------------| | **完整会话分析** | `-GroupBySession -LogonID 0x12345` | | **查找所有用户会话** | `-GroupBySession -Username john.doe` | | **仅 TerminalServices 日志** | `-GroupBySession -SessionID 4` | | **广泛调查** | `-GroupBySession -StartDate (date)` | | **取证导出** | 在任何命令中添加 `-ExportPath "C:\path"` | ### Get-RDPCurrentSessions 带全面取证属性的实时 RDP 会话监控。 **功能:** - 通过 Win32 API (WTS) 集成的**扩展会话属性** - 显示 ClientIP、ClientName、ClientBuild、ClientDisplay 分辨率 - **ConnectTime** 具有多源事件关联: * Security 事件: 4778 (重连), 4624 (初始登录) * Terminal Services 事件: 25 (重连), 21/22 (会话登录) * 自动使用所有来源中最近的事件 * 无论是否启用 Security 审核策略均可工作 - 显示会话状态 - 列出每个会话的运行进程 - 显示活动用户的最近登录信息 - **自动刷新监控模式**用于实时会话追踪 - 可自定义刷新间隔(1-300 秒) - **变更日志** - 将会话变化记录到 CSV 以进行取证分析 - IdleTime 追踪(在可用时显示用户非活动持续时间) **使用示例:** ``` # 显示所有当前会话(单次检查) Get-RDPCurrentSessions # 显示所有会话的进程 Get-RDPCurrentSessions -ShowProcesses # 使用 PowerShell 管道过滤到特定会话 Get-RDPCurrentSessions | Where-Object { $_.ID -eq 3 } # 按用户名过滤 Get-RDPCurrentSessions | Where-Object { $_.Username -like "*admin*" } # 实时监控:每 5 秒自动刷新(默认) Get-RDPCurrentSessions -Watch # 以自定义的 10 秒刷新间隔进行监控 Get-RDPCurrentSessions -Watch -RefreshInterval 10 # 监控并显示进程,以 15 秒的频率刷新 Get-RDPCurrentSessions -Watch -ShowProcesses -RefreshInterval 15 # 在事件响应期间以 3 秒更新频率进行监控 Get-RDPCurrentSessions -Watch -RefreshInterval 3 # 变更日志记录:通过自动变更日志记录进行监控以进行取证分析 Get-RDPCurrentSessions -Watch -LogPath "C:\Logs\RDP_Monitor" # 全面监控 - 带有日志记录和进程跟踪的 Watch 模式 Get-RDPCurrentSessions -Watch -RefreshInterval 5 -LogPath "C:\SecurityLogs\RDP" -ShowProcesses # 带日志记录的单次检查(无 Watch 模式) Get-RDPCurrentSessions -LogPath "C:\Logs\RDP_Audit" ``` **实时监控:** `-Watch` 参数启用连续监控模式,按您指定的间隔自动刷新显示。非常适合: - 安全事件响应和实时威胁监控 - 系统维护窗口 - 检测未授权访问尝试 - 实时追踪会话状态变化 - 审计期间监控用户活动 随时按 `Ctrl+C` 退出观察模式。 **变更日志:** `-LogPath` 参数启用取证变更日志: - **新会话** - 记录新 RDP 连接建立时 - **状态变化** - 记录会话状态变化时 (Active ↔ Disconnected) - **会话结束** - 记录会话终止时 - **CSV 格式** - 带时间戳的条目,便于在 Excel 或日志分析工具中分析 - **可与 Watch 模式配合或单独使用** - 可记录单次检查或连续监控 - **取证时间线** - 创建所有会话活动的完整审计跟踪 示例日志输出: ``` Timestamp,EventType,SessionName,Username,SessionID,State,SourceIP,Details 2025-12-16 09:15:23,NEW_SESSION,rdp-tcp#2,john.doe,3,Active,,New RDP session detected 2025-12-16 09:45:10,STATE_CHANGE,rdp-tcp#2,john.doe,3,Disc,,State changed from Active to Disc 2025-12-16 10:02:45,SESSION_ENDED,rdp-tcp#2,john.doe,3,Disc,,Session ended or disconnected ``` **扩展属性 (v1.0.8):** 该工具现在显示全面的会话信息: - **ClientIP** - RDP 连接的源 IP 地址 - **ClientName** - 连接客户端的计算机名 - **ClientBuild** - 客户端操作系统的 Windows 版本号 - **ClientDisplay** - 屏幕分辨率和颜色深度(例如,"2048x1152 (32bit)") - **ConnectTime** - 最近一次连接时间戳(使用多源事件关联) - **IdleTime** - 用户非活动持续时间 ## 事件 ID 参考 ### 连接尝试 - **1149** - Remote Desktop Services: 用户认证成功 ### 凭据提交 (v1.0.8 新增) - **4648** - 显式凭据使用(在实际登录前记录凭据提交,包括 Subject, Target, Server, Process) ### 认证 - **4624** - 账户已成功登录 - **4625** - 账户登录失败 ### 预认证(可选,使用 -IncludeCredentialValidation) **Kerberos 事件:** - **4768** - Kerberos TGT (Ticket Granting Ticket) 请求 - **4769** - Kerberos 服务票证请求 - **4770** - Kerberos 服务票证续订 - **4771** - Kerberos 预认证失败(显示 Kerberos 在 NTLM 回退前失败的原因) - **4772** - Kerberos 认证票证请求失败 **NTLM 事件:** - **4776** - NTLM 凭据验证(当 Kerberos 不可用或失败时使用) ### 会话事件 - **21** - 会话登录成功 - **22** - Shell 启动通知已接收 - **23** - 会话注销成功 - **24** - 会话已断开 - **25** - 会话重连成功 - **39** - 会话被另一个会话断开 - **40** - 会话断开并带有原因代码 ### 重连/断开 - **4778** - 会话重连到窗口站 - **4779** - 会话从窗口站断开 ### 注销 - **4634** - 账户已注销 - **4647** - 用户发起的注销 - **9009** - Desktop Window Manager 已退出 ### 出站连接 - **1102** - RDP 客户端连接已发起 ## 登录类型 脚本过滤并报告以下 RDP 相关的登录类型: | 类型 | 描述 | |------|-------------| | 10 | RemoteInteractive(标准 RDP 连接) | | 7 | 解锁或重连到现有会话 | | 3 | 网络登录(可能包括 RDP) | | 5 | 服务或控制台连接 | ## 事件日志位置 脚本查询以下事件日志: 1. **Security** (`Security`) - 认证和登录/注销事件 - 会话重连/断开事件 2. **TerminalServices-RemoteConnectionManager** (`Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational`) - 连接尝试和认证 3. **TerminalServices-LocalSessionManager** (`Microsoft-Windows-TerminalServices-LocalSessionManager/Operational`) - 会话生命周期事件 4. **TerminalServices-RDPClient** (`Microsoft-Windows-TerminalServices-RDPClient/Operational`) - 出站 RDP 连接 5. **System** (`System`) - 指示会话终止的 DWM 退出事件 ## 输出格式 ### CSV 导出 使用 `-ExportPath` 参数时,会生成两个文件: 1. **RDP_Forensics_TIMESTAMP.csv** - 详细事件日志,包含列: - TimeCreated - EventID - EventType - User - Domain - SourceIP - SessionID - LogonID - Details 2. **RDP_Summary_TIMESTAMP.txt** - 摘要报告,包含: - 分析时段 - 事件总数 - 按类型分组的事件 - 唯一用户 - 唯一源 IP ## 常见用例 ### 事件响应 ``` # 调查来自特定 IP 的可疑活动 Get-RDPForensics -SourceIP "203.0.113.50" -StartDate (Get-Date).AddDays(-7) -ExportPath "C:\IR\RDP" ``` ### 合规审计 ``` # 每月 RDP 访问审计 Get-RDPForensics -StartDate (Get-Date).AddMonths(-1) -ExportPath "C:\Compliance\RDP_$(Get-Date -Format 'yyyy-MM')" ``` ### 用户活动追踪 ``` # 跟踪特定用户的 RDP 会话 Get-RDPForensics -Username "admin" -StartDate (Get-Date).AddDays(-30) -ExportPath "C:\UserActivity" ``` ### 实时监控 ``` # 检查当前会话 Get-RDPCurrentSessions -ShowProcesses ``` ### 失败登录分析(暴力破解检测) ``` # 导出事件并筛选失败的尝试 $events = Get-RDPForensics -StartDate (Get-Date).AddDays(-1) $events | Where-Object { $_.EventID -eq 4625 } | Group-Object SourceIP | Sort-Object Count -Descending ``` ## 故障排除 ### 未返回事件 1. **检查管理员权限**:确保您以管理员身份运行 # 验证管理员权限 ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) 2. **验证事件日志存在**:确保所需日志已启用 Get-WinEvent -ListLog *TerminalServices* | Select-Object LogName, IsEnabled, RecordCount 3. **检查日期范围**:事件可能超出您指定的日期范围或日志可能已轮换 4. **增加日志大小**:如果日志轮换太快,请增加最大日志大小 wevtutil sl Microsoft-Windows-TerminalServices-LocalSessionManager/Operational /ms:104857600 ### 解析错误 如果您遇到 regex 解析问题(用户名显示为 "-\-"),请确保使用最新版本的脚本,其中包含更新的 regex 模式。 ### 性能考虑 对于具有大量日志的大型环境: - 使用特定日期范围限制查询范围 - 按用户名或 IP 过滤以减少结果集 - 考虑计划导出而不是实时查询 - 如果处理大型结果集,请增加 PowerShell 的可用内存 ## 安全最佳实践 1. **保护导出的日志**:将取证数据存储在访问受限的安全位置 2. **定期监控**:安排定期分析以尽早检测异常 3. **日志保留**:确保足够的日志保留策略(至少 30-90 天) 4. **建立基线**:创建正常 RDP 活动的基线以进行比较 5. **异常告警**:设置告警针对: - 来自同一 IP 的多次登录失败 - 来自异常地理位置的登录 - 非工作时间的管理员访问 - 异常的会话持续时间 ## 其他资源 - [Microsoft: 审核登录事件](https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/basic-audit-logon-events) - [Microsoft: 远程桌面服务事件日志故障排除](https://learn.microsoft.com/en-us/troubleshoot/windows-server/remote/log-files-to-troubleshoot-rds-issues) ## 文档 - **[CHANGELOG.md](CHANGELOG.md)** - 版本历史和发布说明 - **[入门指南](docs/GETTING_STARTED.md)** - 快速入门教程和常见场景 - **[快速参考](docs/QUICK_REFERENCE.md)** - 事件 ID 速查表和 PowerShell 单行命令 - **[Kerberos/NTLM 认证](docs/KERBEROS_NTLM_AUTHENTICATION.md)** - 深入了解预认证追踪 - **[发布说明](docs/releases/)** - 所有版本的详细发布说明 - [v1.0.8](docs/releases/v1.0.8.md) - Event 4648, 参数集, SessionID 修复 - [v1.0.7](docs/releases/v1.0.7.md) - 关联引擎修复 - [v1.0.6](docs/releases/v1.0.6.md) - Kerberos/NTLM 追踪 - [v1.0.5](docs/releases/v1.0.5.md) - ActivityID 关联 - [v1.0.4](docs/releases/v1.0.4.md) - 会话分组 ## 版本历史 完整版本历史请参见 [CHANGELOG.md](CHANGELOG.md)。 ## 许可证 此工具包按原样提供,用于取证分析和安全监控目的。 ## 贡献 请查看[贡献指南](CONTRIBUTING.md)。 ## 变更日志 每个版本的完整更改列表可在[变更日志](CHANGELOG.md)中找到。 ## 文档 文档可在 [RDP-Forensic Wiki](https://github.com/dsccommunity/RDP-Forensic/wiki) 中找到。 DSC 资源架构文件用于在每次 PR 合并时自动更新 文档。 ### 示例 您可以查看 RDP-Forensic 模块中的[示例](/source/Examples)目录, 了解模块中所有资源的一些通用使用场景。 资源示例也可在 [RDP-Forensic Wiki](https://github.com/dsccommunity/RDP-Forensic/wiki) 中找到。
标签:AI合规, Awesome, FOFA, Libemu, PowerShell工具, RDP取证, RDP安全, Windows事件日志, 会话追踪, 免杀技术, 数字取证, 日志关联, 暴力破解检测, 系统管理, 红队行动, 自动化脚本, 远程桌面分析