# Windows Endpoint Introduction(Windows 端点基础)
# 01. Command Prompt (CMD & Batch)
# 1.1 基础概念
CMD(命令提示符)是 Windows 默认的命令行解释器。Batch( .bat 或 .cmd )是 CMD 的批处理脚本语言,用于自动化执行一系列命令。
# 1.2 代码示例:系统信息收集
以下脚本用于收集 Windows 操作系统的基础信息。
(注:已修复原笔记中 systeminfo 与 findstr 之间缺失管道符 | 的语法错误)
@ECHO OFF
TITLE Example Batch File
ECHO This batchfile will show Windows 10 Operating System information
:: 使用管道符 | 将 systeminfo 的输出传递给 findstr 进行过滤
systeminfo | findstr /C:"Host Name"
systeminfo | findstr /C:"OS Name"
systeminfo | findstr /C:"OS Version"
systeminfo | findstr /C:"System Type"
systeminfo | findstr /C:"Registered Owner"
PAUSE
# 1.3 Batch 脚本的局限性
在实际开发或复杂攻击载荷编写中,Batch 脚本存在明显短板:
- 缺乏结构化错误处理:没有类似
try-catch的机制,难以优雅地处理命令执行失败的情况(通常只能通过%errorlevel%进行简单的状态判断)。 - 非模块化 / 非面向对象:不支持函数的高级封装、面向对象编程,代码复用性差,难以维护大型脚本。
- 功能受限:原生不支持复杂的数据结构(如数组、字典),字符串处理能力较弱。
# 02. Visual Basic Script (VBScript)
# 2.1 基础概念
VBScript 是微软开发的一种轻量级脚本语言,基于 Visual Basic。它可以通过 Windows Script Host (WSH) 执行,常用于系统管理、自动化任务,但也常被攻击者利用。
# 2.2 代码示例:通过 WMI 获取系统信息
以下脚本通过 WMI (Windows Management Instrumentation) 查询操作系统详细信息。
(注:已修复原笔记中变量未赋值、字符串拼接缺失 & 、WMI 路径括号错误等语法问题)
' List Operating System and Service Pack Information
strComputer = "." ' "." 代表本地计算机
' 连接到 WMI 服务
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
' 执行 WMI 查询
Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
' 遍历结果并输出
For Each objOS in colOSes
Wscript.Echo "Computer Name: " & objOS.CSName
Wscript.Echo "Caption: " & objOS.Caption
Wscript.Echo "Version: " & objOS.Version
Wscript.Echo "Build Number: " & objOS.BuildNumber
Wscript.Echo "Build Type: " & objOS.BuildType
Wscript.Echo "OS Type: " & objOS.OSType
Wscript.Echo "Other Type Description: " & objOS.OtherTypeDescription
WScript.Echo "Service Pack: " & objOS.ServicePackMajorVersion & "." & objOS.ServicePackMinorVersion
Next
# 2.3 脚本执行方式
在 Windows 中,执行 VBScript 主要有两个宿主程序:
cscript.exe:基于控制台(Command-line)执行,输出结果打印在 CMD 窗口中。(适合信息收集、后台静默执行)。wscript.exe:基于 Windows 窗口执行,输出结果通常以弹窗(MessageBox)形式显示。(常用于 GUI 交互)。
执行示例:
C:\Users\offsec> cscript.exe C:\tools\windows_endpoint_introduction\osinfo.vbs
输出结果:
Microsoft (R) Windows Script Host Version 5.812 | |
Copyright (C) Microsoft Corporation. All rights reserved. | |
Computer Name: CLIENT01 | |
Caption: Microsoft Windows 10 Pro | |
Version: 10.0.19042 | |
Build Number: 19042 | |
OS Type: 18 | |
Other Type Description: | |
Service Pack: 0.0 |
# 2.4 安全视角:VBScript 的恶意利用
在红队行动或恶意软件分析中,VBScript 具有极高的 “武器化” 价值:
- 社会工程学 / 钓鱼攻击:常被伪装成
.vbs附件,诱导用户双击执行(诱导执行)。 - Office 宏病毒植入:VBA (Visual Basic for Applications) 与 VBScript 语法高度相似,攻击者常在 Word/Excel 宏中植入恶意 VBS 代码,实现初始访问。
- 无文件攻击 / 下载器 (Downloader):利用 VBScript 的
MSXML2.XMLHTTP或WinHttp.WinHttpRequest对象从 C2 服务器下载第二阶段 Payload 并执行,且无需在磁盘留下明显的可执行文件(.exe)。 - 绕过检测:由于 VBScript 是系统原生支持的合法组件(LOLBins),执行时往往能绕过部分基础的安全软件检测。
# 03_PowerShell
# 3.1 基础概念与执行策略
PowerShell 是微软开发的任务自动化和配置管理框架,基于 .NET 构建。与 CMD 基于纯文本不同,PowerShell 管道传递的是对象(Objects),这使得数据提取和处理极其强大。
执行策略(Execution Policy) 用于控制 PowerShell 加载配置文件和运行脚本的安全机制(注意:它不是安全边界,主要用于防止误操作)。
- 查看当前策略:
Get-ExecutionPolicy - 常见策略:
Restricted(默认):不允许运行任何脚本。RemoteSigned:本地脚本可运行,从网络下载的脚本需要数字签名。Unrestricted:忽略警告,运行所有脚本。Bypass:不阻止任何内容,不显示警告或提示(渗透测试中最常用)。
- 绕过策略执行脚本:
powershell.exe -ExecutionPolicy Bypass -File .\script.ps1
# 3.2 核心 Cmdlet 与对象管道
PowerShell 的命令称为 Cmdlet(发音为 command-let),严格遵循 动词-名词 的命名规范(如 Get-Service )。
1. 获取系统信息
使用 Get-CimInstance (替代了旧的 Get-WmiObject )查询 WMI/CIM 类。
# 获取操作系统详细信息 | |
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property CSName, Caption, Version, BuildNumber, BuildType, OSType, RegisteredUser, OSArchitecture, ServicePackMajorVersion, ServicePackMinorVersion |
注:PowerShell 管道传递的是对象, Select-Object 可以精确提取对象的特定属性,充分体现了其结构化数据处理的优势。
2. 获取与筛选服务
# 获取所有服务列表 | |
Get-Service | |
# 结合 Where-Object 筛选状态为 "Running" 的服务 | |
Get-Service | Where-Object { $_.Status -eq "Running" } |
注: $_ 代表管道传入的当前对象。
# 3.3 脚本编写与执行
将上述信息收集命令整合到 PowerShell 脚本( .ps1 )中。
# hostinfo.ps1 | |
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property CSName, Caption, Version, BuildNumber, BuildType, OSType, RegisteredUser, OSArchitecture, ServicePackMajorVersion, ServicePackMinorVersion | |
Get-Service | Where-Object { $_.Status -eq "Running" } |
执行脚本:
.\hostinfo.ps1 |
# 3.4 帮助系统与别名
1. 帮助系统 ( Get-Help )
PowerShell 拥有极其完善的内置帮助文档,是学习和排错的核心工具。
Get-Help Get-Service # 查看基础帮助 | |
Get-Help Get-Service -Full # 查看完整帮助 | |
Get-Help Get-Service -Examples # 查看使用示例(最实用) | |
Get-Help -UpdateHelp # 从网络更新本地帮助文件 |
2. 别名 ( Get-Alias )
为了兼容 CMD 用户或简化输入,PowerShell 为许多 Cmdlet 提供了别名。
Get-Alias # 列出所有别名 | |
Get-Alias gcim # 查看特定别名对应的 Cmdlet (gcim -> Get-CimInstance) |
安全提示:攻击者常利用别名来缩短恶意命令,或在系统日志中混淆视听。
# 3.5 自定义函数与模块
除了使用内置命令,还可以自定义函数并封装为模块,实现代码复用和模块化。
1. 自定义函数
例如,编写一个查询当前安装的杀毒软件 / 安全产品的函数(在红队评估中常用于枚举 AV/EDR):
function Get-AVInfo { | |
Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct | |
} |
2. 创建与导入模块
将自定义函数保存到 .psm1 文件(如 CustomRecon.psm1 )中。
# 导入模块 | |
Import-Module .\CustomRecon.psm1 | |
# 导入后,即可像调用本地内置命令一样调用自定义函数 | |
Get-AVInfo |
# 04_Windows Event Log
熟悉 Windows 事件日志(Event Log)是进行系统故障排查、安全事件响应与取证分析的核心技能。
- 存储路径:
C:\Windows\System32\winevt\Logs - 文件格式:日志文件为
.evtx格式,本质上是二进制结构。直接使用文本编辑器打开会显示为十六进制乱码。 - 查看权限:需要管理员或特权模式才能完整查看和导出。
- 查看工具:
- GUI:Windows 事件查看器(Event Viewer,
eventvwr.msc),支持图形化筛选。 - CLI:PowerShell 的
Get-WinEvent或旧版的Get-EventLog。 - 第三方:Event Log Explorer, Log Parser 等。
- GUI:Windows 事件查看器(Event Viewer,
# 05_Introduction to Windows Events
# 5.1 核心日志分类 (Channels)
在 “Windows 日志” 下,主要分为 5 个不同的分类:
- Application(应用程序):记录应用程序级别的事件(如软件报错、数据库日志)。
- Security(安全):最重要。记录审计事件,如登录 / 注销、对象访问、权限更改、策略修改。
- Setup(安装):记录系统安装、更新(Windows Update)相关的事件。
- System(系统):记录 Windows 系统组件和驱动程序的事件(如服务启动失败、驱动加载)。
- Forwarded Events(转发的事件):用于 Windows 事件转发(WEF),集中收集来自域内其他主机的日志。
# 5.2 事件级别 (Level)
事件按严重程度分类,具体的审计规则可在本地安全策略或域组策略(GPO)中配置:
- Information(信息):常规操作成功记录。
- Warning(警告):非致命问题,可能预示未来故障。
- Error(错误):功能失效或数据丢失。
- Critical(严重):导致系统崩溃或核心功能失效的致命错误。
- Audit Success / Audit Failure(审计成功 / 失败):安全日志专属,记录策略审计的结果(安全分析中 Audit Failure 极其关键)。
# 5.3 事件结构 (XML 视图)
在事件查看器中切换到 “XML 视图”,可以看到事件的底层结构,主要分为两部分:
<System>(系统元数据):Provider Name:生成事件的组件(如Microsoft-Windows-Security-Auditing)。EventID:事件唯一标识符(如4624)。Level:事件级别。TimeCreated:事件发生的精确时间。
<EventData>(事件数据):- 包含具体的参数和上下文信息(如用户名、进程 ID、IP 地址等)。不同 EventID 的 Data 字段结构不同。
# 5.4 筛选与实战分析
1. 日志筛选 (Filtering)
在事件查看器中使用 “筛选当前日志” 功能,或通过 PowerShell 进行精准过滤。例如,筛选 4624 (成功登录)或 4625 (失败登录)。
2. 核心安全事件分析:登录事件 (4624)
当发现 4624 成功登录事件时,需深入分析 <EventData> 中的关键信息:
- TargetUserName:被登录的账户名。
- LogonType:登录方式(极其重要,用于判断攻击手法)。
- IpAddress:来源 IP 地址。
3. 常见 Logon Type (登录类型) 映射
2:Interactive(交互式本地登录,用户在物理机前输入密码)。3:Network(网络登录,如访问 SMB 共享\\IP\C$、WMI 远程执行)。横向移动常用。5:Service(服务启动)。9:NewCredentials(使用新凭据运行程序,如runas /netonly)。10:RemoteInteractive(远程交互登录,即 RDP 远程桌面)。
4. 威胁狩猎与异常判断 (Threat Hunting)
通过结合 LogonType 和 IpAddress 快速判断行为合理性:
- 异常 RDP 连接:如果发现
LogonType 10,且IpAddress来自外部未知 IP,或来自内网中不应该具备 RDP 权限的网段 / 主机,极可能是攻击者窃取了凭据并进行远程接入。 - 内网横向移动 (Lateral Movement):如果发现大量
LogonType 3(SMB/WMI) 或LogonType 10(RDP) 从单一内部 IP 发散到多台主机,或者来源 IP 是普通的员工终端而非管理员堡垒机,需高度怀疑内网横向移动行为。
# 06_PowerShell and Event Logs
# 6.1 基础查询与权限要求
PowerShell 提供了 Get-WinEvent cmdlet 用于高效查询和筛选 Windows 事件日志。
- 权限要求:
Application、Setup、System日志普通用户即可读取,但Security日志必须以管理员(特权)权限运行 PowerShell 才能访问。
列出核心日志的基本信息:
Get-WinEvent -ListLog Application, Security, Setup, System |
输出示例:
LogMode MaximumSizeInBytes RecordCount LogName
------- ------------------ ----------- -------
Circular 20971520 12543 Application
Circular 20971520 34821 Security
Circular 1052672 256 Setup
Circular 20971520 8932 System
关键属性说明:
- LogMode:日志轮转模式。
Circular表示当日志达到最大大小时,最旧的条目将被自动覆盖删除。 - MaximumSizeInBytes:日志文件的最大容量限制。
- RecordCount:当前日志中的事件总数。
- LogName:日志通道名称。
# 6.2 管道筛选 (Where-Object)
使用管道将 Get-WinEvent 的输出传递给 Where-Object 进行条件过滤。
(注:此方法效率较低,因为会先读取所有事件再在内存中筛选)
# 筛选 Security 日志中 EventID 为 4624(成功登录)的前 10 条记录 | |
Get-WinEvent -LogName 'Security' | Where-Object { $_.Id -eq 4624 } | Select-Object -Property TimeCreated, Message -First 10 |
# 6.3 哈希表筛选 (FilterHashtable) — 推荐方式
-FilterHashtable 是 Get-WinEvent 最强大的筛选参数,它在日志提供程序层面直接过滤,性能远优于管道 + Where-Object。
Hashtable 语法: @{ Key1='Value1'; Key2='Value2' }
常用筛选键:
| 键名 | 说明 | 示例 |
|---|---|---|
LogName | 日志通道 | 'Security' |
Id | 事件 ID | 4624 |
StartTime | 起始时间 | '2021-05-29 15:00:00' |
EndTime | 结束时间 | '2021-05-30 06:00:00' |
Level | 事件级别 | 2 (Error) |
ProviderName | 事件来源 | 'Microsoft-Windows-Security-Auditing' |
示例:按日期和 EventID 筛选
Get-WinEvent -FilterHashtable @{ | |
LogName = 'Security' | |
StartTime = '2021-05-29 15:00:00' | |
Id = 4624 | |
} | Select-Object -Property TimeCreated, Message |
# 6.4 实战案例:检测夜间异常远程登录
场景:排查是否有攻击者在非工作时间(如凌晨)通过 RDP 远程登录系统。
思路:
- 用
FilterHashtable高效筛选夜间时间段的4624登录事件。 - 用
Where-Object进一步过滤LogonType为10(RDP 远程交互登录)的记录。 - 用
Format-List展开完整详情进行分析。
完整命令:
Get-WinEvent -FilterHashtable @{ | |
LogName = 'Security' | |
StartTime = '2021-05-29 22:00:00' | |
EndTime = '2021-05-30 06:00:00' | |
Id = 4624 | |
} | Where-Object { | |
$_.Properties[8].Value -eq 10 | |
} | Format-List TimeCreated, Message |
关键细节说明:
$_代表管道中的当前事件对象。$_.Properties是一个数组,按索引存储<EventData>中的各个字段。对于4624事件,索引 8 (Properties[8]) 对应LogonType字段。LogonType 10= RemoteInteractive(RDP 远程桌面登录)。Format-List以纵向列表形式输出,便于阅读长文本的Message字段。
分析要点:在输出结果中重点关注 Source Network Address (来源 IP)和 Target User Name (目标账户),判断是否为合法的运维行为或可疑的横向移动 / 凭据窃取。
# 07_Empowering the Logs
# 7.1 原生日志的局限性与监控系统的需求
原生的 Windows 事件日志虽然强大,但在高级威胁检测中存在明显盲区:
- 信息粒度不足:例如,默认的进程创建事件(Event ID 4688)通常不包含完整的命令行参数,难以判断脚本或恶意软件的具体执行行为。
- 易被篡改或清除:攻击者在获取管理员权限后,常使用
wevtutil cl或 PowerShell 清除本地日志(会留下 Event ID 1102 清除日志的记录,但原始证据已丢失)。 - 缺乏网络层细节:原生日志对出站网络连接的记录不够详细。
为了 “赋能”(Empower)日志分析能力,需要引入更细粒度的端点监控工具和集中化管理机制。
# 7.2 引入 Sysmon (System Monitor)
Sysmon 是由 Microsoft Sysinternals 提供的一款轻量级系统服务和设备驱动程序,专门用于增强 Windows 系统的日志记录能力 [[1]]。
- 核心功能:记录系统活动并将其写入 Windows 事件日志,提供关于进程创建、网络连接、文件创建时间更改、注册表修改等的高细节信息 [[3]]。
- 安装方式:需以管理员权限运行,并通常配合社区成熟的 XML 配置文件(如 SwiftOnSecurity 配置)使用,以过滤噪音并定义监控规则。
sysmon.exe -accepteula -i config.xml - 日志存储位置:安装后,会在事件查看器中生成一个独立的专用通道:
Applications and Services Logs->Microsoft->Windows->Sysmon->Operational
# 7.3 Sysmon 核心事件 ID (Event IDs)
在安全分析中,以下几个 Sysmon Event ID 最具价值:
- Event ID 1 (Process Creation):进程创建。包含完整的命令行参数、父进程名称 / ID、进程哈希值(MD5/SHA1)、用户上下文。(检测恶意脚本执行的核心)
- Event ID 3 (Network Connection):网络连接。记录发起连接的进程名称、源 / 目的 IP 地址、源 / 目的端口、协议。(检测 C2 通信或横向移动)
- Event ID 11 (File Creation):文件创建。记录进程创建的文件路径及哈希值。(检测 Dropper 或 Webshell 写入)
- Event ID 13 (Registry Value Set):注册表值设置。(检测持久化机制,如 Run 键值修改)
# 7.4 查看与分析 Sysmon 日志
1. 使用 PowerShell 查询 Sysmon
利用 Get-WinEvent 可以高效提取 Sysmon 日志进行分析:
# 查询 Sysmon Operational 日志中的进程创建事件 (Event ID 1) 的前 5 条 | |
Get-WinEvent -FilterHashtable @{ | |
LogName = 'Microsoft-Windows-Sysmon/Operational' | |
Id = 1 | |
} | Select-Object -First 5 TimeCreated, Message | |
# 结合 Where-Object 筛选特定可疑进程(例如包含 powershell.exe 且带有隐藏参数) | |
Get-WinEvent -FilterHashtable @{ | |
LogName = 'Microsoft-Windows-Sysmon/Operational' | |
Id = 1 | |
} | Where-Object { $_.Message -match 'powershell\.exe.*-w hidden' } | Select-Object TimeCreated, Message |
# 7.5 集中化日志监控架构 (Centralized Logging)
仅依赖本地日志是不够的,企业级安全监控必须实现日志的集中化:
- Windows Event Forwarding (WEF):利用组策略 (GPO) 将端点的特定事件自动转发到集中的 Windows Event Collector (WEC) 服务器。即使端点被攻陷,日志已提前发送,攻击者无法抹除痕迹。
- SIEM 集成:将 WEC 收集到的日志或直接通过 Agent (如 Winlogbeat) 将日志发送至安全信息和事件管理系统(如 Splunk, ELK Stack, Graylog),以实现跨主机的关联分析、可视化仪表板和实时威胁告警。
# 08_System Monitor (Sysmon)
# 8.1 基础概念
Sysmon (System Monitor) 是 Microsoft Sysinternals 提供的一款轻量级系统服务和设备驱动程序。它常驻内存并在系统重启后持续运行,用于监控和记录详细的系统活动(如进程创建、网络连接、文件修改等)到 Windows 事件日志中,是端点威胁检测和取证分析的核心工具。
# 8.2 配置文件解析 (XML)
Sysmon 的强大之处在于其高度可定制的 XML 配置文件。以下是典型配置样本的结构与参数解析:
<Sysmon schemaversion="4.90"> | |
<!-- 全局设置:计算文件哈希的算法 --> | |
<HashAlgorithms>MD5,SHA256,IMPHASH</HashAlgorithms> | |
<!-- 高级取证:当 PE 文件被删除时,将其复制到指定目录备份 --> | |
<CopyOnDeletePE>True</CopyOnDeletePE> | |
<ArchiveDirectory>BackupDeleted</ArchiveDirectory> | |
<!-- 事件过滤规则核心区域 --> | |
<EventFiltering> | |
<!-- 规则组 1:进程创建 (ProcessCreate, Event ID 1) --> | |
<!-- groupRelation="or" 表示组内规则满足其一即触发 --> | |
<RuleGroup name="Process Rules" groupRelation="or"> | |
<!-- onmatch="exclude" 表示:匹配到的条件将被忽略(白名单降噪) --> | |
<ProcessCreate onmatch="exclude"> | |
<Image condition="is">C:\Program Files\Windows Media Player\wmplayer.exe</Image> | |
<Image condition="is">C:\Windows\system32\powercfg.exe</Image> | |
</ProcessCreate> | |
</RuleGroup> | |
<!-- 规则组 2:驱动加载 (DriverLoad, Event ID 6) --> | |
<RuleGroup name="Driver Rules" groupRelation="or"> | |
<DriverLoad onmatch="exclude"> | |
<Signature condition="begin with">AMD</Signature> | |
<Signature condition="contains">microsoft</Signature> | |
<Signature condition="contains">windows</Signature> | |
</DriverLoad> | |
</RuleGroup> | |
<!-- 规则组 3:网络连接 - 排除常见浏览器噪音 (NetworkConnect, Event ID 3) --> | |
<RuleGroup name="Network Process Rules" groupRelation="or"> | |
<NetworkConnect onmatch="exclude"> | |
<Image condition="end with">Chrome.exe</Image> | |
<Image condition="end with">msedge.exe</Image> | |
</NetworkConnect> | |
</RuleGroup> | |
<!-- 规则组 4:网络连接 - 仅记录特定端口 (Include 模式) --> | |
<RuleGroup name="Network Port Rules" groupRelation="or"> | |
<!-- onmatch="include" 表示:仅记录匹配到的条件(黑名单 / 精准监控) --> | |
<NetworkConnect onmatch="include"> | |
<DestinationPort condition="is">8080</DestinationPort> | |
<DestinationPort condition="is">443</DestinationPort> | |
</NetworkConnect> | |
</RuleGroup> | |
</EventFiltering> | |
</Sysmon> |
# 8.3 核心配置逻辑
onmatch="exclude"(排除模式):默认记录所有事件,但忽略符合规则的事件。常用于过滤已知的、高频的良性系统行为(白名单降噪)。onmatch="include"(包含模式):默认不记录任何事件,仅记录符合规则的事件。常用于精准监控特定的高危行为(如特定端口的外连、特定目录的文件创建)。condition属性:支持灵活的字符串匹配,常用条件包括:is:完全匹配。contains:包含指定字符串。begin with/end with:以指定字符串开头 / 结尾。image:匹配进程完整路径。
# 8.4 命令行管理与状态检查
Sysmon 的可执行文件( Sysmon.exe 或 Sysmon64.exe )需在管理员权限的命令行下运行。
1. 查看当前配置
使用 -c 参数可以输出当前加载的配置摘要:
PS C:\Sysmon> .\Sysmon64.exe -c | |
System Monitor v13.22 - System activity monitor | |
Copyright (C) 2014-2021 Mark Russinovich and Thomas Garnier | |
Using libxml2. libxml2 is Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. | |
Sysinternals - www.sysinternals.com | |
Current configuration: | |
- Service name: Sysmon | |
- Driver name: SysmonDrv | |
- Config file: C:\Sysmon\sysmonconfig.xml | |
- Hashing algorithms: MD5,SHA256,IMPHASH | |
- CopyOnDeletePE: Enabled | |
- Archive directory: C:\Sysmon\BackupDeleted |
2. 常用管理命令速查
- 安装并应用配置:
.\Sysmon64.exe -accepteula -i config.xml - 更新现有配置:
.\Sysmon64.exe -c config.xml(无需重启服务即可生效) - 卸载 Sysmon:
.\Sysmon64.exe -u(会清除驱动和服务,但已写入事件日志的数据保留) - 查看事件日志:可通过事件查看器定位至
Applications and Services Logs->Microsoft->Windows->Sysmon->Operational。
# 09_Sysmon and Event Viewer
# 9.1 Sysmon 日志查看路径
Sysmon 生成的日志不会出现在默认的 "Windows Logs" 中,而是存储在专用的应用程序和服务日志通道内。
- GUI 路径:打开事件查看器 (
eventvwr.msc) ->Applications and Services Logs(应用程序和服务日志) ->Microsoft->Windows->Sysmon->Operational。 - PowerShell 路径:
Microsoft-Windows-Sysmon/Operational
# 9.2 实战案例:监控批处理 (.bat) 文件创建
场景:攻击者常通过 PowerShell 或脚本在目标系统上生成恶意的 .bat 或 .cmd 文件以实现持久化或执行载荷。我们可以通过 Sysmon 的 Event ID 11 (File Create) 进行精准监控。
1. 配置 Sysmon 规则
在 Sysmon 配置文件的 <EventFiltering> 节点中添加以下规则(使用 include 模式精准监控):
<RuleGroup name="Suspicious File Creation" groupRelation="or"> | |
<FileCreate onmatch="include"> | |
<TargetFilename condition="end with">.bat</TargetFilename> | |
<TargetFilename condition="end with">.cmd</TargetFilename> | |
</FileCreate> | |
</RuleGroup> |
(更新配置: Sysmon64.exe -c config.xml )
2. 触发测试
在目标机器上使用 PowerShell 创建一个批处理文件:
New-Item -Path "C:\Temp\malicious_script.bat" -ItemType File -Value "echo hacked" |
3. 日志检索与分析
在事件查看器中,右键点击 Operational 日志 -> Filter Current Log ,在 <All Event IDs> 中输入 11 。
找到对应记录后,切换到 Details (详细信息) 选项卡,重点分析以下核心字段:
RuleName:触发该事件的规则名称(如果在 XML 中配置了name属性,有助于快速分类)。UtcTime:事件发生的精确 UTC 时间。ProcessGuid/ProcessId:发起该操作的进程唯一标识符和 PID,可用于与其他 Sysmon 事件(如 Event ID 1 进程创建)进行关联分析。Image:(关键溯源字段) 发起文件创建操作的进程完整路径。在本例中,将显示为C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。如果此处显示为cmd.exe、wscript.exe或未知的临时目录下的可执行文件,则极具可疑性。TargetFilename:被创建或修改的文件的完整绝对路径(本例中为C:\Temp\malicious_script.bat)。CreationUtcTime:文件在文件系统层面的实际创建时间。
# 9.3 分析价值
通过结合 Image 和 TargetFilename ,安全分析师可以迅速判断:
- 谁(哪个进程)创建了文件。
- 创建了什麼(文件路径和类型)。
- 是否异常(例如:
svchost.exe通常不会创建.bat文件,如果发现此类行为,极大概率是进程伪装或恶意注入)。
# 10_Sysmon and PowerShell
# 10.1 基础查询与路径要求
使用 PowerShell 读取 Sysmon 日志时,必须指定完整的日志通道名称,不能使用简写。
- 完整路径:
Microsoft-Windows-Sysmon/Operational
# 10.2 构建健壮的自定义查询函数
为了简化查询并提升执行效率,可以编写一个自定义 PowerShell 函数。该函数利用哈希表(FilterHashtable) 在底层进行过滤(速度远快于管道 + Where-Object ),并通过 if 语句动态构建过滤条件,以增强脚本的健壮性和灵活性。
函数代码示例 ( SysmonTools.psm1 ):
function Get-SysmonEvent { | |
param ( | |
[int]$EventId, | |
[datetime]$Start, | |
[datetime]$End | |
) | |
# 初始化哈希表,必须包含 LogName | |
$filters = @{ LogName = "Microsoft-Windows-Sysmon/Operational" } | |
# 动态检查参数是否为空,不为空则加入过滤条件,提升健壮性 | |
if ($EventId) { $filters.Add("Id", $EventId) } | |
if ($Start) { $filters.Add("StartTime", $Start) } | |
if ($End) { $filters.Add("EndTime", $End) } | |
# 执行查询,使用 -ErrorAction SilentlyContinue 避免无结果时报错 | |
Get-WinEvent -FilterHashtable $filters -ErrorAction SilentlyContinue | |
} |
# 10.3 模块管理
将上述函数保存为 .psm1 文件(如 SysmonTools.psm1 )后,可作为模块进行管理:
# 1. 导入模块 | |
Import-Module .\SysmonTools.psm1 | |
# 2. 验证模块是否成功加载 | |
Get-Module -Name SysmonTools | |
# 3. 若修改了函数代码,可先移除再重新导入以生效 | |
Remove-Module -Name SysmonTools | |
Import-Module .\SysmonTools.psm1 |
# 10.4 实战应用场景
场景 A:灵活调用与夜间异常文件创建检测
调用函数时,若不需要某个条件,可传入 $null 或直接省略该参数。
# 查询夜间 (22:00 - 06:00) 的 Event ID 11 (文件创建),并结合 Where-Object 进一步筛选 .bat 文件 | |
Get-SysmonEvent -EventId 11 -Start "2023-10-25 22:00:00" -End "2023-10-26 06:00:00" | | |
Where-Object { $_.Properties[1].Value -match '\.bat$' } | # Properties [1] 通常为 TargetFilename | |
Select-Object TimeCreated, @{Name='File';Expression={$_.Properties[1].Value}}, @{Name='Process';Expression={$_.Properties[4].Value}} |
场景 B:事件链追踪 (Event Chaining)
在应急响应中,常需要通过一个已知的可疑进程 ID (PID),反向追踪它是如何被创建的。
# 假设已知可疑 PID 为 4512,查询其进程创建事件 (Event ID 1) | |
# Sysmon Event ID 1 的 Properties 数组中,索引 3 通常对应 ProcessId | |
Get-SysmonEvent -EventId 1 -End (Get-Date) | | |
Where-Object { $_.Properties[3].Value -eq 4512 } | | |
Format-List TimeCreated, | |
@{Name='ProcessId';Expression={$_.Properties[3].Value}}, | |
@{Name='ParentProcessId';Expression={$_.Properties[7].Value}}, | |
@{Name='Image';Expression={$_.Properties[4].Value}}, | |
@{Name='CommandLine';Expression={$_.Properties[9].Value}} |
# 10.5 分析价值
通过自定义函数结合 FilterHashtable ,不仅能将查询速度提升数倍,还能通过管道灵活串联 Where-Object 和 Format-List 。这种 “参数化查询 + 属性索引提取” 的模式,是安全分析师在海量 Sysmon 日志中进行单点突破、顺藤摸瓜(事件链追踪)的标准高效工作流。
# 11_Remote Access with PowerShell Core
# 11.1 基础概念与优势
PowerShell Core ( pwsh ,即 PowerShell 7+) 是跨平台的 PowerShell 版本,可在 Linux (如 Kali) 和 macOS 上运行。通过 PowerShell Remoting (PSRemoting),攻击者或管理员可以从非 Windows 机器直接建立与 Windows 目标的交互式会话。
核心优势(速度与效率):
- 无文件落地 (Fileless):命令直接在目标主机的内存中执行,无需上传
.exe或脚本文件,大幅降低被防病毒软件 (AV) 或 EDR 检测的概率。 - 低带宽消耗:仅在网络中传输命令文本和执行结果,不传输完整的 Payload。
- 交互式操作:提供类似本地 CMD/PowerShell 的实时交互体验,便于快速侦察和横向移动。
# 11.2 建立远程会话 (Enter-PSSession)
在 Kali Linux 中启动 pwsh 后,可使用 Enter-PSSession 建立交互式远程连接。
(注:已修正原笔记中命令断行的语法问题)
kali@kali:~$ pwsh | |
PowerShell 7.2.1 | |
Copyright (c) Microsoft Corporation. | |
https://aka.ms/powershell | |
Type 'help' to get help. | |
PS /home/kali> Enter-PSSession -ComputerName 192.168.50.10 -Credential offsec -Authentication Negotiate | |
[192.168.50.10]: PS C:\Users\offsec\Documents> |
提示:输入命令后,系统会弹出凭据提示框或在命令行提示输入密码。连接成功后,命令提示符会变为 [目标IP]: PS ...> ,表示当前输入的命令将在远程主机上执行。退出会话使用 Exit-PSSession 。
# 11.3 认证模式 (Authentication Mechanisms)
-Authentication 参数决定了客户端如何向目标主机证明身份。选择合适的模式对连接成功率和安全性至关重要:
| 认证模式 | 说明 | 适用场景与风险 |
|---|---|---|
| Negotiate (默认) | 首选 Kerberos,若失败则回退到 NTLM。 | 最常用。适用于域环境,或已知本地管理员凭据时(需提供目标 IP / 主机名)。 |
| Basic | 使用 Base64 编码传输凭据(本质为明文)。 | 极不安全。仅在测试环境使用,且必须配合 HTTPS (WinRM over SSL, 端口 5986) 使用,否则凭据会被网络嗅探。 |
| CredSSP | 凭据安全支持提供程序。允许将客户端的凭据委派给目标主机。 | 用于解决 Double-Hop (双跳) 问题(例如:A -> B -> C,B 需要 A 的凭据去访问 C)。风险:目标主机会在内存中缓存明文凭据,易受 Mimikatz 等工具提取。 |
| NegotiateWithImplicitCredential | 使用当前登录用户的上下文进行 Negotiate 认证,无需显式提供 -Credential 。 | 适用于已加入域且当前用户拥有目标机器权限的机器。 |
# 11.4 前置条件与排错
要成功建立 PSRemoting 连接,目标 Windows 主机必须满足以下条件:
- 启用 WinRM 服务:目标机器需以管理员身份运行过
Enable-PSRemoting -Force。 - 防火墙放行:
- HTTP (非加密):默认端口 5985 (Workgroup / 域环境常用)。
- HTTPS (加密):默认端口 5986 (需提前配置 WinRM SSL 监听器)。
- TrustedHosts (受信任主机):如果客户端和目标不在同一域,且使用 IP 地址或主机名连接,可能需要在客户端配置
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.50.10"以绕过严格的主机名验证。