# Windows Endpoint Introduction(Windows 端点基础)

# 01. Command Prompt (CMD & Batch)

# 1.1 基础概念

CMD(命令提示符)是 Windows 默认的命令行解释器。Batch( .bat.cmd )是 CMD 的批处理脚本语言,用于自动化执行一系列命令。

# 1.2 代码示例:系统信息收集

以下脚本用于收集 Windows 操作系统的基础信息。
(注:已修复原笔记中 systeminfofindstr 之间缺失管道符 | 的语法错误)

@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 具有极高的 “武器化” 价值:

  1. 社会工程学 / 钓鱼攻击:常被伪装成 .vbs 附件,诱导用户双击执行(诱导执行)。
  2. Office 宏病毒植入:VBA (Visual Basic for Applications) 与 VBScript 语法高度相似,攻击者常在 Word/Excel 宏中植入恶意 VBS 代码,实现初始访问。
  3. 无文件攻击 / 下载器 (Downloader):利用 VBScript 的 MSXML2.XMLHTTPWinHttp.WinHttpRequest 对象从 C2 服务器下载第二阶段 Payload 并执行,且无需在磁盘留下明显的可执行文件(.exe)。
  4. 绕过检测:由于 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 等。

# 05_Introduction to Windows Events

# 5.1 核心日志分类 (Channels)

在 “Windows 日志” 下,主要分为 5 个不同的分类:

  1. Application(应用程序):记录应用程序级别的事件(如软件报错、数据库日志)。
  2. Security(安全)最重要。记录审计事件,如登录 / 注销、对象访问、权限更改、策略修改。
  3. Setup(安装):记录系统安装、更新(Windows Update)相关的事件。
  4. System(系统):记录 Windows 系统组件和驱动程序的事件(如服务启动失败、驱动加载)。
  5. Forwarded Events(转发的事件):用于 Windows 事件转发(WEF),集中收集来自域内其他主机的日志。

# 5.2 事件级别 (Level)

事件按严重程度分类,具体的审计规则可在本地安全策略或域组策略(GPO)中配置:

  • Information(信息):常规操作成功记录。
  • Warning(警告):非致命问题,可能预示未来故障。
  • Error(错误):功能失效或数据丢失。
  • Critical(严重):导致系统崩溃或核心功能失效的致命错误。
  • Audit Success / Audit Failure(审计成功 / 失败):安全日志专属,记录策略审计的结果(安全分析中 Audit Failure 极其关键)。

# 5.3 事件结构 (XML 视图)

在事件查看器中切换到 “XML 视图”,可以看到事件的底层结构,主要分为两部分:

  1. <System> (系统元数据)
    • Provider Name :生成事件的组件(如 Microsoft-Windows-Security-Auditing )。
    • EventID :事件唯一标识符(如 4624 )。
    • Level :事件级别。
    • TimeCreated :事件发生的精确时间。
  2. <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)
通过结合 LogonTypeIpAddress 快速判断行为合理性:

  • 异常 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 事件日志。

  • 权限要求ApplicationSetupSystem 日志普通用户即可读取,但 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) — 推荐方式

-FilterHashtableGet-WinEvent 最强大的筛选参数,它在日志提供程序层面直接过滤,性能远优于管道 + Where-Object

Hashtable 语法: @{ Key1='Value1'; Key2='Value2' }

常用筛选键:

键名说明示例
LogName日志通道'Security'
Id事件 ID4624
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 远程登录系统。

思路

  1. FilterHashtable 高效筛选夜间时间段的 4624 登录事件。
  2. Where-Object 进一步过滤 LogonType10 (RDP 远程交互登录)的记录。
  3. 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)

仅依赖本地日志是不够的,企业级安全监控必须实现日志的集中化:

  1. Windows Event Forwarding (WEF):利用组策略 (GPO) 将端点的特定事件自动转发到集中的 Windows Event Collector (WEC) 服务器。即使端点被攻陷,日志已提前发送,攻击者无法抹除痕迹。
  2. 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.exeSysmon64.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.exewscript.exe 或未知的临时目录下的可执行文件,则极具可疑性。
  • TargetFilename :被创建或修改的文件的完整绝对路径(本例中为 C:\Temp\malicious_script.bat )。
  • CreationUtcTime :文件在文件系统层面的实际创建时间。

# 9.3 分析价值

通过结合 ImageTargetFilename ,安全分析师可以迅速判断:

  1. (哪个进程)创建了文件。
  2. 创建了什麼(文件路径和类型)。
  3. 是否异常(例如: 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-ObjectFormat-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 主机必须满足以下条件:

  1. 启用 WinRM 服务:目标机器需以管理员身份运行过 Enable-PSRemoting -Force
  2. 防火墙放行
    • HTTP (非加密):默认端口 5985 (Workgroup / 域环境常用)。
    • HTTPS (加密):默认端口 5986 (需提前配置 WinRM SSL 监听器)。
  3. TrustedHosts (受信任主机):如果客户端和目标不在同一域,且使用 IP 地址或主机名连接,可能需要在客户端配置 Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.50.10" 以绕过严格的主机名验证。