自启动点是持久化的首选
入侵者拿到执行权限后的第一诉求是“活下来”,自启动点因此成为最常被写入的位置:注册表 Run 与 RunOnce 键、启动目录、Winlogon 的 Shell 与 Userinit,都是典型目标。加固方式不是逐个禁用,而是把这些位置基线化:定期导出清单,与已知良好状态比对,新增项必须有变更记录和解释。
基本信息
| 适用平台 | Windows Server / Windows 10、11 |
|---|---|
| 常见位置 | HKLM 与 HKCU 的 Run、RunOnce;启动目录;Winlogon 的 Shell、Userinit |
| 工具 | Get-CimInstance Win32_StartupCommand、Autoruns、Get-ScheduledTask |
| 基线 | 启动项清单可解释,新增项有变更记录 |
| 风险等级 | 中 |
典型使用场景
- 例行巡检:导出启动项清单并与上次比对
- 应急排查:怀疑持久化时优先检查启动项与计划任务
- 新机交付:确认出厂镜像没有多余自启动程序
- 变更核实:安装软件后确认新增了哪些自启动项
- 终端治理:清理无用自启动项,改善开机性能与安全面
盘点命令
盘点命令
Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location, User
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -ErrorAction SilentlyContinue
Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -ErrorAction SilentlyContinue
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' | Select-Object Shell, Userinit
Get-ChildItem "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp" -ErrorAction SilentlyContinue
Get-ScheduledTask | Where-Object {$_.State -ne 'Disabled'} | Select-Object TaskName, TaskPath | Select-Object -First 20位置与风险读法
| 位置 | 正常内容 | 可疑迹象 |
|---|---|---|
| HKLM Run | 厂商驱动、监控代理 | 指向用户目录或临时目录的程序 |
| HKCU Run | 用户级常驻程序 | 全机器都出现的同名异常项 |
| 启动目录 | 少量快捷方式 | 可执行文件本体放在启动目录 |
| Winlogon Shell | 默认 explorer.exe | 被替换为其它程序 |
| 计划任务 | 系统维护与更新任务 | 含编码参数或伪装名称的任务 |
更完整的清单要用 Sysinternals Autoruns(含计划任务、WMI 订阅、服务):建立已知良好基线后定期比对,比逐项人工判断可靠。
落地要点
- HKCU 启动项按用户独立:排查要覆盖所有交互用户与默认用户模板
- WMI 永久事件订阅不在常规启动项里:用 Get-CimInstance 查 root\subscription 或 Autoruns 查看
- 计划任务同样属于自启动面:导出启用状态的任务清单一起比对
- 基线文件要归档:没有基线,新增项就无法判定
- 把比对结果与变更单关联,避免“每台机器都有”式的无解解释
默认用户模板(Default User)里的启动项会影响后续新建的所有用户:排查时不要遗漏这一份。