WinIR-Helper v0.1:基于 PowerShell 的 Windows 应急响应信息收集脚本
从蓝队靶场出发基于 PowerShell 编写 Windows 应急响应信息收集脚本 WinIR-Helper v0.10x01 前言最近在刷知攻善防蓝队靶场时发现 Windows 应急响应中有很多重复性操作。例如查看登录日志、统计来源 IP、排查本地用户、检查管理员组成员、查看启动项、计划任务和网络连接等。在手工排查时这些步骤虽然并不复杂但每次都需要重复执行命令、导出结果、整理证据。因此我尝试基于 PowerShell 编写一个简单的 Windows 应急响应信息收集脚本用于辅助完成主机基础信息采集和初步风险筛查。本工具命名为WinIR-Helper当前版本为v0.1 基础采集与初步风险筛选版该版本主要目标不是替代人工分析而是帮助蓝队人员在应急响应初期快速收集基础信息并输出结构化结果文件。0x02 工具功能设计WinIR-Helper v0.1 目前主要实现以下功能1. 导出 4624 登录成功日志2. 导出 4625 登录失败日志3. 统计来源 IP4. 筛选高危 IP5. 导出本地用户6. 导出管理员组成员7. 导出启动项8. 导出计划任务9. 导出当前网络连接10. 进行危险端口警报11. 生成采集摘要其中4624 和 4625 是 Windows 登录排查中最常见的两个安全事件。4624 用于表示登录成功4625 用于表示登录失败。通过对这两类事件进行统计可以辅助判断是否存在爆破尝试、异常远程登录或疑似爆破成功行为。脚本中通过 Days 参数控制日志采集范围通过 FailedThreshold 参数控制高危 IP 的判断阈值。默认采集最近 7 天日志并将单个 IP 登录失败次数超过 10 次作为高危判断条件之一。0x03 运行方式使用前建议以管理员身份运行 PowerShell否则可能无法正常读取 Security 安全日志。首先进入脚本所在目录powershellcd C:\Users\Might\Desktop\新建文件夹临时允许当前 PowerShell 会话运行脚本powershellSet-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass运行脚本powershell.\WinIR-Helper.ps1默认采集最近 7 天的数据。也可以自定义日志范围和高危 IP 阈值powershell.\WinIR-Helper.ps1 -Days 30 -FailedThreshold 20上述命令表示采集最近 30 天日志并将单个 IP 登录失败次数达到 20 次作为高危判断条件。0x04 运行效果脚本运行后会在当前目录下生成一个结果文件夹命名格式如下WinIR_应急响应结果_时间运行成功后控制台会输出本次采集结果包括登录成功日志数量、登录失败日志数量、高危 IP 数量、危险端口告警数量以及结果目录。输出目录中主要包含以下文件4624_登录成功日志.csv4625_登录失败日志.csv来源IP统计.csv高危IP筛选.csv本地用户.csv管理员组成员.csv启动项.csv计划任务.csv当前网络连接.csv危险端口警报.csv采集摘要.txt0x05 核心代码分析1. 参数设计脚本开头定义了两个参数powershellparam([int]$Days 7,[int]$FailedThreshold 10)其中参数 作用$Days 指定采集最近多少天的日志$FailedThreshold 指定高危 IP 判断阈值这样设计的好处是不用每次修改源码可以直接在运行时传参。例如powershell.\WinIR-Helper.ps1 -Days 30 -FailedThreshold 20这样就可以采集最近 30 天日志并将高危 IP 阈值改为 20 次失败登录。2. 输出目录设计脚本会根据当前时间自动创建结果目录$采集时间 Get-Date -Format yyyyMMdd_HHmmss$输出目录 Join-Path (Get-Location) WinIR_应急响应结果_$采集时间这样每次运行都会生成独立目录避免覆盖之前的采集结果。3. 管理员权限检测读取 Windows 安全日志通常需要管理员权限因此脚本在运行初期加入了权限检测$当前用户 [Security.Principal.WindowsIdentity]::GetCurrent()$权限对象 New-Object Security.Principal.WindowsPrincipal($当前用户)$是否管理员 $权限对象.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)如果当前 PowerShell 不是管理员权限脚本会输出提示信息。当前版本只是提示后续版本可以改为强制退出或自动提权重启。4. 登录日志采集脚本通过 Get-WinEvent 读取 Windows Security 日志并按事件 ID 进行筛选powershellGet-WinEvent -FilterHashtable {LogName SecurityId $事件IDStartTime $开始时间}其中4624登录成功4625登录失败脚本会将事件中的用户名、域名、登录类型、来源 IP、工作站名、进程名、状态码等字段提取出来方便后续分析。5. 来源 IP 统计在导出 4624 和 4625 日志后脚本会对来源 IP 进行统计。统计内容包括来源 IP总次数成功次数失败次数首次发现时间最后发现时间风险等级风险原因脚本会排除一些无效或本地地址例如-127.0.0.1::10.0.0.0这样可以减少部分无效记录对结果的影响。6. 高危 IP 筛选高危 IP 判断逻辑主要包括两类1. 单个 IP 登录失败次数超过阈值2. 单个 IP 出现大量登录失败后又出现登录成功例如某个 IP 在短时间内出现大量 4625 登录失败随后又出现 4624 登录成功就可能存在爆破成功的风险。脚本会将这类 IP 输出到高危IP筛选.csv7. 本地用户与管理员组检查脚本会导出当前主机上的本地用户本地用户.csv主要字段包括用户名是否启用最后登录时间密码最后设置时间是否需要密码用户是否可改密码描述同时脚本也会导出本地管理员组成员管理员组成员.csv这一部分主要用于排查是否存在异常新增账号或者普通账号被加入管理员组的情况。8. 启动项与计划任务检查在 Windows 应急响应中启动项和计划任务是常见的持久化位置。脚本会分别导出启动项.csv计划任务.csv启动项中重点关注启动项名称启动命令启动位置所属用户计划任务中重点关注任务名称任务路径任务状态作者执行动作如果发现计划任务中执行了可疑路径例如C:\Users\Public\C:\Windows\Temp\AppData\Roaming\就需要进一步排查。9. 当前网络连接检查脚本会使用 Get-NetTCPConnection 获取当前 TCP 网络连接并关联对应进程名。输出字段包括本地地址本地端口远程地址远程端口连接状态进程ID进程名这一部分可以帮助分析主机是否存在异常外联、远程连接或可疑监听端口。10. 危险端口警报脚本内置了一组常见危险端口例如21 FTP22 SSH23 Telnet135 RPC139 NetBIOS445 SMB1433 MSSQL3306 MySQL3389 RDP6379 Redis9200 Elasticsearch27017 MongoDB当当前网络连接中出现这些端口时脚本会输出到危险端口警报.csv危险端口告警中会包含检测位置端口服务风险等级风险说明本地地址远程地址连接状态进程ID进程名安全建议脚本不仅会检查本地端口也会检查远程端口。如果本机正在连接某些高风险远程端口也会给出提示。0x06 测试结果本次在 Windows 主机上运行脚本后成功生成了应急响应结果目录。运行结果如下登录成功日志数量0登录失败日志数量0高危 IP 数量0危险端口初筛数量241在首次测试中脚本能够正常生成结果目录并完成本地用户、管理员组成员、启动项、计划任务、当前网络连接和危险端口初筛等信息采集。由于本次测试时 PowerShell 未以管理员权限运行导致 Security 安全日志读取失败因此 4624 登录成功日志和 4625 登录失败日志数量均为 0。这也说明管理员权限检测是后续版本需要优先优化的部分。本次测试中危险端口初筛数量为 241 条。该结果并不代表主机一定存在入侵行为而是说明当前版本的端口检测逻辑仍然偏粗后续需要进一步区分本地监听、外部连接、本机外联和普通内网连接从而降低误报。0x07 当前版本不足WinIR-Helper v0.1 目前仍然是基础版本主要存在以下不足1. 管理员权限不足时只提示不会自动退出或自动提权2. 危险端口告警规则较粗容易产生较多误报3. 网络连接中暂未输出进程路径和文件 Hash4. 暂未对可疑进程进行自动筛选5. 暂未检测 7045、4698、4720、4732、1102 等关键安全事件6. 暂未生成 HTML 可视化报告因此该工具当前只能作为应急响应初期的信息收集和辅助判断工具不能直接作为最终入侵结论。0x08 后续优化方向后续计划继续完善以下功能1. 管理员权限检测增强如果不是管理员权限则自动退出或尝试以管理员身份重新运行。2. 危险端口告警降噪区分本地监听端口、外部连接、本机外联和普通内网连接。3. 增加进程路径和 Hash在网络连接中补充进程路径、MD5 和 SHA256方便定位可疑文件。4. 增加可疑进程检测重点关注 Temp、Public、AppData、ProgramData 等目录中的异常进程。5. 增加关键安全事件检测例如 7045 新服务安装、4698 创建计划任务、4720 创建用户、4732 加入管理员组、1102 安全日志清除。6. 生成 HTML 应急响应报告将 CSV 结果汇总成更适合阅读和展示的 HTML 报告。0x09 总结通过这个小工具我对 Windows 应急响应中的基础排查流程有了更清晰的理解。相比单纯手工执行命令WinIR-Helper v0.1 可以帮助快速完成基础信息采集并将结果结构化保存方便后续分析和复盘。虽然当前版本还比较简单但它已经具备了登录日志采集、来源 IP 统计、高危 IP 筛选、用户检查、启动项检查、计划任务检查、网络连接检查和危险端口警报等基础能力。项目后续会整理到 GitHub并按照 v0.1、v0.2、v0.3 的方式持续迭代。当前 v0.1 主要完成基础采集和初步筛查后续版本将重点优化权限检测、端口告警降噪、进程路径与 Hash 计算、关键安全事件检测和 HTML 报告生成。