首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >常规安全检查阶段 | Windows 应急响应

常规安全检查阶段 | Windows 应急响应

作者头像
意大利的猫
发布2024-02-05 17:18:19
发布2024-02-05 17:18:19
4.4K0
举报
文章被收录于专栏:漫流砂漫流砂

常规安全检查

案例操作系统为 Windows Server 2016 root 账户来模拟普通用户账户 Administrator 为管理员账户 admin$ 账户来模拟隐藏普通账户 Windows 命令行常规情况下是不区分大小写的,因此大小写都可以

0x00 杀毒软件

如果应急响应过程中允许,使用杀毒程序进行全盘杀毒肯定非常有帮助的,目前很多企业都有自己的终端管控程序,其中部分自带病毒库和杀毒功能,如果允许可以考虑异构排查

0x01 防火墙配置

1. 防火墙开关

查看防火墙当前状态

win+r 中输入:

代码语言:javascript
复制
firewall.cpl			# 快速打开Windows Defender 防火墙设置页面

进行查看当前防火墙状态

2. 防火墙允许的应用

允许应用或功能通过 Windows 防火墙

【 Windows Server 2016 】 默认情况

名称

专用

公用

“播放到设备”功能

1

1

AllJoyn 路由器

1

0

Cortana (小娜)

1

1

DiagTrack

1

1

DIAL 协议服务器

1

0

mDNS

1

1

SmartScreen 筛选器

1

1

Windows Shell Experience

1

1

Windows 默认锁屏界面

1

1

Windows 远程管理

1

1

Xbox Game UI

1

1

电子邮件和帐户

1

1

工作或学校帐户

1

1

核心网络

1

1

你的帐户

1

1

网络发现

1

0

网络发现与系统最初设置有关

3. 防火墙出入站策略

win + r 中输入

代码语言:javascript
复制
gpedit.msc

【 Windows Server 2016 】 默认情况

0x02 账号信息

1. 查看用户

cmd中输入

代码语言:javascript
复制
net user

此时,会显示出相关的系统账号:

此命令无法看到隐藏账号的情况,例如 admin$

2. 查看用户组

cmd中输入

代码语言:javascript
复制
net localgroup					# 查看所有组
net localgroup Users		# 查看指定组

此时,会显示出所有的用户组:

【 Windows Server 2016 】 默认情况

代码语言:javascript
复制
-------------------------------------------------------------------------------
*Access Control Assistance Operators
*Administrators
*Backup Operators
*Certificate Service DCOM Access
*Cryptographic Operators
*Distributed COM Users
*Event Log Readers
*Guests
*Hyper-V Administrators
*IIS_IUSRS
*Network Configuration Operators
*Performance Log Users
*Performance Monitor Users
*Power Users
*Print Operators
*RDS Endpoint Servers
*RDS Management Servers
*RDS Remote Access Servers
*Remote Desktop Users
*Remote Management Users
*Replicator
*Storage Replica Administrators
*System Managed Accounts Group
*Users
命令成功完成。
3. 查找隐藏账户
1) lusrmgr.msc 查看隐藏用户

lusrmgr.msc 为打开本地用户和组

win + r / cmd 中输入

代码语言:javascript
复制
lusrmgr.msc

lusrmgr能够看到常规的隐藏账户情况,即net user admin$ 123456 /add 这类方式添加的隐藏账号

右键用户查看属性即可看到相关用户信息

【 Windows Server 2016 】 默认情况

其他组均为空

2) 注册表查看隐藏账户

regedit为打开注册表编辑器快捷指令

win + r 中输入

代码语言:javascript
复制
regedit

不同版本的操作系统位置不同

Windows 2016

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names SAM 目录需要赋予权限,应急结束时记得取消权限

也可以通过命令行命令查询注册表

代码语言:javascript
复制
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\ProfileList\ /s
reg query HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names

也可以过滤一下

代码语言:javascript
复制
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\ProfileList\ /s  | For /F "tokens=3" %i in ('findstr ProfileImagePath') do @echo %i

Tips:

  1. Windows reg query 遇到空格的处理方法多少有些奇怪,整体用双引号引上不行,反斜线也不太行,得用双引号把空格引上
  2. 如果一个用户只是被创建了而没有登录,在注册表中可能是看不到这一项的,因此做实验的朋友们记得登录一次

【Windows Server 2016 】 默认情况

3) wmic查询用户

可以通过wmic命令进行查询用户,并且该命令可以直接查询到用户的详细数据,包括隐藏账户

代码语言:javascript
复制
wmic useraccount get /value								# 查询用户的详细数据
wmic useraccount get Name,Status,sid			# 查询目前有哪些用户,以及是否启用,Status标志位为:OK/Degraded,OK为启用状态

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
AccountType=512
Caption=WIN-UBB04JA2U5V\Administrator
Description=管理计算机(域)的内置帐户
Disabled=FALSE
Domain=WIN-UBB04JA2U5V
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Administrator
PasswordChangeable=TRUE
PasswordExpires=TRUE
PasswordRequired=TRUE
SID=S-1-5-21-3421588695-3868107595-1594673911-500
SIDType=1
Status=OK


AccountType=512
Caption=WIN-UBB04JA2U5V\DefaultAccount
Description=系统管理的用户帐户。
Disabled=TRUE
Domain=WIN-UBB04JA2U5V
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=DefaultAccount
PasswordChangeable=TRUE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-3421588695-3868107595-1594673911-503
SIDType=1
Status=Degraded


AccountType=512
Caption=WIN-UBB04JA2U5V\Guest
Description=供来宾访问计算机或访问域的内置帐户
Disabled=TRUE
Domain=WIN-UBB04JA2U5V
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Guest
PasswordChangeable=FALSE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-3421588695-3868107595-1594673911-501
SIDType=1
Status=Degraded


AccountType=512
Caption=WIN-UBB04JA2U5V\root
Description=
Disabled=FALSE
Domain=WIN-UBB04JA2U5V
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=root
PasswordChangeable=TRUE
PasswordExpires=TRUE
PasswordRequired=TRUE
SID=S-1-5-21-3421588695-3868107595-1594673911-1001
SIDType=1
Status=OK

4) Powershell 查找隐藏账户

直接打开 powershell 窗口或在 cmd 窗口中输入 powershell 进入 powershell 命令行

代码语言:javascript
复制
Get-WmiObject -Class Win32_UserAccount
Get-WmiObject -Class Win32_UserAccount | Select-Object Name, SID

【 Windows Server 2016 】 默认情况

5) 安全软件排查

D 盾是一个有效的工具

https://www.d99net.net/

4. 删除隐藏账户

常规删除账户可以通过命令行或者图形化删除,但是对于一些隐藏账户会删除失败,可以通过D盾工具或直接去注册表删除

admin$ 克隆 Administrator 账户的 F 值为例,D盾检测出来后,右键删除其实是删除了

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\admin$

这个注册表项,但是对于下面的注册表并没有删除

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA

这种删除有效,但严格来说不够完整,可以去注册表删除用户对应的注册表

删除注册表失败可能是权限不够,修改权限或者通过 psexecSYSTEM 权限打开注册表编辑器就可以了,一定要确定好删除的是恶意账号,别删除错了

0x03 登录信息

1. 命令行查询本地/远端会话
代码语言:javascript
复制
query user				# 当前系统的 user 登录情况
query session			# 当前系统的用户会话情况
Get-SmbSession    # 当前系统的 SMB 信息

该命令为查看当前系统的会话,查看是否有人使用远程终端登录服务器,所以同样可以看到账号异常

2. 任务管理器

任务管理器默认看不到 SMB 连接会话

0x04 启动项

启动项排查主要有以下方法和内容,包含了常规的检查办法,还有基本的启动项目录,都需要检查一遍,同时注册表是作为启动项检查方式之一,存在固定的注册表位置和语句,以下也有列举。

1. msconfig

msconfig为打开系统配置程序,内含开机自启项目

win + r 输入

代码语言:javascript
复制
msconfig

**不是很建议使用这个程序来查看开机自启,只能作为查缺补漏项 **

可以查看到常规系统启动项,并且可以右键查看相应的启动项文件位置,也可以通过右键属性查看相应信息,但是此方法无法看到组策略自启动脚本,实测注册表自启动项也看不到

【 Windows Server 2016 】 默认情况

2. 全局登录自启动目录

win + r 输入

代码语言:javascript
复制
shell:Common Startup

一般具体路径如下:

代码语言:javascript
复制
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

该目录下存在的程序会在用户登录时,以登录用户的权限自动执行程序

【 Windows Server 2016 】 默认情况

3. 用户登录自启动目录

具体路径如下:

代码语言:javascript
复制
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\root\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

// 对于新创建的用户,设置其家目录时会从下面这个目录拷贝文件,完成家目录的创建,本身并不会自动执行
C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

本目录下存放着用户登录自启的程序及相关文件等,同时在本目录下的启动文件

【 Windows Server 2016 】 默认情况

4. 注册表查看启动项

以下为注册表中启动项相关的所有位置,建议都排查一遍:

代码语言:javascript
复制
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce [此条默认不存在,创建可用]
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx [此条默认不存在,创建可用]
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnceEx  [此条默认不存在,创建可用]

// 下面两个其他文章中可能没写过,甚至官方的 autoruns 也发现不了
// 其中 {SID} 替换成用户的 SID 值
HKEY_USERS\{SID}\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_USERS\{SID}\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon [自动登录相关的注册表项]

// 用于设置启动文件夹项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

// 用于设置服务自动启动 (默认并不存在)
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices

// 通过策略设置启动项
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

// 利用身份验证包自启动和SSP
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ 的 Authentication Packages 和 Security Packages 的值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\OSConfig

// 事件提供程序
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W32Time\TimeProviders\

// Winlogon 帮助程序,主要是用户登录时执行的程序,需要检查注册表下的子注册表当前的键值对
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell

// 端口监视器
HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors

// 打印处理器
HKLM\SYSTEM\[CurrentControlSet or ControlSet001]\Control\Print\Environments\[Windows architecture: e.g., Windows x64]\Print Processors\[user defined]\Driver

// Avtive Setup
HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\StubPath

// 登录脚本
HKCU\Environment\UserInitMprLogonScript

// 以下注册表可能不存在,如果存在也需要关注
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\load
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run

这里需要注意:上面包含 {SID} 的两条每个用户只能查看自己的内容,无法查看其他用户的,即使你是管理员,所以如果你发现恶意程序是以某个用户起的,一定查查该用户对应的注册表项

利用 reg query& 进行命令拼接进行查询,如下(建议使用 & 而不是 &&):

代码语言:javascript
复制
reg query HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run & reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run & reg query HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce & reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce

我给大家准备了 powershell 查询脚本,可以将要查询的内容填写进去,下面代码里只填写了几条作为案例

代码语言:javascript
复制
$registryPaths = @(
    "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
    "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
    "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
    "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
    "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx",
    "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run",
    "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce",
    "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnceEx"
)

foreach ($path in $registryPaths) {
    $hive = $path.Substring(0, $path.IndexOf("\"))

    switch ($hive) {
        "HKEY_LOCAL_MACHINE" { $root = "HKLM:" }
        "HKEY_CURRENT_USER" { $root = "HKCU:" }
        "HKEY_CLASSES_ROOT" { $root = "HKCR:" }
        "HKEY_USERS" { $root = "HKU:" }
        "HKEY_CURRENT_CONFIG" { $root = "HKCC:" }
        default {
            Write-Host "Invalid registry hive: $hive"
            continue
        }
    }

    $subKey = $path.Substring($path.IndexOf("\") + 1)

    if (Test-Path "$root\$subKey") {
        Write-Host "Registry Path: $path"
        Write-Host "---------------------------"

        $keys = Get-ItemProperty -Path "$root\$subKey"
        if ($keys) {
            foreach ($key in $keys.PSObject.Properties) {
                if ($excludedProperties -notcontains $key.Name) {
                    Write-Host "Key   : $($key.Name)"
                    Write-Host "Value : $($key.Value)"
                    Write-Host
                }
            }
        } else {
            Write-Host "No keys found."
        }
    } else {
        Write-Host "Registry Path: $path - Not Found"
        Write-Host
    }

    Write-Host
}

Windows 系统级注册表文件存储位置如下

  • 注册表文件(系统级):
    • %SystemRoot%\System32\Config 目录下的以下文件:DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM
    • %SystemRoot%\System32\Config\RegBack 目录下的备份文件(备份文件的扩展名为 .bak
  • 注册表文件(用户级):
    • 默认配置文件:%SystemRoot%\System32\Config\Default
    • 默认用户配置文件:%SystemRoot%\System32\Config\DefaultUser
    • 用户配置文件:每个用户在其用户文件夹中的 NTUSER.DAT 文件

当然不建议直接修改该文件,当然了,默认情况也不让直接修改

【 Windows Server 2016 】 默认情况

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    AutoRestartShell    REG_DWORD    0x1
    Background    REG_SZ    0 0 0
    CachedLogonsCount    REG_SZ    10
    DebugServerCommand    REG_SZ    no
    DisableBackButton    REG_DWORD    0x1
    EnableSIHostIntegration    REG_DWORD    0x1
    ForceUnlockLogon    REG_DWORD    0x0
    LegalNoticeCaption    REG_SZ
    LegalNoticeText    REG_SZ
    PasswordExpiryWarning    REG_DWORD    0x5
    PowerdownAfterShutdown    REG_SZ    0
    PreCreateKnownFolders    REG_SZ    {A520A1A4-1780-4FF6-BD18-167343C5AF16}
    ReportBootOk    REG_SZ    1
    Shell    REG_SZ    explorer.exe
    ShellCritical    REG_DWORD    0x0
    ShellInfrastructure    REG_SZ    sihost.exe
    SiHostCritical    REG_DWORD    0x0
    SiHostReadyTimeOut    REG_DWORD    0x0
    SiHostRestartCountLimit    REG_DWORD    0x0
    SiHostRestartTimeGap    REG_DWORD    0x0
    Userinit    REG_SZ    C:\Windows\system32\userinit.exe,
    VMApplet    REG_SZ    SystemPropertiesPerformance.exe /pagefile
    WinStationsDisabled    REG_SZ    0
    scremoveoption    REG_SZ    0
    DisableCAD    REG_DWORD    0x1
    LastLogOffEndTimePerfCounter    REG_QWORD    0x29d2fe81
    ShutdownFlags    REG_DWORD    0x8000022b

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GPExtensions
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoLogonChecked
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\VolatileUserMgrKey



C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\AlternateShells

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells
    DefaultShell    REG_SZ    explorer.exe

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells

C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AlternateShells\AvailableShells
    30000    REG_SZ    cmd.exe /c "cd /d "%USERPROFILE%" & start cmd.exe /k runonce.exe /AlternateShellStartup"
    60000    REG_SZ    explorer.exe

代码语言:javascript
复制
C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\AutoLogonChecked


C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\VolatileUserMgrKey

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\VolatileUserMgrKey\1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\VolatileUserMgrKey\2

C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\VolatileUserMgrKey\1

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\VolatileUserMgrKey\1\S-1-5-21-1129105344-1658940625-3319276557-500

C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\VolatileUserMgrKey\1\S-1-5-21-1129105344-1658940625-3319276557-500


C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\VolatileUserMgrKey\2

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\VolatileUserMgrKey\2\S-1-5-21-1129105344-1658940625-3319276557-500

C:\Users\Administrator>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Winlogon\VolatileUserMgrKey\2\S-1-5-21-1129105344-1658940625-3319276557-500

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\VolatileUserMgrKey\2\S-1-5-21-1129105344-1658940625-3319276557-500
    contextLuid    REG_QWORD    0x6c96c


C:\Users\Administrator>
5. 组策略启动脚本

gpedit.msc为打开本地组策略编辑器

win+r中输入:

代码语言:javascript
复制
gpedit.msc

打开本地组策略中心

计算机配置 => Windows设置 => 脚本(启动/关机) 用户配置 => Windows设置 => 脚本(登录/注销)

此处可以添加开机启动的程序、批处理文件和powershell脚本,开机时就会根据脚本自动运行添加到程序或任务

此处的任务是不会显示在启动或msconfig里的

以下目录对应的相应的脚本存放目录

代码语言:javascript
复制
//计算机设置处
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown

//用户配置处
C:\Windows\System32\GroupPolicy\User\Scripts\Logon

组策略中心启动/关机的程序或脚本位置并不是固定的,可以随意指定,也就是说最终执行以组策略配置处为准。即使上面的目录中存在程序或脚本,但是在组策略配置处没有添加,也不会执行

【 Windows Server 2016 】 默认情况

6. 安全工具检查

Autoruns 是由 Sysinternals(微软的一部分)提供的免费工具,它可以显示 Windows 启动时加载的所有程序、服务、驱动程序和其他自启动项。您可以从 Microsoft 官网下载并使用它。

https://learn.microsoft.com/zh-cn/sysinternals/downloads/autoruns

除了上面介绍的部分以外, Autoruns 还支持很多启动项排查

我的系统使用了 PD 虚拟机,同时安装了虚拟机工具,所以会有很多大家实际环境没有的

【 Windows Server 2016 】默认情况

上面是总的,可能比对不够清晰,下面为分项

【 Logon 】

【 Explorer 】

【 Scheduled Tasks 】

【 Service 】

【 Drivers 】

【 Image Hijacks 】

【 Known DLLs 】

0x05 计划任务

定时任务经常是病毒、后门、权限维持等恶意行为的常见操作对象,通过添加新的定时任务,启动恶意脚本、powershell或者其他命令行语句来达到权限维持或者扩散的目的

排查计划任务开始前,需要先开启计划任务记录,以防相关任务未记录导致无法排查

此处计划任务建议主要以 注册表 排查为主,清晰明了,同时展示内容也相对省去了很多不必要的内容。

1. taskschd.msc 任务计划程序

taskschd.msc为打开任务计划程序

win + r 中输入

代码语言:javascript
复制
taskschd.msc

可以看到近期活动的计划任务

该处需要注意的是,右侧的两个选项卡

  • 显示所有正在运行的任务
  • 开启/禁用所有任务历史记录 如右侧显示开启所有任务历史记录,请点击开启,该选项会开启定时任务运行历史记录,有助于排查 点击显示所有正在运行的任务选项卡,可以显示当前正在运行的定时任务

计划任务中,任务详情需点击相关的计划任务,下面会显示该计划任务属性详情

需要着重注意以下选项卡:触发器、操作和历史记录

其中都会存储定时任务相关的信息,可以帮助排查

以下为病毒创建的计划任务,属性->操作 里可以看到该计划任务所执行的具体操作

点击左侧 任务计划程序(本地),显示如下

任务状态可以选择时间,假设选择 24 小时,下面显示的是从现在起,向前数 24 小时,在这时间段启动的任务状态

计划任务状态有以下几种

  • 已准备就绪(Ready):任务已经配置好,并且等待触发执行。
  • 运行中(Running):任务当前正在执行中。
  • 已停止(Stopped):任务已经停止,不再执行。
  • 禁用(Disabled):任务已被禁用,不会触发执行。

活动任务指的是当前正在运行的计划任务。这些任务是已经被触发并且正在执行中的任务。活动任务可能包括自动触发的任务和手动触发的任务,任务未过期

2. schtasks 查看定时任务列表

在Windows中通常用atschtasks命令添加计划任务,其中at命令默认是以System权限执行,但是从 Win8开始不再支持 at 命令,所以以下以schtasks命令来进行介绍

cmd中输入:

代码语言:javascript
复制
schtasks /?

即可看到计划任务命令相关用法

代码语言:javascript
复制
schtasks /query		//查看当前所有计划任务列表
代码语言:javascript
复制
schtasks /query /fo LIST /v

可以列出计划任务的信息,但是默认也会非常长,建议输出到文件中查看

schtasksquery 指令有三种输出格式, TABLE、LIST、CSV,如果希望以表格的形式查看,也可以尝试

代码语言:javascript
复制
schtasks /query /fo TABLE /v
schtasks /query /fo CSV /v

经过测试,table 的效果不是很好,可以导出到文件中进行查看。CSV 格式还是不错的,可以导出成 CSV 文件

如果不希望每一大项都有一份标题,可以考虑保留一份标题,之后输出纯内容,当然,也可以直接在 excel 中去重等方式完成

代码语言:javascript
复制
schtasks /query /fo CSV /v > 1.csv
# 去掉内容,仅保留第一行
schtasks /query /fo CSV /v /NH >> 1.csv

如果想查看某一项的内容,可以使用路径+名称的方式

代码语言:javascript
复制
位置+名称则为 
\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser

如果想查找指定的计划任务,需要使用 /TN 参数,schtasks 命令对于空格处理允许整体使用双引号,也允许仅仅把空格用双引号引上

代码语言:javascript
复制
schtasks /query /fo LIST /v /TN \Microsoft\Windows\Application" "Experience\Microsoft" "Compatibility" "Appraiser

# 也可以使用双引号将整体引住
schtasks /query /fo LIST /v /TN "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"

虽然我们只查询了这一条计划任务,但这里显示的结果不止一条,而是 3 条,这个条数是根据该条计划任务触发器的数量来决定的

触发器这里是三条,查询出来的内容就是三条

schtasks 是可以看到 Windows Api 创建的计划任务的

3. 注册表查看计划任务

我们将注册表部分分为两类

  • 计划任务服务本身的注册表
  • 计划任务实际任务的注册表

就像是房屋售卖机构,一个是房屋售卖机构的位置,也就是售楼处;一个是售卖的房屋的位置

1) 计划任务本身的注册表
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule
  • AtTaskMaxHours:指定计划任务执行的最大小时数。
  • DependOnService:指定计划任务服务所依赖的其他服务。该项列出了计划任务服务所需依赖的其他服务的名称。
    • 注意 REG_MULTI_SZ 是多字符串值,也就是说表示多个字符串,字符串不能包含空格
  • Description:计划任务服务的描述信息,用于提供关于该服务功能的说明。
  • DisplayName:计划任务服务的显示名称,用于在服务列表和管理工具中显示。
  • ErrorControl:指定计划任务服务启动时的错误处理行为。常见取值为:
    • 0x00000000(忽略):忽略启动错误,继续启动服务。
    • 0x00000001(正常):如果启动错误,则系统会尝试重新启动服务。
    • 0x00000002(严重):如果启动错误,则系统会将其视为严重错误。
  • FailureActions:指定计划任务服务失败时采取的操作。该项包含了一系列定义了服务失败时的行为的设置,例如重启计算机、重新启动服务等。
  • Group:计划任务服务所属的服务组的名称。
  • ImagePath:计划任务服务的可执行文件路径。该项指定了计划任务服务可执行文件的位置和名称。
  • ObjectName:指定计划任务服务运行的用户或身份。该项定义了服务的安全上下文。
  • RequiredPrivileges:指定计划任务服务所需的特权。该项列出了计划任务服务所需的特权名称。
  • ServiceSidType:指定计划任务服务的服务安全标识符(SID)类型。常见取值包括:
    • 0x00000001(None):未指定服务的SID类型。
    • 0x00000002(Unrestricted):服务的SID具有无限制权限。
    • 0x00000003(Restricted):服务的SID具有受限权限。
  • Start:指定计划任务服务的启动类型。常见取值为:
    • 0x00000002(自动启动):计划任务服务在系统启动时自动启动。
    • 0x00000003(手动启动):计划任务服务需要手动启动。
    • 0x00000004(禁用):计划任务服务被禁用,无法启动。
  • Type:指定计划任务服务的类型。常见取值为:
    • 0x00000110:计划任务服务是一个内核驱动程序服务。
    • 0x00000120:计划任务服务是一个文件系统驱动程序服务。

这个注册表中包含两项

  • Parameters
  • Security
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Parameters
  • ServiceDll:该值指定计划任务服务的动态链接库 (DLL) 文件路径和名称。这个 DLL 包含了计划任务服务的实现代码。
  • ServiceDllUnloadOnStop:该值指示当计划任务服务停止时是否卸载 ServiceDll 指定的 DLL。如果该值为 1,则服务停止时会卸载 DLL;如果该值为 0,则 DLL 不会在服务停止时卸载。
  • ServiceMain:该值是一个字符串,指定计划任务服务的入口点函数。这个函数在计划任务服务启动时被调用,并负责初始化服务。
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Security
  • Security 这个项存储了计划任务服务的安全设置,包括访问权限和安全描述符。

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule
    AtTaskMaxHours    REG_DWORD    0x48
    DisplayName    REG_SZ    @%SystemRoot%\system32\schedsvc.dll,-100
    ErrorControl    REG_DWORD    0x1
    Group    REG_SZ    SchedulerGroup
    ImagePath    REG_EXPAND_SZ    %systemroot%\system32\svchost.exe -k netsvcs
    Start    REG_DWORD    0x2
    Type    REG_DWORD    0x20
    Description    REG_SZ    @%SystemRoot%\system32\schedsvc.dll,-101
    DependOnService    REG_MULTI_SZ    RPCSS\0SystemEventsBroker
    ObjectName    REG_SZ    LocalSystem
    ServiceSidType    REG_DWORD    0x1
    RequiredPrivileges    REG_MULTI_SZ    SeIncreaseQuotaPrivilege\0SeChangeNotifyPrivilege\0SeAuditPrivilege\0SeImpersonatePrivilege\0SeAssignPrimaryTokenPrivilege\0SeTcbPrivilege\0SeRestorePrivilege\0SeBackupPrivilege
    FailureActions    REG_BINARY    805101000000000000000000030000001400000004000000000000000100000060EA00000000000000000000

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Parameters
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Security
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Parameters
    ServiceDll    REG_EXPAND_SZ    %systemroot%\system32\schedsvc.dll
    ServiceDllUnloadOnStop    REG_DWORD    0x1
    ServiceMain    REG_SZ    ServiceMain
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Security
    Security    REG_BINARY    01001480900000009C000000140000003000000002001C000100000002801400FF010F000101000000000001000000000200600004000000000014008D00020001010000000000050B00000000001800DD010E000102000000000005200000002002000000001400FF010F00010100000000000512000000000018008D00020001020000000000052000000021020000010100000000000512000000010100000000000512000000
2) 计划任务中任务的注册表
代码语言:javascript
复制
计划任务的 Id、Index、SD 在此位置
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree

计划任务的具体配置在此位置
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{id}

Tree 下为计划任务位置,其中包含计划任务的 Id、Index、SD

  • Id:这个值表示计划任务树中特定任务的唯一标识符。每个计划任务都有一个唯一的 ID,用于标识和区分不同的任务。
  • Index:这个值指示任务在计划任务树中的索引位置。它表示任务在树中的相对位置,可以用来确定任务的顺序或层次关系。
    • 不过实际上测试发现 Index 值很奇怪,以 0x3 为主,括号里面的值就是前面的值的十进制值
  • SD:这个值存储了任务的安全描述符(Security Descriptor)。安全描述符定义了对任务的访问权限和安全设置,包括哪些用户或组有权访问、更改或删除任务。

得到 Id 值后,就可以在下面的注册表中查看具体该计划任务具体配置

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\

可以通过搜索来找到对应的计划任务配置

  • Actions:这个项存储了任务的操作(Actions)。它包含了任务执行时要执行的操作的详细信息,例如要运行的程序或脚本以及相关的参数。
  • Author:这个项表示任务的作者或创建者。它记录了任务创建时的作者信息。
  • Date:这个项表示任务的日期。它记录了任务的创建或修改日期。
  • DynamicInfo:这个项存储了任务的动态信息(Dynamic Information)。它可能包含任务最近执行的状态、结果或其他与任务执行相关的信息。
  • Hash:这个项存储了任务的哈希值(Hash)。哈希值是根据任务的属性和内容计算得出的唯一标识符,用于验证任务的完整性和一致性。
  • Path:这个项表示任务的路径。它记录了任务所在的文件路径或注册表路径。
  • Schema:这个项存储了任务的架构(Schema)。它定义了任务的结构和属性,包括触发器、操作和其他相关信息。
  • Triggers:这个项存储了任务的触发器(Triggers)。它包含了触发任务执行的条件和设置,例如计划时间、事件触发或系统状态变化等。
  • URI:这个项表示任务的统一资源标识符(URI)。它是一个唯一的标识符,用于标识任务的位置或资源。

所以也就是说将该注册表中的内容都看一遍,就可以获取到所有的计划任务

代码语言:javascript
复制
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Schedule\TaskCache\Tasks\
4. 计划任务目录文件

计划任务服务会讲所有设置的计划任务保存一份儿到文件,具体路径为

代码语言:javascript
复制
C:\Windows\System32\Tasks

使用记事本打开相关文件

这里提一点,修改计划任务文件不会影响计划任务的执行,通过计划任务程序修改计划任务的属性或者禁止计划任务再启动后,会将计划任务内容写入到计划任务文件中

删除计划任务文件不耽误计划任务执行,也不耽误计划任务显示

5. 计划任务日志文件

打开日志管理器

代码语言:javascript
复制
eventvwr

应用程序和服务日志 -> Microsoft -> Windows -> TaskScheduler

  • Maintenance 计划任务的维护事件
  • Operational 计划任务的操作和状态事件

默认计划任务不记录操作日志,点击启用所有任务历史记录后,操作日志就会被记录下来了

点击后如下

日志部分主要查看 Operational 日志

可以看到这段时间的详细日志

Windows Server 2016 中计划任务日志相关的事件 id 我并没有在官方材料中找到准确的描述,因此这里通过手动测试

  • 创建计划任务
  • 运行计划任务
  • 新增操作
  • 禁用计划任务
  • 删除计划任务

事件 ID

任务类别

100

计划任务启动

102

任务已完成

106

计划任务注册

110

计划任务由用户触发

129

已创建计划任务

140

任务注册已更新(修改属性)

141

任务注册已删除(直接删除计划任务)

142

任务已禁用

200

操作已启动(这就是实际执行了操作)

201

操作已完成

6. 采用工具排查

Autoruns 是 SysinternalsSuite 套件中一款工具,可以很方便查看包括计划任务等启动项排查

https://learn.microsoft.com/zh-cn/sysinternals/downloads/sysinternals-suite

可以在可疑的计划任务上右键,从计划任务程序打开该计划任务

经过测试发现,如果在 Microsoft 新建文件夹,之后在新建文件夹中创建计划任务, Autoruns 默认无法发现

此时需要取消选中 Hide Microsoft entriesHide Windows entries

这就显示出来了

7. 隐藏计划任务排查

如果上面的方法你都找不到计划任务,可以参考我们的文章 《计划任务的攻防战 | Window 应急响应》

https://mp.weixin.qq.com/s/y9_9P6ggxGMrdGMFT-I34A

0x06 网络连接

1. netstat

cmd中输入:

代码语言:javascript
复制
netstat /?

命令解释如下:

可以通过如下命令,获取当前所有UDP和TCP连接,同时列出所有的进程PID和进程执行程序及对应的服务简称

代码语言:javascript
复制
netstat -a -n -o -b			//-anob同理

连接状态有以下几种

  • LISTENING:表示监听 ,表示这个端口处于开放状态, 可以提供服务
  • ESTABLISHED":表示是对方与你已经连接 正在通信交换数据
  • CLOSING:表示关闭的 表示端口人为或者防火墙使其关闭(也许服务被卸载)
  • TIME WAIT :表示正在等待连接 就是你正在向该端口发送请求连接状态
2. nbtstat

用于显示与 NetBIOS 相关的网络连接和统计信息

代码语言:javascript
复制
nbtstat -c   // 列出远程[计算机]名称及其 IP 地址的 NBT 缓存
3. PowerShell
代码语言:javascript
复制
Get-NetTCPConnection   # 获取 tcp 连接
Get-NetUDPEndpoint		 # 获取 udp 连接
4. Get-NetworkConnection

这是一个开源脚本,通过 powershell 编写,可以获取网络连接的时间戳 https://github.com/IllusiveNetworks-Labs/Get-NetworkConnection

5. System Informer

https://systeminformer.sourceforge.io/ Process Hacker 的升级版

0x07 IPC 共享

代码语言:javascript
复制
net share

【 Windows Server 2016 】默认情况

0x08 进程

1. 任务管理器

任务栏右键选择***任务管理器*** 或者 使用快捷键***Ctrl+Shift+Esc*** 快速打开任务管理器,如下图:

可以对进程右键,进一步查看进程信息

2. tasklist

cmd中输入:

代码语言:javascript
复制
tasklist /?

常用命令解析:

代码语言:javascript
复制
tasklist				//直接列出进程列表

//“/m /v /svc“三个命令不能同时使用
tasklist /m			//进程使用了哪些模块、dll等
tasklist /m user32.dll		//哪些进程使用了该user32.dll
tasklist /svc		//显示每个进程中的服务信息
tasklist /v			//显示详细信息内容,包含会话、内存、用户等信息


tasklist /fi "USERNAME ne NT AUTHORITY\SYSTEM" /fi "STATUS eq running"
//“/fi”后面跟的是查询语句,列出系统中正在运行的非“SYSTEM“状态的所有进程,ne为不等于,eq为等于
常用

/fi 查询关键字
    STATUS          eq, ne                    RUNNING | SUSPENDED
                                              NOT RESPONDING | UNKNOWN
    IMAGENAME       eq, ne                    映像名称
    PID             eq, ne, gt, lt, ge, le    PID 值
    SESSION         eq, ne, gt, lt, ge, le    会话编号
    SESSIONNAME     eq, ne                    会话名称
    CPUTIME         eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                              hh:mm:ss。
                                              hh - 小时,
                                              mm - 分钟,ss - 秒
    MEMUSAGE        eq, ne, gt, lt, ge, le    内存使用(以 KB 为单位)
    USERNAME        eq, ne                    用户名,格式为
                                              [域\]用户
    SERVICES        eq, ne                    服务名称
    WINDOWTITLE     eq, ne                    窗口标题
    模块         eq, ne                    DLL 名称
//运算符
相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)
1) 查询指定用户权限的进程
代码语言:javascript
复制
tasklist /fi "USERNAME eq NT AUTHORITY\SYSTEM"
2) 查询指定用户正在运行中的进程
代码语言:javascript
复制
tasklist /FI "USERNAME eq Administrator" /FI "STATUS eq running" /v
3) 根据pid查询进程
代码语言:javascript
复制
tasklist /FI "PID eq 7768" /V
4) 查询指定进程使用的模块
代码语言:javascript
复制
tasklist /FI "PID eq 7768" /M /V
3. taskkill

taskkill 主要为终止进程操作,需要注意的是使用该命令时,cmd 命令行最好使用管理员权限,常用命令如下:

代码语言:javascript
复制
taskkill /pid 9688
taskkill /f /pid 9688			//强制终止进程pid为9688的进程,/f为强制终止
taskkill /t /pid 9688			//终止pid为9688进程及其子进程,/t为终止指定的进程和由它启用的子进程
4. powershell

poweshell为windows自带的一种更深入系统内部的命令行脚本环境,可以通过相应的命令对进程进行查询及操作。

win+r输入:powershell

cmd中输入:powershell

powershell的命令结构一般是动词+名词

打开powershell环境后,可以通过

代码语言:javascript
复制
get-help *process*	//查找所有process相关命令的帮助,*为通配符

本次只涉及如下命令

  • Get-Process //相当于tasklist命令,直接列出进程
  • Format-list * //组合使用,列出进程的详细信息
  • Stop-Process //暂停进程
1) Get-Process

powershell里输入:

代码语言:javascript
复制
get-help get-process		//获取get-process命令的帮助

常规用法:gps -name “*{进程名}*”

代码语言:javascript
复制
gps -name "*edge*"		//查询列出所有“edge”字样的进程

组合format-list *使用

代码语言:javascript
复制
gps -name "*edge*"|format-list *		//列出名称包含“edge”进程的详细信息,包含内容非常多
gps -pid 8828 |format-list *				//列出pid为8828进程的详细信息
gps -pid 8828 |format-list path			//列出pid为8828进程的程序路径
2) Stop-Process

该命令为停止相关进程,通过get-help stop-process获取帮助

演示:

代码语言:javascript
复制
spps -id 8828					//停止8828进程
spps -name “msedge”		//停止名字为msedge的进程
5. wmic

wmic 为 WMI(Windows Management Instrumentation,Windows管理工具)的扩展 ,提供了从命令行接口和批处理脚本执行系统管理的支持

可以支持快速查询系统进程相关信息,尤其是可以查询进程命令内容,这对于常规挖矿等进程,可以直接看到进程中的远程矿池地址

cmd/powershell中输入:

代码语言:javascript
复制
# 列出进程列表,与tasklist命令相通
wmic process list brief

# 重要:【查看所有运行中进程的命令行参数和程序目录】
wmic process get caption,executablepath,commandline /value

# 精确查找
wmic process where caption="notepad.exe" get caption,commandline /value
# 模糊查找
wmic process where="caption like 'notepad%'" get caption,commandline /value

# 重要:【列出svchost进程的名称、进程命令、启动程序路径】
wmic process where caption="svchost.exe" get caption,commandline,executablepath /value
6. query 查看当前用户启动的进程

cmd中输入:

代码语言:javascript
复制
query process				//查看当前用户所启动的进程
7. tlist.exe官方调试工具

tlist.exe是Microsoft官方提供的windows调试工具包中的工具之一,用于操作进程。

https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/tlist-commands

下载后,放在目录下,使用cmd命令行进行操作:

代码语言:javascript
复制
tlist /?     //获取命令帮助
1) 通过 pid 查询进程信息
代码语言:javascript
复制
tlist 2796			# 直接跟对应进程的pid,会列出该进程的详细信息,可以看到具体的进程命令、内存信息、dll信息等
tlist msedge		# 直接跟进程名称,也同样列出相关信息,此处可以使用通配符
tlist msedg*		# 通配符,列出所有msedg*相关进程的详细信息
tlist -v 2796		# -v查看详细信息
2) 查看进程之间的关联关系
代码语言:javascript
复制
tlist -g						# -g会列出所有进程及所关联的进程,会在进程前面标注[1234],代表该进程是1234关联的进程,但是只能在win7以上系统使用
tilst -g 2796				# 列出指定pid进程的父进程[0]
tlist -g -t					# 列出所有进程的进程树及关联的进程,-t为按照进程树列出,退格表示父子进程

可以看到以下进程前面有 [0] ,是相关进程的父进程:

通过缩紧来表示进程关系,缩紧表示父子关系:

3) 查看进程关联的活动服务
代码语言:javascript
复制
tlist -s      //列出所有进程关联的活动服务
tlist -s 10296    //列出指定进程的关联活动服务
4) 其他命令解析
代码语言:javascript
复制
tlist -p msedge    //-p返回该进程的pid,如果该进程不存在就返回-1,如果多个,就返回首个进程的pid
tlist -w       //返回所有进程的位数,64/32
8. Process Explorer

SysinternalsSuite 的一部分 https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer

可以较为清晰地看到进程之间的关系,可以看作是大号的任务管理器

9. System Informer

https://systeminformer.sourceforge.io/ Process Hacker 的升级版

这个可以看作是大号的 Process Explorer了,但这个不是微软官方开发的

10. 系统信息(msinfo32)

不知道这个程序是从哪代 Windows 加进来的,可以查看的信息不少

win + r 之后输入 msinfo32 或者直接搜索系统信息

可以看到进程开始的时间

0x09 环境变量

可以重点关注 pathpathext

1. GUI 环境变量查询

常规查询方式如下:

右键此电脑-属性-高级系统设置-环境变量

也可以直接通过搜索栏搜索 环境变量

【 Windows Server 2016 】默认情况

2. set 命令查询基本信息

cmd中输入:

代码语言:javascript
复制
set		//列出系统OS系统变量和用户环境变量

【 Windows Server 2016 】 默认情况

Administrator 用户

代码语言:javascript
复制
Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\Administrator\AppData\Roaming
CommonProgramFiles             C:\Program Files\Common Files
CommonProgramFiles(x86)        C:\Program Files (x86)\Common Files
CommonProgramW6432             C:\Program Files\Common Files
COMPUTERNAME                   WIN-2MTJ8IQ5VEA
ComSpec                        C:\Windows\system32\cmd.exe
HOMEDRIVE                      C:
HOMEPATH                       \Users\Administrator
LOCALAPPDATA                   C:\Users\Administrator\AppData\Local
LOGONSERVER                    \\WIN-2MTJ8IQ5VEA
NUMBER_OF_PROCESSORS           4
OS                             Windows_NT
Path                           C:\Program Files (x86)\Parallels\Parallels Tools\Applications;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\...
PATHEXT                        .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE         AMD64
PROCESSOR_IDENTIFIER           Intel64 Family 6 Model 158 Stepping 13, GenuineIntel
PROCESSOR_LEVEL                6
PROCESSOR_REVISION             9e0d
ProgramData                    C:\ProgramData
ProgramFiles                   C:\Program Files
ProgramFiles(x86)              C:\Program Files (x86)
ProgramW6432                   C:\Program Files
PROMPT                         $P$G
PSModulePath                   C:\Users\Administrator\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
PUBLIC                         C:\Users\Public
SESSIONNAME                    Console
SystemDrive                    C:
SystemRoot                     C:\Windows
TEMP                           C:\Users\ADMINI~1\AppData\Local\Temp
TMP                            C:\Users\ADMINI~1\AppData\Local\Temp
USERDOMAIN                     WIN-2MTJ8IQ5VEA
USERDOMAIN_ROAMINGPROFILE      WIN-2MTJ8IQ5VEA
USERNAME                       Administrator
USERPROFILE                    C:\Users\Administrator
windir                         C:\Windows

3. powershell 查看环境变量

powershell中输入:

代码语言:javascript
复制
ls env: | Format-Table -Wrap
$env:path -Split ";"		# 快速列出环境变量 path

【 Windows Server 2016 】 默认情况

Administartor 用户

代码语言:javascript
复制
Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\Administrator\AppData\Roaming
CommonProgramFiles             C:\Program Files\Common Files
CommonProgramFiles(x86)        C:\Program Files (x86)\Common Files
CommonProgramW6432             C:\Program Files\Common Files
COMPUTERNAME                   WIN-2MTJ8IQ5VEA
ComSpec                        C:\Windows\system32\cmd.exe
HOMEDRIVE                      C:
HOMEPATH                       \Users\Administrator
LOCALAPPDATA                   C:\Users\Administrator\AppData\Local
LOGONSERVER                    \\WIN-2MTJ8IQ5VEA
NUMBER_OF_PROCESSORS           4
OS                             Windows_NT
Path                           C:\Program Files (x86)\Parallels\Parallels Tools\Applications;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\User
                               s\Administrator\AppData\Local\Microsoft\WindowsApps;
PATHEXT                        .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE         AMD64
PROCESSOR_IDENTIFIER           Intel64 Family 6 Model 158 Stepping 13, GenuineIntel
PROCESSOR_LEVEL                6
PROCESSOR_REVISION             9e0d
ProgramData                    C:\ProgramData
ProgramFiles                   C:\Program Files
ProgramFiles(x86)              C:\Program Files (x86)
ProgramW6432                   C:\Program Files
PROMPT                         $P$G
PSModulePath                   C:\Users\Administrator\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
PUBLIC                         C:\Users\Public
SESSIONNAME                    Console
SystemDrive                    C:
SystemRoot                     C:\Windows
TEMP                           C:\Users\ADMINI~1\AppData\Local\Temp
TMP                            C:\Users\ADMINI~1\AppData\Local\Temp
USERDOMAIN                     WIN-2MTJ8IQ5VEA
USERDOMAIN_ROAMINGPROFILE      WIN-2MTJ8IQ5VEA
USERNAME                       Administrator
USERPROFILE                    C:\Users\Administrator
windir                         C:\Windows
代码语言:javascript
复制
C:\Program Files (x86)\Parallels\Parallels Tools\Applications
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps
4. 系统信息(msinfo32)

不知道这个程序是从哪代 Windows 加进来的,可以查看的信息不少

win + r 之后输入 msinfo32 或者直接搜索系统信息

5. 环境变量 CLR 劫持排查

CLR相关知识引用: CLR :公共语言运行库(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境;所以.NET 的程序,都是在CLR中运行的。 使用基于CLR的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 MS的一些语言,例如C#、VB、F#,都是在 CLR 中运行的,所以可以将CLR理解为他们的运行环境。

CLR劫持的根本思路就是在于:利用一个叫做托管代码分析器的东西(Managed Profiler) ,用于性能分析、调试和诊断.NET应用程序的工具,它可以捕获应用程序的执行信息、方法调用、资源使用情况等,并提供详细的分析报告。如果我们将托管代码分析器设置为恶意程序,那就可以劫持所有 .net 框架程序的执行

基本操作为:

  • CLR 需配置环境变量才能完全劫持 .Net
  • 增加 COR_ENABLE_PROFILING 值为 1
    • 这个环境变量是告诉 .NET Framework 运行时加载托管代码分析器(Managed Profiler
  • 设置 COR_PROFILER 值为 CLSID
    • 这个环境变量指定托管代码分析器(Managed Profiler)的 CLSID(Class ID)
  • CLSID 可以为任意值,但不能与系统默认原有的CLSID冲突,可参照计算机原有CLSID修改,使之更不易被察觉

利用方式如下:

  • 修改环境变量
代码语言:javascript
复制
	# cmd中运行以下命令:
	SETX COR_ENABLE_PROFILING 1
	SETX COR_PROFILER {AABBCCDD-1234-1234-1234-AABBCCDDEEFF}		# {}为CLSID内容
  • 修改注册表
代码语言:javascript
复制
# msf.dll为msf生成的后门dll文件
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{AABBCCDD-1234-1234-1234-AABBCCDDEEFF}\InProcServer32" /VE /T REG_SZ /D "C:\msf.dll" /F

# 设置ThreadingModel = Apartment
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{AABBCCDD-1234-1234-1234-AABBCCDDEEFF}\InProcServer32" /V ThreadingModel /T REG_SZ /D Apartment /F

所以在排查思路上,就可以重点关注环境变量内容

  • 首先可以在环境变量中重点关注是否存在 COR_ENABLE_PROFILINGCOR_PROFILER 的键值
代码语言:javascript
复制
set COR			# 列出COR相关的环境变量
  • 通过注册表查询
代码语言:javascript
复制
# //列出该注册表项下所有CLSID,如果有就可以继续递归排查
reg query HKEY_CURRENT_USER\Software\Classes\CLSID\

0x10 系统基本信息及补丁

1. 系统基本信息查询

cmd中输入命令:

代码语言:javascript
复制
systeminfo

列出系统信息后,主要关注补丁信息:

2. wmic查询补丁信息

cmd中输入:

代码语言:javascript
复制
wmic qfe list			//列出系统内补丁信息
3. Windows-Exploit-Suggester

Windows-Exploit-Suggester.py脚本根据Microsoft官方的漏洞补丁库与本地系统信息进行比较,列出当前系统可能存在的漏洞及对应补丁

但是已经很久没更新了

  • 微软公开漏洞库下载地址:

http://www.microsoft.com/en-gb/download/confirmation.aspx?id=36982 http://download.microsoft.com/download/6/7/3/673E4349-1CA5-40B9-8879-095C72D5B49D/BulletinSearch.xlsx

  • Windows-Exploit-Suggester.py脚本地址:

https://github.com/AonCyberLabs/Windows-Exploit-Suggester/blob/master/windows-exploit-suggester.py

  • 需要python 2.X环境,及外部库,自行pip install安装即可

使用方法如下:

  • 1.首先更新微软漏洞库文件
代码语言:javascript
复制
python windows-exploit-suggester.py --update		//进行更新微软漏洞库文件,建议每次都先update一下
  • 2.将目标服务器的systeminfo命令执行的结果复制保存到本地

3.本地使用systeminfo命令结果进行检测:

代码语言:javascript
复制
python windows-exploit-suggester.py -d 2022-03-10-mssb.xls -i win10.txt

命令结果如下:

4. WES-NG

Windows Exploit Suggester - Next Generation (WES-NG) https://github.com/bitsadmin/wesng 声称是下一代 Windows Exploit Suggester

具体使用方法可以查看 Github 上的项目详情

0x11 系统日志分析

无论大家使用哪款程序来帮助分析日志,我都建议大家先把日志备份一份儿,同时在同款主机上测试一下工具的可用性

1. 事件查看器

win+r 中输入,打开系统事件查看器:

代码语言:javascript
复制
eventvwr.msc			# windows事件查看器

主要关注以下日志内容:

  • 安全日志 记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。安全日志也是调查取证中最常用到的日志。
  • 系统日志 记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等。
  • 应用程序日志 包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。

针对windows安全日志分析,主要是查看各事件ID,同时查看事件内容,以下为常见的事件ID代表的含义:

Microsoft官方事件ID含义对应表 https://docs.microsoft.com/zh-cn/windows-server/identity/ad-ds/plan/appendix-l--events-to-monitor

事件ID

说明

4624

登录成功

4625

登录失败

4634

注销成功

4647

用户启动的注销

4672

使用超级用户(如管理员)进行登录

4720

创建用户

4722

启用用户

4726

删除用户

1102

清理日志

其中每个登录事件日志中,还会有登录类型字段,该字段代表为所使用的登录方式为哪种,如下表:

登录类型

描述

说明

2

交互式登录(Interactive)

用户在本地进行登录

3

网络(Network)

最常见的情况就是连接到共享文件夹或共享打印机时

4

批处理(Batch)

通常表明某计划任务启动

5

服务(Service)

每种服务都被配置在某个特定的用户账号下运行

7

解锁(Unlock)

屏保解锁

8

网络明文(NetworkCleartext)

登录的密码在网络上是通过明文传输的,如FTP

9

新凭证(NewCredentials)

使用带/Netonly参数的RUNAS命令运行一个程序

10

远程交互(RemoteInteractive)

通过终端服务、远程桌面或远程协助访问计算机

11

缓存交互(CachedInteractive)

以一个域用户登录而又没有域控制器可用

可以通过筛选当前安全日志的方式,查看是否存在爆破纪录,如果存在大量、且时间连续的4625日志,说明存在爆破记录:

也可以筛选上面敏感的事件id进行分析,当前日志分析的前提是***日志完好的保存且记录配置正确***

2. 日志文件

Windows Server 2016 的日志存储位置为

代码语言:javascript
复制
C:\Windows\System32\winevt\Logs\

其中包含各种日志

安全日志系统默认存放位置:

代码语言:javascript
复制
C:\Windows\System32\winevt\Logs\Security.evtx

系统日志默认存放位置:

代码语言:javascript
复制
C:\Windows\System32\winevt\Logs\System.evtx

应用程序日志默认存放位置:

代码语言:javascript
复制
C:\Windows\System32\winevt\Logs\Application.evtx
3. wevtutil

wevtutil.exe 是 Windows 自带的查询日志的命令行工具

查询日志来源为默认的 evtx 日志文件:

代码语言:javascript
复制
C:\Windows\System32\winevt\Logs\					# 日志文件目录

相关参数的简单用法官方文档内有部分解释:

https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/wevtutil

  • 这里写一下基本用法,因为我们基本只是涉及到查询,所以都围绕查询输出一些常用知识
  • 可以与findstr搭配使用

常用参数

解析

示例

示例解析

qe

从指定的某类日志中查询

wevtutil qe Security

查询安全日志

/q

自定义 XPath格式查询事件可以多语句查询

/q:"Event/System/EventID=4624"

筛选事件id为4624的日志

/f

输出格式一般有xml、text等

/f:text

text格式输出

/c

理解为输出的条数默认为倒序所以直接输出都是最早的日志

/c:10

输出10条

/rd

正序查询或倒序查询默认true为倒序false为正序

/rd:false

正序查找,从最近开始

/epl

导出日志

/epl System xxx.evtx

将System日志导出到xxx.evtx

根据常用查询参数,编写了部分查询命令,可以自行根据想要的信息更改参数

需要注意的是/q后跟为XPath格式查询语句,内容非常多,此处只是列举部分常规排查会用得到的参数

展示的内容一般比较多,与findstr搭配查询关键字

查找安全日志中,事件ID为4624(登录成功)的日志,输出最近10条:

代码语言:javascript
复制
wevtutil qe Security /q:"Event/System/EventID=4624" /f:text /rd:false /c:10

查找安全日志中,事件ID为4624(登录成功),并且登陆类型为10(远程 RDP 登录)的日志,输出最近3条:

代码语言:javascript
复制
wevtutil qe security /q:"*[EventData[Data[@Name='LogonType']='10'] and System[(EventID=4624)]]" /f:text /rd:false /c:3

当前操作系统没有被远程 RDP 登录过,所以为空

查找安全日志中,目标账户名为'XXX'的日志:

代码语言:javascript
复制
wevtutil qe security /q:"Event/EventData/Data[@Name='TargetUserName']='XXX'" /f:text /rd:false /c:3

查找安全日志中,在2022-06-28 20:13到2022-06-28 22:06期间所有事件id为4624(登录成功)的日志:

代码语言:javascript
复制
wevtutil qe security /q:"*[System [TimeCreated[@SystemTime <'2022-06-28T14:06:20' and @SystemTime >'2022-06-28T12:13:51']]] and Event/System/EventID=4624" /f:text /rd:false

需要注意的是:时间查询也支持时间戳查询,但是建议时间区间查询按照如上方式 ,是在日志中详细信息选项内获取

同时该时间格式 2022-06-28T12:13:51.598599500Z

T表示分隔符,Z表示的是UTC。UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。

换算可得:2022-06-28T12:13:51.598599500Z <==> 2022-06-28 20:13:51

4. PowerShell

除非你想快速确认某些内容并且有写好的 powershell 脚本或者做自动化日志分析处理,不然不是很建议使用 powershell 查询日志

Windows PowerShell同样提供了日志查询的相关命令程序:

  • Get-WinEvent
  • Get-EventLog

这两个PowerShell的命令程序优点是它们将结果作为PowerShell对象返回,所以可以支持用户操作和格式化这些返回,如 Select、Select-String、Format-List

关于这两个命令程序的区别,腾讯云开发者社区的雷龙写了一篇文章,从功能性到效率都做了讲解,推荐看下:

《Get-WinEvent和Get-EventLog的区别及效率》 https://cloud.tencent.com/developer/article/1879732

Get-EventLog

https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/get-eventlog?view=powershell-5.1&viewFallbackFrom=powershell-7.2

  • 用于旧版本的 Windows PowerShell,与 Windows Event Log 服务交互
  • 可以获取指定日志名称的事件日志条目
  • 常见用法示例:Get-EventLog -LogName System

Get-WinEvent

https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.diagnostics/get-winevent?view=powershell-7.2

  • 用于较新版本的 Windows PowerShell(从 Windows PowerShell 3.0 开始)
  • 通过 Windows 事件日志 API(Event Log Service)与事件日志交互
  • 提供更丰富的选项,例如条件过滤、排序、格式化等
  • 可以使用强大的筛选器来选择特定的事件日志条目
  • 常见用法示例:Get-WinEvent -LogName System
1) Get-WinEvent

Get-WinEvent可以查询上百种日志,其中包括更加详细的 Applications and Services Logs,Get-WinEvent是从 Windows Vista 才开始引入的。

需要注意的是,尽量使用管理员权限进行操作 powershell,不然部分日志会返回错误

Get-WinEvent 命令可以查询日志非常全面,可以通过 Get-WinEvent -ListLog * 来查看具体能够查询那些日志,同时所查询日志都在windows日志目录下:

基本用法:

查询登录成功的日志(事件id: 4624)

代码语言:javascript
复制
Get-WinEvent -LogName Security -FilterXPath '*/System/EventID=4624' | Select *

如果直接 Select * 会查处一堆,包括查询到的所有的内容,当然我们限制查询条数

代码语言:javascript
复制
Get-WinEvent -LogName Security -FilterXPath '*/System/EventID=4624' -MaxEvents 1 | Select *

如果只想看其中几项,可以在 Select 后面指定,但是如何知道到底有哪些项呢?

代码语言:javascript
复制
Get-WinEvent -LogName Security -FilterXPath '*/System/EventID=4624' | Get-Member

这样就可以选择了

2) Get-EventLog

查询登录成功的日志

代码语言:javascript
复制
Get-EventLog -LogName Security -InstanceId 4624

如果想查询实际内容,与上面内容一样

5. Log Parser

Log Parser 是一款由 Microsoft 开发的强大的命令行工具,用于分析和查询各种日志文件和数据源。它可以帮助你从多种格式的日志文件中提取信息,并执行复杂的查询和分析操作。

Log Parser 支持多种数据源,包括文本文件(如日志文件、CSV 文件)、事件日志、注册表、IIS 日志、数据库等。它使用一种类 SQL 的查询语言,让你能够执行各种过滤、排序、统计和聚合操作。

官方下载地址:

https://download.microsoft.com/download/f/f/1/ff1819f9-f702-48a5-bbc7-c9656bc74de8/LogParser.msi

它使用 SQL 语句一样查询分析这些数据,所以使用起来稍微复杂一些,需要对SQL查询语句操作熟悉

以下语句中的 sercurity.evtx 都是从日志目录下复制到工具目录内,如果不进行复制就需要管理员启动cmd命令行来进行查询

查询系统日志EVTX语句格式:

代码语言:javascript
复制
LogParser.exe -i:EVT -o:DATAGRID {SQL语句}

安全日志中的可查询字段内容:

字段名

字段内容

查询方式

eventlog

所查询的日志路径

无需关注

recordnumber

该条日志索引序号

无需关注

timegenerated

※日志产生的时间

比较运算符<,>,=,<>建议结合order by xxx desc使用

timewritten

日志写入的时间

比较运算符<,>,=,<>

eventid

※事件id

比较运算符等于=4624不等于<>4624

eventtype

※事件类型

比较运算符<,>,=,<>

eventtpyename

事件类型描述一般是审核成功/失败

无需关注

eventcategory

事件数字类型类别

无需关注

eventcategoryname

事件类别描述

无需关注

sourcename

日志来源通常情况下是Microsoft-Windows-Security-Auditing

无需关注

strings

※事件关联数据内容登录信息登录账户登录域登录时间登录ip等信息

内容用|分割可以使用extract_token(strings,5,'|')进行分割筛选

computername

生成事件的主机名

涉及到特殊登录时可以关注

sid

与事件关联的安全标识符

无需关注

message

※事件消息内容包含登录信息等

内容用“ ”空格分割可以使用extract_token(message,13,' ')

data

二进制数据

无需关注

其中需要注意的是两个字段:

  • strings 使用 |对数据进行分割

EXTRACT_TOKEN(Strings, 0, '|')提取S-1-5-18

EXTRACT_TOKEN(Strings, 5, '|')提取 IP 以此类推

  • message使用“ ”(空格)对数据进行分割,方法与上面相同

上述帮助描述可以从官方文档中找到

根据上面的表格,我们即可通过相应的SQL语句进行查询:

查询事件id为登录失败的日志,并且要最近的开始展示

代码语言:javascript
复制
select * from security.evtx where eventid=4625 order by timegenerated desc

查询某个时间内的登录成功日志,并且要看所使用的用户名,ip,登录时间

代码语言:javascript
复制
select extract_token(strings,5,'|') as Username,extract_token(message,38,' ') as Loginip,timegenerated from security.evtx where timegenerated > '2022-01-01 00:00:00' and timegenerated < '2022-01-02 00:00:00' and eventid = 4624
  • extract_token(strings,5,'|') 结果为账户名
  • extract_token(message,38,' ') 结果为登录ip,null为本地登录
  • timegenerated 结果为日志产生时间

以下为常用的查询语句:

查询登录成功的事件

代码语言:javascript
复制
LogParser.exe -i:EVT -o:DATAGRID "select * from security.evtx where EventID=4624"

查询登录失败的事件

代码语言:javascript
复制
LogParser.exe -i:EVT -o:DATAGRID "select * from security.evtx where EventID=4625"

查询指定时间范围内的登录成功/失败日志

TimeGenerated>'2018-06-19 23:32:11' and TimeGenerated<'2018-06-20 23:34:00'

代码语言:javascript
复制
LogParser.exe -i:EVT –o:DATAGRID  "SELECT *  FROM c:\Security.evtx where TimeGenerated>'2018-06-19 23:32:11' and TimeGenerated<'2018-06-20 23:34:00' and EventID=4624"

提取登录成功/失败的用户名和IP

代码语言:javascript
复制
LogParser.exe -i:EVT  –o:DATAGRID  "SELECT EXTRACT_TOKEN(Message,13,' ') as EventType,TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as Username,EXTRACT_TOKEN(Message,38,' ') as Loginip FROM c:\Security.evtx where EventID=4624"

筛选指定IP的远程登录成功日志

代码语言:javascript
复制
LogParser.exe -i:EVT  –o:DATAGRID  "SELECT * FROM c:\Security.evtx where EventID=4624" and extract_token(strings,8,"|")='10' and extract_token(strings,5,'|') = '192.168.1.1'
6. LogParser Lizard

LogParser Lizard是基于LogParser的GUI图形化程序。

这个程序也有几年没有更新了

  • 官方下载地址:

https://www.lizard-labs.com/log_parser_lizard.aspx

优点:

  • 相比于纯命令行化的LogParser,易于使用。
  • 可以提前写好查询日志的SQL语句,即可直接使用。
  • 展示结果来说,相比LogParser个人感觉要更好。

缺点:

  • 官方安装包100MB+,并不适用很多环境。
  • 需要安装,然后设置编写查询命令,也并不适用很多应急场景。

截图于官方网站:

7. evtxLogParser

https://tools.lz520520.com/files/lz520520/logparse/evtxLogparse1.3.zip 使用方法参考文章 https://sec.lz520520.com/2019/10/298/

evtxLogParser是基于LogParser做了一个简单的命令调用,工具内预先写了关于 smbrdp 两个协议的日志筛选规则,可以筛选日志内smb协议和rdp协议的登录成功或失败的日志。

虽然内置规则简单,但是胜在方便快捷,对应场景下使用简单方便。

工具使用如下:

代码语言:javascript
复制
evtxLogparse.exe -r success/fail xxx.evtx		# 筛选指定日志里rdp成功或失败的日志
evtxLogparse.exe -s success/fail xxx.evtx		# 筛选指定日志里smb成功或失败的日志
# 存在以上相关筛选结果,返回的结果与LogParser返回结果样子完全一样
8. sysmon

sysmon 是由 Windows Sysinternals 出品的一款 Sysinternals 系列工具之一,以系统服务和设备驱动程序的方式安装在系统上,会在系统重新启动时保持驻留状态,以监视和记录系统活动到Windows事件日志中,可以提供进程创建、网络连接、文件创建相关信息,同时收集或SIEM代理收集它生成的事件并随后对其进行分析,可以识别恶意或异常活动,并了解入侵者和恶意软件如何在用户网络上运行。

Sysmon不会对其生成的事件进行分析,也不会尝试保护自己免受攻击者攻击,因此仅作为监控工具而存在,允许其监视计算机上的某些活动并将其记录到Windows事件查看器。

在打开应用或者任何进程创建的行为发生时,Sysmon 会使用sha1(默认)、MD5、SHA256 或 IMPHASH 记录进程镜像文件的 hash 值,包含进程创建过程中的进程 GUID,每个事件中包含 session 的 GUID。除此之外记录磁盘和卷的读取请求 / 网络连接(包括每个连接的源进程,IP 地址,端口号,主机名和端口名),重要的是还可在生成初期进程事件能记录在复杂的内核模式运行的恶意软件。

优点:

  • 系统服务级别的监控,监控信息详细且全面,具体的进程信息全部能够获取到。
  • 轻量化,对系统影响非常小,安装完成后,就开始监控,同时耗费资源非常小。

缺点:

  • 需要安装,适用于一些现场段时间排查无发现的情况下,可以尝试监控一段时间。
  • 配合sysmontools里的sysmon view能够更好的分析,也不算是缺点,但是相关工具蛮大的。
  • 相关配置文件繁琐复杂,编写难度比较高,github上有已经配置好的配置文件,但是生成的日志还是会有些多,所以单独编写配置文件过滤日志难度较高。

准备工作:

  • sysmon官方下载链接

https://docs.microsoft.com/zh-cn/sysinternals/downloads/sysmon

  • sysmonconfig-export.xml 配置文件下载链接:

https://github.com/SwiftOnSecurity/sysmon-config

  • sysmontools下载链接:

https://github.com/nshalabi/SysmonTools

1) 安装

首先下载 sysmon 安装程序,包含以下文件:

使用命令进行安装,安装之前需要将下载的 sysmonconfig-export.xml 配置文件放到当前文件夹,然后使用以下命令进行安装,需要注意的是,安装过程需要用管理员权限,所以需要管理员启动cmd

代码语言:javascript
复制
sysmon64.exe -accepteula -i sysmonconfig-export.xml
# 默认设置进行安装,使用指定的配置文件xml

看到如下截图即代表安装完成:

2) 使用方法

在事件查看器中,找到:

事件查看器--> 应用程序和服务日志--> Microsoft--> Windows--> Sysmon--> Operational

当前模块下所有日志即为sysmon监控记录的日志,可以点击某条日志,在下面板查看日志详情内容。

3) sysmon view可视化分析

在 sysmon 目录下管理员启动 cmd,输入如下命令,会在当前目录下生成 eventlog.xml 文件:

代码语言:javascript
复制
WEVTUtil query-events "Microsoft-Windows-Sysmon/Operational" /format:xml /e:sysmonview > eventlog.xml

使用sysmon view工具导入eventlog.xml文件:

File--> Import Sysmon Event Logs

选择已经生成好的eventlog.xml文件,导入完成后即可看到所有运行程序及进程信息。

尝试使用mimikatz

尝试使用net user /add admin$

同样可以抓取到具体进程和命令

筛选查看对应日志:

sysmon日志事件ID含义:

以下内容摘自官方文档 https://docs.microsoft.com/zh-cn/sysinternals/downloads/sysmon

事件ID 1:流程创建

流程创建事件提供有关新创建流程的扩展信息。完整的命令行提供了有关流程执行的上下文。ProcessGUID字段是整个域中此过程的唯一值,以简化事件关联。哈希是文件的完整哈希,其中包含HashType字段中的算法。

事件ID 2:一个进程更改了文件创建时间

当进程显式修改文件创建时间时,将注册更改文件创建时间事件。此事件有助于跟踪文件的实际创建时间。攻击者可能会更改后门的文件创建时间,以使其看起来像与操作系统一起安装。请注意,许多进程会合理地更改文件的创建时间。它不一定表示恶意活动。

事件ID 3:网络连接

网络连接事件记录计算机上的TCP / UDP连接。默认情况下禁用。每个连接都通过ProcessId和ProcessGUID字段链接到流程。该事件还包含源和目标主机名IP地址,端口号和IPv6状态。

事件ID 4:Sysmon服务状态已更改

服务状态更改事件报告Sysmon服务的状态(已启动或已停止)。

事件ID 5:进程终止

进程终止时报告进程终止事件。它提供了进程的UtcTime,ProcessGuid和ProcessId。

事件ID 6:驱动程序已加载

驱动程序加载事件提供有关在系统上加载驱动程序的信息。提供配置的哈希值以及签名信息。出于性能原因,签名是异步创建的,并指示在加载后是否删除了文件。

事件ID 7:图像已加载

图像加载事件记录在特定过程中加载模块的时间。默认情况下,此事件是禁用的,需要使用–l选项进行配置。它指示模块的加载过程,哈希和签名信息。出于性能原因,签名是异步创建的,并指示在加载后是否删除了文件。应仔细配置此事件,因为监视所有图像加载事件将生成大量事件。

事件ID 8:CreateRemoteThread

CreateRemoteThread事件检测一个进程何时在另一个进程中创建线程。恶意软件使用此技术来注入代码并隐藏在其他进程中。该事件指示源和目标进程。它提供了有关将在新线程中运行的代码的信息:StartAddress,StartModule和StartFunction。请注意,将推断StartModule和StartFunction字段,如果起始地址在已加载的模块或已知的导出函数之外,则它们可能为空。

事件ID 9:RawAccessRead

RawAccessRead事件检测进程何时使用\。\表示从驱动器进行读取操作。恶意软件通常使用此技术来对已锁定以供读取的文件进行数据泄漏,并避免使用文件访问审核工具。该事件指示源进程和目标设备。

事件ID 10:ProcessAccess

当一个进程打开另一个进程时,该进程访问事件报告,该操作通常伴随着信息查询或读写目标进程的地址空间。这样可以检测黑客工具,这些工具读取诸如本地安全机构(Lsass.exe)之类的进程的内存内容,以窃取凭据以用于“哈希传递”攻击。如果存在活动的诊断实用程序,这些实用程序会反复打开进程以查询其状态,则启用它可能会产生大量的日志记录,因此通常只应使用删除预期访问的过滤器来启用它。

事件ID 11:FileCreate

创建或覆盖文件时,将记录文件创建操作。该事件对于监视自动启动位置(如启动文件夹)以及临时目录和下载目录很有用,这些位置是恶意软件在初始感染期间掉落的常见位置。

事件ID 12:RegistryEvent(对象创建和删除)

注册表项和值的创建和删除操作映射到此事件类型,这对于监视注册表自动启动位置的更改或特定的恶意软件注册表修改很有用。

Sysmon使用注册表根键名的缩写版本,具有以下映射:

键名

缩写

HKEY_LOCAL_MACHINE

HKLM

HKEY_USERS

HKU

HKEY_LOCAL_MACHINE\System\ControlSet00x

HKLM\System\CurrentControlSet

HKEY_LOCAL_MACHINE\Classes

HKCR

事件ID 13:RegistryEvent(值集)

此注册表事件类型标识注册表值修改。该事件记录为DWORD和QWORD类型的注册表值写入的值。

事件ID 14:RegistryEvent(键和值重命名)

注册表键和值重命名操作映射到此事件类型,记录重命名的键或值的新名称。

事件ID 15:FileCreateStreamHash

此事件在创建命名文件流时记录,并生成事件,该事件记录该流所分配到的文件内容(未命名流)以及命名流的内容的哈希。有一些恶意软件变体会通过下载浏览器来删除其可执行文件或配置设置,并且该事件旨在基于基于附加了Zone.Identifier“网络标记”流的浏览器来捕获它们。

事件ID 16:ServiceConfigurationChange

此事件记录Sysmon配置中的更改-例如,更新过滤规则时。

事件ID 17:PipeEvent(已创建管道)

创建命名管道时,将生成此事件。恶意软件通常使用命名管道进行进程间通信。

事件ID 18:PipeEvent(已连接管道)

在客户端和服务器之间建立命名管道连接时,将记录此事件。

事件ID 19:WmiEvent(检测到WmiEventFilter活动)

注册WMI事件筛选器(恶意软件执行该方法)后,此事件将记录WMI名称空间,筛选器名称和筛选器表达式。

事件ID 20:WmiEvent(检测到WmiEventConsumer活动)

此事件记录WMI使用者的注册,记录使用者名称,日志和目的地。

事件ID 21:WmiEvent(检测到WmiEventConsumerToFilter活动)

当使用者绑定到过滤器时,此事件记录使用者名称和过滤器路径。

事件ID 22:DNSEvent(DNS查询)

当进程执行DNS查询时,无论结果是否成功,是否缓存,都会生成此事件。

事件ID 23:FileDelete(检测到文件删除)

文件已删除

事件ID 255:错误

Sysmon中发生错误时,将生成此事件。如果系统负载沉重,某些任务无法执行,或者Sysmon服务中存在错误,则可能发生这种情况。您可以在Sysinternals论坛或Twitter(@markrussinovich)上报告任何错误。

9. LogonTracer

https://github.com/JPCERTCC/LogonTracer

LogonTracer 是一种通过可视化和分析 Windows Active Directory 事件日志来调查恶意登录的工具。此工具将主机名(或 IP 地址)和帐户名关联到与登录相关的事件中,并将其显示为图形。这样,就可以查看哪个帐户尝试以及使用了哪个主机。

借用官网的图

LogonTracer 示例

0x12 命令历史

1) cmd命令行历史

Windows cmd命令行同样存在命令历史,可以通过相关命令/操作进行查询,但是需要注意的是:

cmd命令历史只能在未关闭的cmd命令窗中进行查询,如果cmd窗口关闭,或未通过cmd命令窗进行的命令操作,是不会记录的

原理为每次新建cmd窗口时,进程会开辟一处缓冲区用来写入相关命令历史,如果关闭窗口,即会清空

未关闭的cmd窗口中输入:

代码语言:javascript
复制
doskey /?							# 获取命令帮助
doskey /history				# 获取当前cmd窗的命令历史

未关闭的cmd窗口中键入F7

2) powershell 历史

powershell 有两种历史记录的方式

  • 内置会话记录
  • PSReadLine 历史记录

参考 https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_history?view=powershell-7.4

内置会话记录

cmd 的历史记录一样,也是关掉窗口就没了

代码语言:javascript
复制
Get-History

还有三个简写命令,主打一个越来越简

代码语言:javascript
复制
history
ghy
h

PSReadLine

PSReadLine 在 PowerShell 控制台中提供改进的命令行编辑体验。 https://learn.microsoft.com/zh-cn/powershell/module/psreadline/about/about_psreadline?view=powershell-7.4

PSReadLine 维护一个历史记录文件,其中包含从命令行输入的所有命令和数据。 历史记录文件是一个名为 (host.Name)_history.txt 的文件。

在 Windows 系统上,历史记录文件存储在 $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine

在非 Windows 系统上,历史记录文件存储在 env:XDG_DATA_HOME/powershell/PSReadLine 或 env:HOME/.local/share/powershell/PSReadLine 中。

Windows Server 2016 中默认为

代码语言:javascript
复制
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine

默认情况下并不记录时间,无法像 Linux 那样通过配置环境变量的方法让已经记录的命令显示时间

经过测试,重启后不会删除记录

默认情况下 powershell 的日志中记录的信息不是很有帮助,这里就不展示了

0x13 PowerShell 配置文件

cmd 没有类似于 bash 的配置文件,但是 powershell 是有的

https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4

powershell 配置文件的位置可以通过 powershell 变量 $PROFILE 的值来确定

powershell 中执行

代码语言:javascript
复制
$PROFILE | Select-Object *
代码语言:javascript
复制
AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : C:\Users\Administrator\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

这些配置文件中都可以类似 Bash 配置文件一样,在其中放置后门程序

排查时记得查看不同用户的文件夹

具体情况可以查看 知识点附录 -> 0x11 PowerShell 配置文件实验

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : C:\Users\Administrator\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

默认情况下都不存在这些文件

0x14 PowerShell 日志

Win + r 输入 eventvwr

应用程序和服务日志 -> Windows Powershell

0x15 PowerShell Alias

直接在 powershell 命令行输入

代码语言:javascript
复制
alias

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
Alias           cat -> Get-Content
Alias           cd -> Set-Location
Alias           CFS -> ConvertFrom-String                          3.1.0.0    Microsoft.PowerShell.Utility
Alias           chdir -> Set-Location
Alias           clc -> Clear-Content
Alias           clear -> Clear-Host
Alias           clhy -> Clear-History
Alias           cli -> Clear-Item
Alias           clp -> Clear-ItemProperty
Alias           cls -> Clear-Host
Alias           clv -> Clear-Variable
Alias           cnsn -> Connect-PSSession
Alias           compare -> Compare-Object
Alias           copy -> Copy-Item
Alias           cp -> Copy-Item
Alias           cpi -> Copy-Item
Alias           cpp -> Copy-ItemProperty
Alias           curl -> Invoke-WebRequest
Alias           cvpa -> Convert-Path
Alias           dbp -> Disable-PSBreakpoint
Alias           del -> Remove-Item
Alias           diff -> Compare-Object
Alias           dir -> Get-ChildItem
Alias           dnsn -> Disconnect-PSSession
Alias           ebp -> Enable-PSBreakpoint
Alias           echo -> Write-Output
Alias           epal -> Export-Alias
Alias           epcsv -> Export-Csv
Alias           epsn -> Export-PSSession
Alias           erase -> Remove-Item
Alias           etsn -> Enter-PSSession
Alias           exsn -> Exit-PSSession
Alias           fc -> Format-Custom
Alias           fhx -> Format-Hex                                  3.1.0.0    Microsoft.PowerShell.Utility
Alias           fl -> Format-List
Alias           foreach -> ForEach-Object
Alias           ft -> Format-Table
Alias           fw -> Format-Wide
Alias           gal -> Get-Alias
Alias           gbp -> Get-PSBreakpoint
Alias           gc -> Get-Content
Alias           gci -> Get-ChildItem
Alias           gcm -> Get-Command
Alias           gcs -> Get-PSCallStack
Alias           gdr -> Get-PSDrive
Alias           ghy -> Get-History
Alias           gi -> Get-Item
Alias           gjb -> Get-Job
Alias           gl -> Get-Location
Alias           gm -> Get-Member
Alias           gmo -> Get-Module
Alias           gp -> Get-ItemProperty
Alias           gps -> Get-Process
Alias           gpv -> Get-ItemPropertyValue
Alias           group -> Group-Object
Alias           gsn -> Get-PSSession
Alias           gsnp -> Get-PSSnapin
Alias           gsv -> Get-Service
Alias           gu -> Get-Unique
Alias           gv -> Get-Variable
Alias           gwmi -> Get-WmiObject
Alias           h -> Get-History
Alias           history -> Get-History
Alias           icm -> Invoke-Command
Alias           iex -> Invoke-Expression
Alias           ihy -> Invoke-History
Alias           ii -> Invoke-Item
Alias           ipal -> Import-Alias
Alias           ipcsv -> Import-Csv
Alias           ipmo -> Import-Module
Alias           ipsn -> Import-PSSession
Alias           irm -> Invoke-RestMethod
Alias           ise -> powershell_ise.exe
Alias           iwmi -> Invoke-WMIMethod
Alias           iwr -> Invoke-WebRequest
Alias           kill -> Stop-Process
Alias           lp -> Out-Printer
Alias           ls -> Get-ChildItem
Alias           man -> help
Alias           md -> mkdir
Alias           measure -> Measure-Object
Alias           mi -> Move-Item
Alias           mount -> New-PSDrive
Alias           move -> Move-Item
Alias           mp -> Move-ItemProperty
Alias           mv -> Move-Item
Alias           nal -> New-Alias
Alias           ndr -> New-PSDrive
Alias           ni -> New-Item
Alias           nmo -> New-Module
Alias           npssc -> New-PSSessionConfigurationFile
Alias           nsn -> New-PSSession
Alias           nv -> New-Variable
Alias           ogv -> Out-GridView
Alias           oh -> Out-Host
Alias           popd -> Pop-Location
Alias           ps -> Get-Process
Alias           pushd -> Push-Location
Alias           pwd -> Get-Location
Alias           r -> Invoke-History
Alias           rbp -> Remove-PSBreakpoint
Alias           rcjb -> Receive-Job
Alias           rcsn -> Receive-PSSession
Alias           rd -> Remove-Item
Alias           rdr -> Remove-PSDrive
Alias           ren -> Rename-Item
Alias           ri -> Remove-Item
Alias           rjb -> Remove-Job
Alias           rm -> Remove-Item
Alias           rmdir -> Remove-Item
Alias           rmo -> Remove-Module
Alias           rni -> Rename-Item
Alias           rnp -> Rename-ItemProperty
Alias           rp -> Remove-ItemProperty
Alias           rsn -> Remove-PSSession
Alias           rsnp -> Remove-PSSnapin
Alias           rujb -> Resume-Job
Alias           rv -> Remove-Variable
Alias           rvpa -> Resolve-Path
Alias           rwmi -> Remove-WMIObject
Alias           sajb -> Start-Job
Alias           sal -> Set-Alias
Alias           saps -> Start-Process
Alias           sasv -> Start-Service
Alias           sbp -> Set-PSBreakpoint
Alias           sc -> Set-Content
Alias           select -> Select-Object
Alias           set -> Set-Variable
Alias           shcm -> Show-Command
Alias           si -> Set-Item
Alias           sl -> Set-Location
Alias           sleep -> Start-Sleep
Alias           sls -> Select-String
Alias           sort -> Sort-Object
Alias           sp -> Set-ItemProperty
Alias           spjb -> Stop-Job
Alias           spps -> Stop-Process
Alias           spsv -> Stop-Service
Alias           start -> Start-Process
Alias           sujb -> Suspend-Job
Alias           sv -> Set-Variable
Alias           swmi -> Set-WMIInstance
Alias           tee -> Tee-Object
Alias           trcm -> Trace-Command
Alias           type -> Get-Content
Alias           wget -> Invoke-WebRequest
Alias           where -> Where-Object
Alias           wjb -> Wait-Job
Alias           write -> Write-Output

0x16 服务程序

Windows服务是在Microsoft Windows操作系统中运行的后台应用程序。服务是一种特殊类型的进程,它们被设计为在操作系统启动时自动启动,并在操作系统运行期间持续运行,即使用户没有登录到系统也是如此。这使得它们能够在系统背后执行各种任务,如网络通信、文件共享、打印管理、安全性等。

1. services.msc

win + r 中输入:

代码语言:javascript
复制
services.msc			# 打开“服务”面板

需要关注的点有:

1) 服务名称、描述等信息

服务描述是否为空,为空项需要重点查看关注下

服务名称是否有明显异常的,异常的需要关注一下

2) 可执行文件、参数、启动类型

点击服务项后,右键选择属性 -> 常规

关注 可执行文件启动参数启动类型

启动类型有以下几种

  • 自动 (延迟启动)
  • 自动
  • 手动
  • 禁用

自动(延迟启动)是介于自动启动和手动启动之间的一种选项。当一个服务被配置为自动(延迟启动)时,在系统启动时并不会立即启动该服务,而是会延迟一段时间后再启动。这个延迟时间是由操作系统进行动态调整的,以确保系统启动过程的平稳性和效率。

3) 启动失败默认操作

点击服务项后,右键选择属性 -> 恢复

这里定义了服务失败时触发的操作,如果设置的是运行一个程序,并且在图中运行程序处指定了非默认程序,则需要重点关注

4) 依存关系

点击服务项后,右键选择属性 -> 依存关系

可疑的服务需要关注依存关系,停止服务时可能需要将依存关系服务都需要停止,依存次服务的服务可能也是异常服务

2. SC 命令

sc.exe 是操作服务控制管理器的命令行程序,此处可以用来查询可疑服务的快捷操作,在cmd中输入:

代码语言:javascript
复制
sc 											# 直接列出参数列表
sc queryex							# 列出所有服务的扩展状态,包含可执行文件路径、可执行文件参数等
sc qc "ServiceName"			# 查询某项服务的配置信息

sc 如果想查询完整的所有信息似乎没有一个现成的指令,可以使用下面的 bat 来操作,设置服务名称

如果输出的文件中文乱码,尝试将第二行的 REM 去掉

代码语言:javascript
复制
@echo off
REM chcp 65001 > nul
setlocal

set "serviceName=ServiceName"
set "outputFile=service_info.txt"

REM 查询基本信息
echo === 基本信息 === >> %outputFile%
sc queryex %serviceName% >> %outputFile%

REM 查询详细信息
echo === 服务配置 === >> %outputFile%
sc qc %serviceName% >> %outputFile%

REM 查询描述信息
echo === 描述 === >> %outputFile%
sc qdescription %serviceName% >> %outputFile%

REM 查询故障恢复配置
echo === 故障恢复 === >> %outputFile%
sc qfailure %serviceName% >> %outputFile%

REM 查询触发器信息
echo === 触发器信息 === >> %outputFile%
sc qtriggerinfo %serviceName% >> %outputFile%

REM 查询安全描述
echo === 安全描述 === >> %outputFile%
sc sdshow %serviceName% >> %outputFile%

REM 查询服务SID
echo === 服务SID === >> %outputFile%
sc showsid %serviceName% >> %outputFile%

REM 打开输出文件
start notepad %outputFile%

endlocal
3. PowerShell

https://learn.microsoft.com/zh-cn/powershell/scripting/samples/managing-services?view=powershell-7.4

代码语言:javascript
复制
Get-Service

直接执行会显示所有的服务

这个信息可以用来对比被害系统是否有哪些默认不存在的服务

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  AJRouter           AllJoyn Router Service                
Stopped  ALG                Application Layer Gateway Service     
Stopped  AppIDSvc           Application Identity                  
Stopped  Appinfo            Application Information               
Stopped  AppMgmt            Application Management                
Stopped  AppReadiness       App Readiness                         
Stopped  AppVClient         Microsoft App-V Client                
Stopped  AppXSvc            AppX Deployment Service (AppXSVC)     
Stopped  AudioEndpointBu... Windows Audio Endpoint Builder        
Stopped  Audiosrv           Windows Audio                         
Stopped  AxInstSV           ActiveX Installer (AxInstSV)          
Running  BFE                Base Filtering Engine                 
Stopped  BITS               Background Intelligent Transfer Ser...
Running  BrokerInfrastru... Background Tasks Infrastructure Ser...
Stopped  Browser            Computer Browser                      
Stopped  bthserv            蓝牙支持服务                                
Stopped  CDPSvc             连接设备平台服务                              
Running  CDPUserSvc_448e2   CDPUserSvc_448e2                      
Stopped  CertPropSvc        Certificate Propagation               
Stopped  ClipSVC            Client License Service (ClipSVC)      
Running  COMSysApp          COM+ System Application               
Running  CoreMessagingRe... CoreMessaging                         
Running  CryptSvc           Cryptographic Services                
Stopped  CscService         Offline Files                         
Running  DcomLaunch         DCOM Server Process Launcher          
Stopped  DcpSvc             DataCollectionPublishingService       
Stopped  defragsvc          Optimize drives                       
Stopped  DeviceAssociati... Device Association Service            
Stopped  DeviceInstall      Device Install Service                
Stopped  DevQueryBroker     DevQuery Background Discovery Broker  
Running  Dhcp               DHCP Client                           
Stopped  diagnosticshub.... Microsoft (R) 诊断中心标准收集器服务             
Running  DiagTrack          Connected User Experiences and Tele...
Stopped  DmEnrollmentSvc    设备管理注册服务                              
Stopped  dmwappushservice   dmwappushsvc                          
Running  Dnscache           DNS Client                            
Stopped  dot3svc            Wired AutoConfig                      
Running  DPS                Diagnostic Policy Service             
Stopped  DsmSvc             Device Setup Manager                  
Stopped  DsSvc              Data Sharing Service                  
Stopped  Eaphost            Extensible Authentication Protocol    
Stopped  EFS                Encrypting File System (EFS)          
Stopped  embeddedmode       嵌入模式                                  
Stopped  EntAppSvc          Enterprise App Management Service     
Running  EventLog           Windows Event Log                     
Running  EventSystem        COM+ Event System                     
Stopped  fdPHost            Function Discovery Provider Host      
Stopped  FDResPub           Function Discovery Resource Publica...
Running  FontCache          Windows Font Cache Service            
Stopped  FrameServer        Windows Camera Frame Server           
Running  gpsvc              Group Policy Client                   
Stopped  hidserv            Human Interface Device Service        
Stopped  HvHost             HV 主机服务                               
Stopped  icssvc             Windows 移动热点服务                        
Stopped  IKEEXT             IKE and AuthIP IPsec Keying Modules   
Running  iphlpsvc           IP Helper                             
Running  KeyIso             CNG Key Isolation                     
Stopped  KPSSVC             KDC Proxy Server service (KPS)        
Stopped  KtmRm              KtmRm for Distributed Transaction C...
Running  LanmanServer       Server                                
Running  LanmanWorkstation  Workstation                           
Stopped  lfsvc              Geolocation Service                   
Running  LicenseManager     Windows 许可证管理器服务                      
Stopped  lltdsvc            Link-Layer Topology Discovery Mapper  
Running  lmhosts            TCP/IP NetBIOS Helper                 
Running  LSM                Local Session Manager                 
Stopped  MapsBroker         Downloaded Maps Manager               
Running  MpsSvc             Windows Firewall                      
Running  MSDTC              Distributed Transaction Coordinator   
Stopped  MSiSCSI            Microsoft iSCSI Initiator Service     
Stopped  msiserver          Windows Installer                     
Stopped  NcaSvc             Network Connectivity Assistant        
Running  NcbService         Network Connection Broker             
Stopped  Netlogon           Netlogon                              
Stopped  Netman             Network Connections                   
Running  netprofm           Network List Service                  
Stopped  NetSetupSvc        Network Setup Service                 
Stopped  NetTcpPortSharing  Net.Tcp Port Sharing Service          
Stopped  NgcCtnrSvc         Microsoft Passport Container          
Stopped  NgcSvc             Microsoft Passport                    
Running  NlaSvc             Network Location Awareness            
Running  nsi                Network Store Interface Service       
Running  OneSyncSvc_448e2   同步主机_448e2                            
Running  Parallels Coher... Parallels Coherence Service           
Running  Parallels Tools... Parallels Tools Service               
Running  PcaSvc             Program Compatibility Assistant Ser...
Stopped  PerfHost           Performance Counter DLL Host          
Stopped  PhoneSvc           Phone Service                         
Stopped  PimIndexMainten... Contact Data_448e2                    
Stopped  pla                Performance Logs & Alerts             
Running  PlugPlay           Plug and Play                         
Stopped  PolicyAgent        IPsec Policy Agent                    
Running  Power              Power                                 
Stopped  PrintNotify        Printer Extensions and Notifications  
Running  PrlVssProvider     PrlVssProvider                        
Running  ProfSvc            User Profile Service                  
Stopped  QWAVE              Quality Windows Audio Video Experience
Stopped  RasAuto            Remote Access Auto Connection Manager 
Stopped  RasMan             Remote Access Connection Manager      
Stopped  RemoteAccess       Routing and Remote Access             
Stopped  RemoteRegistry     Remote Registry                       
Stopped  RmSvc              无线电管理服务                               
Running  RpcEptMapper       RPC Endpoint Mapper                   
Stopped  RpcLocator         Remote Procedure Call (RPC) Locator   
Running  RpcSs              Remote Procedure Call (RPC)           
Stopped  RSoPProv           Resultant Set of Policy Provider      
Stopped  sacsvr             Special Administration Console Helper 
Running  SamSs              Security Accounts Manager             
Stopped  SCardSvr           Smart Card                            
Stopped  ScDeviceEnum       Smart Card Device Enumeration Service 
Running  Schedule           Task Scheduler                        
Stopped  SCPolicySvc        Smart Card Removal Policy             
Stopped  seclogon           Secondary Logon                       
Running  SENS               System Event Notification Service     
Stopped  SensorDataService  Sensor Data Service                   
Stopped  SensorService      Sensor Service                        
Stopped  SensrSvc           Sensor Monitoring Service             
Stopped  SessionEnv         Remote Desktop Configuration          
Stopped  SharedAccess       Internet Connection Sharing (ICS)     
Running  ShellHWDetection   Shell Hardware Detection              
Stopped  smphost            Microsoft Storage Spaces SMP          
Stopped  SNMPTRAP           SNMP Trap                             
Running  Spooler            Print Spooler                         
Stopped  sppsvc             Software Protection                   
Running  SSDPSRV            SSDP Discovery                        
Stopped  SstpSvc            Secure Socket Tunneling Protocol Se...
Running  StateRepository    State Repository Service              
Stopped  stisvc             Windows Image Acquisition (WIA)       
Running  StorSvc            Storage Service                       
Stopped  svsvc              Spot Verifier                         
Stopped  swprv              Microsoft Software Shadow Copy Prov...
Stopped  SysMain            Superfetch                            
Running  SystemEventsBroker System Events Broker                  
Stopped  TabletInputService Touch Keyboard and Handwriting Pane...
Stopped  TapiSrv            Telephony                             
Stopped  TermService        Remote Desktop Services               
Running  Themes             Themes                                
Stopped  TieringEngineSe... Storage Tiers Management              
Running  tiledatamodelsvc   Tile Data model server                
Running  TimeBrokerSvc      Time Broker                           
Running  TrkWks             Distributed Link Tracking Client      
Stopped  TrustedInstaller   Windows Modules Installer             
Stopped  tzautoupdate       自动时区更新程序                              
Running  UALSVC             User Access Logging Service           
Stopped  UevAgentService    User Experience Virtualization Service
Stopped  UI0Detect          Interactive Services Detection        
Stopped  UmRdpService       Remote Desktop Services UserMode Po...
Stopped  UnistoreSvc_448e2  User Data Storage_448e2               
Stopped  upnphost           UPnP Device Host                      
Stopped  UserDataSvc_448e2  User Data Access_448e2                
Running  UserManager        User Manager                          
Stopped  UsoSvc             Update Orchestrator Service for Win...
Running  VaultSvc           Credential Manager                    
Stopped  vds                Virtual Disk                          
Stopped  vmicguestinterface Hyper-V Guest Service Interface       
Stopped  vmicheartbeat      Hyper-V Heartbeat Service             
Stopped  vmickvpexchange    Hyper-V Data Exchange Service         
Stopped  vmicrdv            Hyper-V 远程桌面虚拟化服务                     
Stopped  vmicshutdown       Hyper-V Guest Shutdown Service        
Stopped  vmictimesync       Hyper-V Time Synchronization Service  
Stopped  vmicvmsession      Hyper-V PowerShell Direct Service     
Stopped  vmicvss            Hyper-V 卷影复制请求程序                      
Stopped  VSS                Volume Shadow Copy                    
Running  W32Time            Windows Time                          
Stopped  WalletService      WalletService                         
Stopped  WbioSrvc           Windows Biometric Service             
Running  Wcmsvc             Windows Connection Manager            
Stopped  WdiServiceHost     Diagnostic Service Host               
Stopped  WdiSystemHost      Diagnostic System Host                
Stopped  WdNisSvc           Windows Defender Network Inspection...
Stopped  Wecsvc             Windows Event Collector               
Stopped  WEPHOSTSVC         Windows Encryption Provider Host Se...
Stopped  wercplsupport      Problem Reports and Solutions Contr...
Stopped  WerSvc             Windows Error Reporting Service       
Stopped  WiaRpc             Still Image Acquisition Events        
Running  WinDefend          Windows Defender Service              
Running  WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running  Winmgmt            Windows Management Instrumentation    
Running  WinRM              Windows Remote Management (WS-Manag...
Stopped  wisvc              Windows 预览体验服务                        
Stopped  wlidsvc            Microsoft Account Sign-in Assistant   
Stopped  wmiApSrv           WMI Performance Adapter               
Stopped  WPDBusEnum         Portable Device Enumerator Service    
Running  WpnService         Windows 推送通知系统服务                      
Stopped  WpnUserService_... Windows 推送通知用户服务_448e2                
Stopped  WSearch            Windows Search                        
Running  wuauserv           Windows Update                        
Running  wudfsvc            Windows Driver Foundation - User-mo...
Stopped  XblAuthManager     Xbox Live 身份验证管理器                     
Stopped  XblGameSave        Xbox Live 游戏保存                        

powershell 查询起来就很容易进行筛选了,可以使用以下命令查看可以显示和筛选的项

代码语言:javascript
复制
Get-Service | Get-Member

选择显示的内容(以名称、执行命令行、显示名字、启动类型为例)

代码语言:javascript
复制
Get-Service | Select Name, ExecuteCommand, DisplayName, StartType

如果想以其中一项作为筛选条件,可以通过以下格式进行,以服务名称为例

代码语言:javascript
复制
Get-Service -Name "ServiceName"| Select Name, ExecuteCommand, DisplayName, StartType

经过测试,发现这个命令在 Windows Server 2016 上并不能获取到启动执行参数

所以这里写了两个脚本,获取所有服务的信息以及获取指定某个服务的信息

获取所有的服务信息

代码语言:javascript
复制
$services = Get-WmiObject -Class Win32_Service

foreach ($service in $services) {
    $serviceName = $service.Name
    $displayName = $service.DisplayName
    $description = $service.Description
    $binaryPath = $service.PathName
    $startParameters = [System.IO.Path]::GetFileName($binaryPath) -replace '"', '' -split ' '
    $startType = $service.StartMode
    # $failureActions = $service.FailureActions
    # $dependencies = $service.Dependencies

    Write-Host "--------------------------"
    Write-Host "服务名称:$serviceName"
    Write-Host "显示名称:$displayName"
    Write-Host "描述:$description"
    Write-Host "可执行文件路径:$binaryPath"
    Write-Host "启动类型:$startType"
    Write-Host "启动参数:"
    foreach ($parameter in $startParameters) {
        Write-Host "- $parameter"
    }
}

查询某个服务的信息

代码语言:javascript
复制
$serviceName = "ServiceName"
$service = Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"

# $serviceName = $service.Name
$displayName = $service.DisplayName
$description = $service.Description
$binaryPath = $service.PathName
$startParameters = [System.IO.Path]::GetFileName($binaryPath) -replace '"', '' -split ' '
$startType = $service.StartMode
# $failureActions = $service.FailureActions
# $dependencies = $service.Dependencies

Write-Host "--------------------------"
Write-Host "服务名称:$serviceName"
Write-Host "显示名称:$displayName"
Write-Host "描述:$description"
Write-Host "可执行文件路径:$binaryPath"
Write-Host "启动类型:$startType"
Write-Host "启动参数:"
foreach ($parameter in $startParameters) {
    Write-Host "- $parameter"
}

4. wmic
代码语言:javascript
复制
wmic service

这样会显示出所有服务的所有信息,比较乱套,尝试选择部分写入到 CSV 文件中

代码语言:javascript
复制
wmic service get Name, DisplayName, Description, PathName, StartMode, StartName /FORMAT:CSV > services.csv

是以逗号为分隔符号的 CSV 文件,使用 Excel 打开需要设定分隔符为逗号

第一行会出现空行,可以删除掉,这样方便筛选

如果只想查询某一项服务

代码语言:javascript
复制
wmic service where "Name='ServiceName'" get Name, DisplayName, Description, PathName, StartMode, StartName
5. 注册表
1) 服务列表
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
代码语言:javascript
复制
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

这获取得多快你说

有几个注册表项可以设置服务在启动期间自动启动,默认在系统上并不存在

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices

【 Windows Service 2016 】默认情况

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Data
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Networking
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Networking 4.0.0.0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET Data Provider for Oracle
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET Data Provider for SqlServer
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET Memory Cache 4.0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NETFramework
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1394ohci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\3ware
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AcpiDev
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\acpiex
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\acpipagr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AcpiPmi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\acpitime
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ADOVMPPackage
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ADP80XX
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\adsi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ahcache
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AJRouter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ALG
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AmdK8
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AmdPPM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\amdsata
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\amdsbs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\amdxata
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppID
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppIDSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Appinfo
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\applockerfltr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppMgmt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppReadiness
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppVClient
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppvStrm
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppvVemgr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppvVfs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppXSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\arcsas
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AsyncMac
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\atapi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AudioEndpointBuilder
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Audiosrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AxInstSV
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\b06bdrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BasicDisplay
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BasicRender
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BattC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bcmfn
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bcmfn2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Beep
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bfadfcoei
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bfadi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BITS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bowser
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BrokerInfrastructure
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bthserv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\buttonconverter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bxfcoe
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bxois
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CapImg
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\cdfs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CDPSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CDPUserSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CDPUserSvc_448e2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\cdrom
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertPropSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\cht4iscsi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\cht4vbd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CLFS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ClipSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\clreg
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\clr_optimization_v4.0.30319_32
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\clr_optimization_v4.0.30319_64
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CmBatt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CNG
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\cnghwassist
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CompositeBus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\COMSysApp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\condrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CoreMessagingRegistrar
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CoreUI
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\crypt32
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CryptSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CSC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CscService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dam
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DCLocator
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DcomLaunch
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DcpSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\defragsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DeviceAssociationService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DeviceInstall
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DevQueryBroker
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dfsc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\diagnosticshub.standardcollector.service
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DiagTrack
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DmEnrollmentSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dmvsc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dmwappushservice
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dot3svc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DPS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DsmSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DsSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DXGKrnl
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\e1iexpress
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eaphost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ebdrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EFS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EhStorClass
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EhStorTcgDrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\elxfcoe
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\elxstor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\embeddedmode
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EntAppSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ErrDev
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ESENT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventSystem
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\exfat
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fastfat
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fcvsc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fdc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fdPHost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FDResPub
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileCrypt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileInfo
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Filetrace
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\flpydisk
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FltMgr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FontCache
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FrameServer
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FsDepends
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Fs_Rec
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\gencounter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\genericusbfn
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\GPIOClx0101
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\gpsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\GpuEnergyDrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HDAudBus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HidBatt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HidBth
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hidinterrupt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hidserv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HidUsb
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HomeGroupListener
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HpSAMD
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HvHost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hvservice
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hwpolicy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hyperkbd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HyperVideo
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaLPSSi_GPIO
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaLPSSi_I2C
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaStorAV
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaStorV
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ibbus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\icssvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IKEEXT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IndirectKmd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\inetaccs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\intelide
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\intelpep
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\intelppm
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iorate
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IpFilterDriver
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iphlpsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPMIDRV
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPNAT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPsecGW
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\isapnp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iScsiPrt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdclass
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kdnic
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KeyIso
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KPSSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KSecDD
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KSecPkg
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ksthunk
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KtmRm
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ldap
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lfsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LicenseManager
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lltdio
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lltdsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lmhosts
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lsa
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LSI_SAS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LSI_SAS2i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LSI_SAS3i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LSI_SSS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LSM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\luafv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MapsBroker
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\megasas
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\megasas2i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\megasr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mlx4_bus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MMCSS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Modem
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\monitor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mouclass
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mouhid
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mountmgr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mpsdrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MpsSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mrxsmb
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mrxsmb10
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mrxsmb20
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MsBridge
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC Bridge 4.0.0.0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Msfs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\msgpiowin32
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mshidkmdf
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mshidumdf
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\msisadrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSiSCSI
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\msiserver
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MsLbfoProvider
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MsLldp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MsRPC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSCNTRS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mssmbios
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MTConfig
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mup
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mvumis
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\napagent
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NcaSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NcbService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ndfltr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NDIS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NdisCap
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NdisImPlatform
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NdisTapi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Ndisuio
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NdisVirtualBus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NdisWan
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ndiswanlegacy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ndproxy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBIOS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetbiosSmb
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netman
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\netprofm
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetSetupSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetTcpPortSharing
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\netvsc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\netvscvfpp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NgcCtnrSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NgcSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Npfs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\npsvctrig
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nsi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nsiproxy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTFS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Null
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nvraid
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nvstor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OneSyncSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OneSyncSvc_448e2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parallels Coherence Service
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parallels Tools Service
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\partmgr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PcaSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pciide
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pcmcia
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pcw
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pdc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PEAUTH
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\percsas2i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\percsas3i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfDisk
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfHost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfNet
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfOS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PhoneSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PimIndexMaintenanceSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PimIndexMaintenanceSvc_448e2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pla
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PlugPlay
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PortProxy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Power
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PptpMiniport
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PrintNotify
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PrlVssProvider
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_boot
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_dd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_fs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_memdev
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_mouf
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_strg
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\prl_tg
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Processor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ProfSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Psched
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ql2300i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ql40xx2i
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\qlfcoei
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\QWAVE
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\QWAVEdrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasAcd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasAgileVpn
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasAuto
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasGre
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rasl2tp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasPppoe
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasSstp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rdbss
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RDMANDK
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rdpbus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RDPDR
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RDPNP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RDPUDD
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RdpVideoMiniport
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ReFS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ReFSv1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RegFilter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteRegistry
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RmSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcLocator
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RSoPProv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rspndr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\s3cap
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sacdrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sacsvr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SamSs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sbp2port
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SCardSvr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ScDeviceEnum
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\scfilter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\scmbus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\scmdisk0101
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SCPolicySvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sdbus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sdstor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\seclogon
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SENS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SensorDataService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SensorService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SensrSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SerCx
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SerCx2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serenum
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sermouse
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SessionEnv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sfloppy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ShellHWDetection
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SiSRaid2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SiSRaid4
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\smbdirect
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\smphost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SMSvcHost 4.0.0.0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMPTRAP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\spaceport
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SpbCx
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\spldr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Spooler
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sppsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\srv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\srv2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\srvnet
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SSDPSRV
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SstpSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\StateRepository
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stexstor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stisvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storflt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stornvme
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storqosflt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\StorSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storufs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storvsc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\svsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\swenum
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\swprv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Synth3dVsc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SysMain
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SystemEventsBroker
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TabletInputService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TapiSrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP6TUNNEL
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpipreg
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIPTUNNEL
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tdx
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\terminpt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Themes
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TieringEngineService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tiledatamodelsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TimeBrokerSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TPM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TrkWks
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TrustedInstaller
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSDDD
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TsUsbFlt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TsUsbGD
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tsusbhub
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tunnel
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tzautoupdate
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UALSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UASPStor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UcmCx0101
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UcmTcpciCx0101
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UcmUcsi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Ucx01000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UdeCx
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\udfs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UEFI
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UevAgentDriver
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UevAgentService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Ufx01000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UfxChipidea
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ufxsynopsys
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UGatherer
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UGTHRSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UI0Detect
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\umbus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UmPass
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UmRdpService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UnistoreSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UnistoreSvc_448e2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\upnphost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UrsChipidea
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UrsCx01000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UrsSynopsys
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbccgp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbehci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbhub
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBHUB3
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbohci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbprint
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbser
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbuhci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBXHCI
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UserDataSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UserDataSvc_448e2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UserManager
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsoSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VaultSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vdrvroot
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vds
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VerifierExt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vhdmp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vhf
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmbus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VMBusHID
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmgid
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmicguestinterface
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmicheartbeat
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmickvpexchange
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmicrdv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmicshutdown
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmictimesync
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmicvmsession
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmicvss
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\volmgr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\volmgrx
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\volsnap
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\volume
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vpci
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vsmraid
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSTXRAID
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vwifibus
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WacomPen
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WalletService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wanarp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wanarpv6
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WbioSrvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wcifs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wcmsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wcncsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wcnfs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdBoot
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wdf01000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdFilter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdiServiceHost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdiSystemHost
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdNisDrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdNisSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wecsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WEPHOSTSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wercplsupport
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WerSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WFPLWFS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WiaRpc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WIMMount
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinDefend
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Windows Workflow Foundation 4.0.0.0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WindowsTrustedRT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WindowsTrustedRTProxy
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinHttpAutoProxySvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinMad
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winmgmt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinNat
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinRM
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WINUSB
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinVerbs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wisvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WlanSvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wlidsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WmiAcpi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WmiApRpl
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wmiApSrv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wof
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\workerdd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WPDBusEnum
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WpdUpFltr
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WpnService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WpnUserService
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WpnUserService_448e2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ws2ifsl
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WSearch
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WSearchIdxPi
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WudfPf
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WUDFRd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wudfsvc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XblAuthManager
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XblGameSave
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xboxgip
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xinputhid
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xmlprov

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XblGameSave 为例

代码语言:javascript
复制
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XblGameSave
2) Performance

每个服务的注册表项都可以包含一个子项 Performance 用于监控服务的执行,部分 Windows 系统存在关于此项的 1day

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Data\Performance

排查思路就是把服务的所有注册表项中包含 Performance 子项的,获取 Library 键的值,验证文件签名

通过 powershell 来完成

代码语言:javascript
复制
# 定义函数来进行签名校验
function Verify-FileSignature {
    param (
        [Parameter(Mandatory=$true)]
        [ValidateScript({Test-Path $_ -PathType Leaf})]
        [string]$FilePath
    )
    
    if (Test-Path -Path $FilePath -PathType Leaf) {
        $signature = Get-AuthenticodeSignature -FilePath $FilePath
        if ($signature.Status -eq 'Valid') {
            return "Valid"
        } else {
            return "Invalid"
        }
    } else {
        return "File Not Found"
    }
}

# 定义函数来检查注册表地址
function Check-RegistryPaths {
    param (
        [Parameter(Mandatory=$true)]
        [string[]]$RegistryPaths
    )

    $invalidSignatures = @()

    foreach ($registryPath in $RegistryPaths) {
        if (Test-Path -Path $registryPath) {
            $subkeys = Get-ChildItem -Path $registryPath
            foreach ($subkey in $subkeys) {
                $performancePath = Join-Path -Path $subkey.PSPath -ChildPath "Performance"
                if (Test-Path -Path $performancePath) {
                    $libraryValue = (Get-ItemProperty -Path $performancePath -Name "Library" -ErrorAction SilentlyContinue)."Library"
                    if ($libraryValue) {
                        $binaryFilePath = $libraryValue.Trim().Trim('"')
                        $binaryFilePath = [Environment]::ExpandEnvironmentVariables($binaryFilePath)
                        if (Test-Path $binaryFilePath) {
                            $result = Verify-FileSignature -FilePath $binaryFilePath
                            if ($result -eq "Invalid") {
                                $invalidSignatures += @{
                                    RegistryPath = $subkey
                                    BinaryFilePath = $binaryFilePath
                                } 
                                Write-Host "Signature is invalid for file: $binaryFilePath" -ForegroundColor Red
                            } elseif ($result -eq "Valid") {
                                Write-Host "Signature is valid for file: $binaryFilePath " -ForegroundColor Green
                            }
                        } else {
                            $dllFileName = Split-Path -Leaf $binaryFilePath
                            $found = $false
                            $searchPaths = @(
                                (Join-Path -Path $env:SystemRoot -ChildPath $dllFileName),
                                (Join-Path -Path $env:SystemRoot -ChildPath "System32\$dllFileName")
                            )
                            foreach ($path in $searchPaths) {
                                if (Test-Path $path) {
                                    $found = $true
                                    $result = Verify-FileSignature -FilePath $path
                                    if ($result -eq "Invalid") {
                                        $invalidSignatures += @{
                                            RegistryPath = $subkey
                                            BinaryFilePath = $path
                                        }
                                        Write-Host "Signature is invalid for file: $path" -ForegroundColor Red
                                    } elseif ($result -eq "Valid") {
                                        Write-Host "Signature is valid for file: $path " -ForegroundColor Green
                                    }
                                    break
                                }
                            }
                            if (-not $found) {
                                Write-Host "Could not find file '$dllFileName' in default search paths. Skipping signature verification."  -ForegroundColor Yellow
                            }
                        }
                    } else {
                        Write-Host "Binary file path is empty for subkey $($subkey.PSChildName)."  -ForegroundColor Yellow
                    }
                }
            }
        }
    }

    # 打印不通过的签名验证信息
    if ($invalidSignatures.Count -gt 0) {
        Write-Output ""
        Write-Output ""
        Write-Output "--------------------------------------------------------"
        Write-Host "Invalid signatures:" -ForegroundColor Red
        foreach ($invalidSignature in $invalidSignatures) {
            $registryPath = $invalidSignature.RegistryPath
            $binaryFilePath = $invalidSignature.BinaryFilePath
            Write-Host "Registry path: $registryPath" -ForegroundColor Yellow
            Write-Host "Binary file path: $binaryFilePath" -ForegroundColor Yellow
            Write-Output ""
        }
        Write-Output "--------------------------------------------------------"
    }
}

# 要检查的注册表地址数组
$registryPaths = @(
    "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\"
)

# 调用函数进行检查
Write-Host "Starting signature verification..."

Check-RegistryPaths -RegistryPaths $registryPaths

Write-Host "Signature verification completed."

如果检测发现存在系统默认不存在的可执行文件或者 DLL ,需要与开发人员确认,并通过沙箱或者杀毒软件进行排查

【 Windows Server 2016 】默认情况

3) ServiceDll

服务启动部分是由 Windows 直接启动的,还有一部分是通过 svchost.exe 启动的

svchost.exe 是一个通用的 Windows 进程,用于托管和执行多个系统服务。它负责启动和管理在计算机上运行的许多服务。

以下是 svchost.exe 启动服务的工作原理:

  1. 服务注册:每个服务都在注册表中的特定位置注册,指定了服务的名称、可执行文件路径和其他相关信息。
  2. svchost.exe 根据注册表信息:当计算机启动时,操作系统读取注册表中的服务配置信息,并确定哪些服务需要由 svchost.exe 托管。
  3. 创建 svchost.exe 进程:根据注册表中的配置信息,操作系统创建一个或多个 svchost.exe 进程,并为每个进程分配一个唯一的服务组标识。
  4. 加载 DLL:每个 svchost.exe 进程根据其服务组标识加载相应的 DLL(动态链接库),这些 DLL 包含了实际的服务代码和逻辑。
  5. 启动服务:svchost.exe 进程加载服务所需的 DLL 后,会启动和执行每个服务。每个服务在 svchost.exe 进程中以独立的线程运行。

这么多服务要通过 svchost.exe 来启动,所以 svchost.exe 按照这些服务的特征将其进行了分组

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost

但是这里是不会直接记录组内成员的服务 DLL 的,这些 DLL 记录在哪里呢?

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<servicename>\Parameters\

在每个服务以上注册表位置的 ServiceDll 键对应的值

Parametersv6 键,它并不是一个固定的键,而是一种命名约定。Parametersv6 是用于区分不同版本的参数键,特别是在区分适用于 IPv6 的参数与适用于 IPv4 的参数时。

经过搜索,Windows Server 2016 中所有的默认服务注册表项只有 Dhcp 包含 Parametersv6 ,所以就不做为查询特征了

所以这部分排查就是将所有服务注册表中包含 Parameters 子项的所有的 ServiceDll 中指定的可执行程序验证签名

还是通过 powershell 进行排查

代码语言:javascript
复制
# 定义函数来进行签名校验
function Verify-FileSignature {
    param (
        [Parameter(Mandatory=$true)]
        [ValidateScript({Test-Path $_ -PathType Leaf})]
        [string]$FilePath
    )
    
    if (Test-Path -Path $FilePath -PathType Leaf) {
        $signature = Get-AuthenticodeSignature -FilePath $FilePath
        if ($signature.Status -eq 'Valid') {
            return "Valid"
        } else {
            return "Invalid"
        }
    } else {
        return "File Not Found"
    }
}

# 定义函数来检查注册表地址
function Check-RegistryPaths {
    param (
        [Parameter(Mandatory=$true)]
        [string[]]$RegistryPaths
    )

    $invalidSignatures = @()

    foreach ($registryPath in $RegistryPaths) {
        if (Test-Path -Path $registryPath) {
            $subkeys = Get-ChildItem -Path $registryPath
            foreach ($subkey in $subkeys) {
                $ParametersPath = Join-Path -Path $subkey.PSPath -ChildPath "Parameters"
                if (Test-Path -Path $ParametersPath) {
                    $libraryValue = (Get-ItemProperty -Path $ParametersPath -Name "ServiceDll" -ErrorAction SilentlyContinue)."ServiceDll"
                    if ($libraryValue) {
                        $binaryFilePath = $libraryValue.Trim().Trim('"')
                        $binaryFilePath = [Environment]::ExpandEnvironmentVariables($binaryFilePath)
                        if (Test-Path $binaryFilePath) {
                            $result = Verify-FileSignature -FilePath $binaryFilePath
                            if ($result -eq "Invalid") {
                                $invalidSignatures += @{
                                    RegistryPath = $subkey
                                    BinaryFilePath = $binaryFilePath
                                } 
                                Write-Host "Signature is invalid for file: $binaryFilePath" -ForegroundColor Red
                            } elseif ($result -eq "Valid") {
                                Write-Host "Signature is valid for file: $binaryFilePath " -ForegroundColor Green
                            }
                        } else {
                            $dllFileName = Split-Path -Leaf $binaryFilePath
                            $found = $false
                            $searchPaths = @(
                                (Join-Path -Path $env:SystemRoot -ChildPath $dllFileName),
                                (Join-Path -Path $env:SystemRoot -ChildPath "System32\$dllFileName")
                            )
                            foreach ($path in $searchPaths) {
                                if (Test-Path $path) {
                                    $found = $true
                                    $result = Verify-FileSignature -FilePath $path
                                    if ($result -eq "Invalid") {
                                        $invalidSignatures += @{
                                            RegistryPath = $subkey
                                            BinaryFilePath = $path
                                        }
                                        Write-Host "Signature is invalid for file: $path" -ForegroundColor Red
                                    } elseif ($result -eq "Valid") {
                                        Write-Host "Signature is valid for file: $path " -ForegroundColor Green
                                    }
                                    break
                                }
                            }
                            if (-not $found) {
                                Write-Host "Could not find file '$dllFileName' in default search paths. Skipping signature verification."  -ForegroundColor Yellow
                            }
                        }
                    } else {
                        Write-Host "Binary file path is empty for subkey $($subkey.PSChildName)."  -ForegroundColor Yellow
                    }
                }
            }
        }
    }

    # 打印不通过的签名验证信息
    if ($invalidSignatures.Count -gt 0) {
        Write-Output ""
        Write-Output ""
        Write-Output "--------------------------------------------------------"
        Write-Host "Invalid signatures:" -ForegroundColor Red
        foreach ($invalidSignature in $invalidSignatures) {
            $registryPath = $invalidSignature.RegistryPath
            $binaryFilePath = $invalidSignature.BinaryFilePath
            Write-Host "Registry path: $registryPath" -ForegroundColor Yellow
            Write-Host "Binary file path: $binaryFilePath" -ForegroundColor Yellow
            Write-Output ""
        }
        Write-Output "--------------------------------------------------------"
    }
}

# 要检查的注册表地址数组
$registryPaths = @(
    "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\"
)

# 调用函数进行检查
Write-Host "Starting signature verification..."

Check-RegistryPaths -RegistryPaths $registryPaths

Write-Host "Signature verification completed."

如果检测发现存在系统默认不存在的可执行文件或者 DLL ,需要与开发人员确认,并通过沙箱或者杀毒软件进行排查

【 Windows Server 2016 】默认情况

6. System Informer

https://systeminformer.sourceforge.io/ Process Hacker 的升级版

属性里可以看到服务的类型

按照执行方式和运行上下文进行分类,有以下几个常见的服务类型

  • 内核驱动程序(Kernel Driver):内核驱动程序是在操作系统内核级别运行的服务,用于提供对硬件设备或系统资源的访问和控制。这些驱动程序通常提供底层的系统功能和硬件驱动。
  • 文件系统驱动程序(File System Driver):文件系统驱动程序是一种特殊类型的内核驱动程序,用于管理和处理文件系统的操作。它们负责将文件和目录的操作转化为物理存储设备上的读写操作。
  • 独立进程(Own Process):独立进程服务以其自己的进程运行,每个服务实例都有自己的进程空间。这意味着每个服务实例都在单独的进程中运行,并且具有独立的内存空间。
  • 共享进程(Share Process):共享进程服务以与其他服务共享的进程中运行。多个服务实例可以在同一个进程中运行,共享进程资源和内存空间。这种共享可以减少系统资源的使用。

而且可以看到 Permissions ,也就是权限

这里定义了服务的权限,网络上很多文章都是通过设置所有用户/用户组均不可以查询、更改服务,导致这些查询方法查询失败

7. Autoruns

Autoruns 是 SysinternalsSuite 套件中一款工具,可以很方便查看包括计划任务等启动项排查

https://learn.microsoft.com/zh-cn/sysinternals/downloads/sysinternals-suite

8. 系统信息(msinfo32)

不知道这个程序是从哪代 Windows 加进来的,可以查看的信息不少

win + r 之后输入 msinfo32 或者直接搜索系统信息

9. 排查隐藏的服务

针对仅通过 SDDL 进行权限控制的方式隐藏的,可以执行以下 powershell 检查

代码语言:javascript
复制
$services = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" | ForEach-Object { $_.PSChildName }

$maliciousServices = foreach ($service in $services) {
    $queryOutput = sc.exe query $service 2>&1

    if ($queryOutput -like "*拒绝访问*") {
        $configOutput = sc.exe qc $service

        [PSCustomObject]@{
            ServiceName = $service
            Status = "拒绝访问"
            Config = $configOutput
        }
    }
}

if ($maliciousServices) {
    Write-Host "发现以下恶意服务:"
    $maliciousServices | Format-Table -AutoSize -Property ServiceName, Status

    foreach ($service in $maliciousServices) {
        Write-Host "--------------------------------------------------"
        Write-Host "Service Name: $($service.ServiceName)"
        Write-Host "Status: $($service.Status)"
        Write-Host "Service Config:"
        $configLines = $service.Config -split "`n"
        $configLines | ForEach-Object {
            $configLine = $_.Trim()
            if ($configLine -ne "" -and $configLine -notlike "[*]*") {
                Write-Host $configLine
            }
        }
        Write-Host "--------------------------------------------------"
    }
} else {
    Write-Host "未发现恶意服务."
}

在此基础上删除了注册表的隐藏任务主要通过日志进行排查

详细的排查与处置可以查看 知识点附录 -> 0x12 服务隐藏与排查

10. 进阶性排查

排查所有的服务的启动文件签名情况,部分攻击者可能利用权限配置的不合理,通过替换服务启动的应用程序进行提权或者权限维持

代码语言:javascript
复制
$services = Get-WmiObject -Class Win32_Service | Where-Object { $_.PathName -ne $null }
foreach ($service in $services) {
    $executablePath = $service.PathName
    if ($executablePath.StartsWith('"')) {
        $executablePath = $executablePath.Split('"')[1]
    } else {
        $executablePath = $executablePath.Split(' ')[0]
    }
   
    if ($executablePath -ne $null) {
        $fileInfo = Get-Item -LiteralPath $executablePath
        $signatureStatus = Get-AuthenticodeSignature -FilePath $executablePath | Select-Object -ExpandProperty Status
        if ($signatureStatus -ne 'Valid') {
            Write-Host "---------------------------------------"
            Write-Host "Service Name: $($service.Name)"
            Write-Host "Executable Path: $executablePath"
            Write-Host "Signature Status: $signatureStatus"
            Write-Host ""
        }
    }
}

【 Windows Server 2016 】默认情况

0x17 远程桌面 RDP

1. 注册表查询 RDP 记录

所有本机连接过的远程桌面RDP,都会在注册表内记录,所以可以通过注册表进行排查RDP信息:

代码语言:javascript
复制
//注册表具体路径
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers
//命令查询,相关注册表内会包含登陆账号信息
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" && reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers"

同时RDP还会存在Default.rdp文件,是最后一次连接的信息,双击打开即可看到

代码语言:javascript
复制
C:\Users\{username}\Documents\Default.rdp

也可以直接打开 mstsc

直接查看

Windows Server 2016 默认并不会记录全所有的 RDP 连接其他服务器的信息,每台服务器只会记录最后一次登录的账户信息

0x18 DLL 检查

在安全模式下 DLL 搜索顺序如下

  1. DLL 重定向
  2. API sets
  3. SxS manifest redirection
  4. Loaded-module list
  5. Known DLLs
  6. 流程的包依赖关系图 (Windows 11,版本 21H2 (10.0;内部版本 22000) 及更高版本
  7. 应用程序的文件夹
  8. 系统文件夹 (C:\Windows\System32) 使用 GetSystemDirectoryA 函数检索此文件夹的路径
  9. 16 位系统文件夹 (C:\Windows\System) 没有获取此文件夹路径的函数,但会对其进行搜索
  10. Windows 文件夹 (C:\Windows) 使用 GetWindowsDirectoryA 函数获取此文件夹的路径
  11. 当前文件夹
  12. 环境变量中列出的 PATH 目录

这里要说两个

  • Loaded-module list 系统可以检查是否已将具有相同模块名称的 DLL 加载到内存加载的
  • Known DLLs 如果 DLL 位于运行应用程序的 Windows 版本的已知 DLL 列表中,则系统会使用其已知 DLL

参考文章 https://learn.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order

DLL 排查其实分散在常规安全检查的各种部分

1. DLL 劫持

系统已经存在的进程是否已经被 DLL 劫持不是很容易检测,建议可以使用安全防护软件进行全盘扫描检测

本部分主要从以下两个角度

  • DLL 劫持经常使用的注册表是否被修改
  • 某个程序是否存在 DLL 劫持漏洞

DLL 劫持经常使用的方式是根据 DLL 加载顺序进行劫持,这里涉及一个很重要的注册表项

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode

SafeDllSearchMode的值为0或未设置时,系统采用默认的搜索策略,即先在应用程序所在目录搜索 DLL 文件,然后在系统目录(如C:\Windows\System32)和系统路径(如PATH环境变量所指定的路径)中搜索。

然而,当SafeDllSearchMode的值为1时,系统将启用安全的 DLL 搜索模式。在安全模式下,系统会忽略应用程序所在目录,只在系统目录和系统路径中搜索 DLL 文件。这种行为旨在防止恶意 DLL 文件的劫持和欺骗。

参考文章 https://www.cnblogs.com/bmjoker/p/11031238.html

【 Windows Server 2016 】默认情况

Windows Server 2016 默认没有这个注册表项了

可以通过 rattler 检查某个程序是否存在 DLL 劫持漏洞

https://github.com/sensepost/rattler

这里需要注意,检测过程中会启动被检测的应用程序,请在隔离的虚拟机里测试

2. DLL 注入

DLL注入涉及的注册表项是AppInit_DLLs。它是一个注册表键值,AppInit_DLLs 注册表项的作用是指示操作系统在每个用户登录时加载指定的 DLL 文件

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows中 Appinit_Dlls 的值

【 Windows Server 2016 】默认情况

AppInit_DLLs键的值是空的

3. KnownDLLs
代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

这个注册表用于指定系统已知的DLL文件列表。

在该注册表项中,每个子项对应一个已知的DLL文件,并且以DLL文件的名称作为子项的名称。例如,如果有一个名为 kernel32.dll 的子项,那么该子项指示系统已知并信任 kernel32.dll 这个DLL文件。

该注册表项的目的是为了提高系统的安全性。当应用程序需要加载一个DLL文件时,系统会首先检查该DLL文件是否在 KnownDLLs 注册表项中。如果是,系统将直接从指定的位置加载该DLL文件,而不会去搜索路径或其他目录。

也可以通过 Autoruns 进行查看

【 Windows Server 2016 】默认情况

右键导出为 reg 结果如下

代码语言:javascript
复制
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs]
"_Wow64"="Wow64.dll"
"_Wow64cpu"="Wow64cpu.dll"
"_Wow64win"="Wow64win.dll"
"advapi32"="advapi32.dll"
"clbcatq"="clbcatq.dll"
"combase"="combase.dll"
"COMDLG32"="COMDLG32.dll"
"coml2"="coml2.dll"
"DifxApi"="difxapi.dll"
"gdi32"="gdi32.dll"
"gdiplus"="gdiplus.dll"
"IMAGEHLP"="IMAGEHLP.dll"
"IMM32"="IMM32.dll"
"kernel32"="kernel32.dll"
"LPK"="LPK.dll"
"MSCTF"="MSCTF.dll"
"MSVCRT"="MSVCRT.dll"
"NORMALIZ"="NORMALIZ.dll"
"NSI"="NSI.dll"
"ole32"="ole32.dll"
"OLEAUT32"="OLEAUT32.dll"
"PSAPI"="PSAPI.DLL"
"rpcrt4"="rpcrt4.dll"
"sechost"="sechost.dll"
"Setupapi"="Setupapi.dll"
"SHELL32"="SHELL32.dll"
"SHLWAPI"="SHLWAPI.dll"
"user32"="user32.dll"
"WLDAP32"="WLDAP32.dll"
"WS2_32"="WS2_32.dll"

应急响应过程中可以看看是否有缺少的

0x19 WMI 排查

WMI 主要是创建 WMI 事件订阅实现持续控制,通常事件订阅是临时性的,会话结束后就会停止,WMI永久事件订阅,可以创建长期有效的订阅,即使订阅会话已经结束,订阅仍然持续存在。

WMI 事件订阅中有三个角色

  • 事件过滤器(Event Filter):事件过滤器定义了订阅的事件条件。它指定了需要监听的WMI对象或类以及要监控的属性或方法的条件。事件过滤器使用WMI查询语言(WQL)来描述事件的筛选条件。
  • 事件消费者(Event Consumer):事件消费者定义了在事件发生时要执行的操作。它可以是一个命令行、脚本或可执行文件,也可以是自定义的WMI操作。事件消费者根据事件的特定属性执行相应的操作。
  • 绑定(Binding):绑定将事件过滤器和事件消费者连接起来,以建立订阅关系。绑定将事件过滤器与事件消费者相关联,使得在事件满足过滤器条件时,相应的事件消费者将被触发执行。

这听起来很像是 if...then 或者说信号与槽

攻击者通过事件过滤器定义要监听的操作,之后再定义监听到操作后要执行的动作,最后将两者绑定起来

排查思路就是找出当前系统所有命名空间的过滤器、消费者、绑定

经过测试发现,\root\subscription\root\DEFAULT 两个命名空间均可以实现事件订阅后门,这在很多文章中并未提及,大家需要额外注意

部分文章指出 Autoruns 删除 WMI 后门效果不好,这不严谨,详情可以看后续部分

1. wmic

查询过滤器

代码语言:javascript
复制
wmic /namespace:"\\root\subscription" path __EventFilter get *
wmic /namespace:"\\root\DEFAULT" path __EventFilter get *

查询消费者

代码语言:javascript
复制
wmic /namespace:"\\root\subscription" path __EventConsumer get *
wmic /namespace:"\\root\DEFAULT" path __EventConsumer get *

查询绑定

代码语言:javascript
复制
wmic /namespace:"\\root\subscription" path __FilterToConsumerBinding get *
wmic /namespace:"\\root\DEFAULT" path __FilterToConsumerBinding get *

wmic 显示的内容实在是格式比较差,推荐使用 powershell 来调用 WMI 相关的模块进行查询,wmic 作为辅助

【 Windows Server 2016 】默认情况

\root\subscription

过滤器

消费者

绑定

\root\DEFAULT

过滤器

消费者

绑定

2. powershell

查询过滤器

代码语言:javascript
复制
Get-WmiObject -Namespace "root\subscription" -Query "SELECT * FROM __EventFilter"
Get-WmiObject -Namespace "root\DEFAULT" -Query "SELECT * FROM __EventFilter"

查询消费者

代码语言:javascript
复制
Get-WmiObject -Namespace "root\subscription" -Query "SELECT * FROM __EventConsumer"
Get-WmiObject -Namespace "root\DEFAULT" -Query "SELECT * FROM __EventConsumer"

查询绑定

代码语言:javascript
复制
Get-WmiObject -Namespace "root\subscription" -Class "__FilterToConsumerBinding"
Get-WmiObject -Namespace "root\DEFAULT" -Query "SELECT * FROM __EventConsumer"

当然,我给大家准备了脚本一键查询

代码语言:javascript
复制
$namespaces = @("root\subscription", "root\DEFAULT")

foreach ($nameSpace in $namespaces) {
    $filterInstances = Get-WmiObject -Namespace "$nameSpace" -Query "SELECT * FROM __EventFilter"
    $consumerInstances = Get-WmiObject -Namespace "$nameSpace" -Query "SELECT * FROM __EventConsumer"
    $bindings = Get-WmiObject -Namespace "$nameSpace" -Class "__FilterToConsumerBinding"

    Write-Host "【 NameSpace: $nameSpace 】"
    Write-Host "-------------------------"
    Write-Host "Event Filters:"
    Write-Host "-----------------"
    foreach ($filter in $filterInstances) {
        $filterName = $filter.Name
        $filterQuery = $filter.Query
        Write-Host "Filter Name: $filterName"
        Write-Host "Query: $filterQuery"
        Write-Host ""
    }

    Write-Host "Event Consumers:"
    Write-Host "-----------------"
    foreach ($consumer in $consumerInstances) {
        $consumerName = $consumer.Name
        $consumerCommandLine = $consumer.CommandLineTemplate
        $consumerTemplate = $consumer.ExecutablePath
        Write-Host "Consumer Name: $consumerName"
        Write-Host "Command Line: $consumerCommandLine"
        Write-Host "Template: $consumerTemplate"
        Write-Host ""
    }

    Write-Host "Bindings:"
    Write-Host "-----------------"
    foreach ($binding in $bindings) {
        $filterPath = $binding.Filter
        $consumerPath = $binding.Consumer

        $filter = $filterInstances | Where-Object { $_.__RELPATH -eq $filterPath }
        $consumer = $consumerInstances | Where-Object { $_.__RELPATH -eq $consumerPath }

        if ($filter -and $consumer) {
            $filterName = $filter.Name
            $consumerName = $consumer.Name

            Write-Host "Binding: "
            Write-Host "Filter Name: $filterName"
            Write-Host "Consumer Name: $consumerName"
            Write-Host ""
        }
    }
}

【 Windows Server 2016 】默认情况

过滤器

消费者

绑定

脚本执行情况

3. Autoruns

Autoruns 是由 Sysinternals(微软的一部分)提供的免费工具,它可以显示 Windows 启动时加载的所有程序、服务、驱动程序和其他自启动项。您可以从 Microsoft 官网下载并使用它。

https://learn.microsoft.com/zh-cn/sysinternals/downloads/autoruns

Autoruns 默认会监控上面提到的两个命名空间的绑定(binding)信息,可以右键进行删除

4. 删除 WMI 后门

这里以 \root\subscription 命名空间为例

1) wmic

删除过滤器

代码语言:javascript
复制
wmic /NAMESPACE:"\\root\subscription" path __EventFilter where Name="FilterName" delete

删除消费者

代码语言:javascript
复制
wmic /NAMESPACE:"\\root\subscription" path CommandLineEventConsumer where Name="ConsumerName" delete

删除绑定

代码语言:javascript
复制
wmic /NAMESPACE:"\\root\subscription" path __FilterToConsumerBinding where Filter="__EventFilter.Name='FilterName'" delete
2) powershell

删除过滤器

代码语言:javascript
复制
Get-WmiObject -Namespace "root\subscription" -Class "__EventFilter" | Where-Object {$_.Name -eq "FilterName"} | ForEach-Object { $_.Delete() }

删除消费者

代码语言:javascript
复制
Get-WmiObject -Namespace "root\subscription" -Class "CommandLineEventConsumer" | Where-Object {$_.Name -eq "ConsumerName"} | ForEach-Object { $_.Delete() }

删除绑定

代码语言:javascript
复制
Get-WmiObject -Namespace "root\subscription" -Class "__FilterToConsumerBinding" | Where-Object {$_.Filter -eq "__EventFilter.Name='FilterName'"} | ForEach-Object { $_.Delete() }
3) Autoruns

部分文章指出 Autoruns 删除 WMI 效果不好,其实这种表述是不严谨的

Autoruns 删除并不是将过滤器、消费者、绑定都删除,而是只删除消费者,经过测试发现,过滤器、消费者、绑定三者之一任何一个删除 WMI 事件订阅效果都会立即消失

所以 Autoruns 删除消费者是有效的,而且是一种相对合理的方式,因为如何直接将三者均删掉,可能过滤器和绑定原本就是运维人员需要的,只是消费者被篡改了,这样可以保护过滤器和绑定

所以应急响应过程中,确定好三者,不要着急删除

5. 非常规查询

这部分不是常规的检查,属于是比较严谨的检查,可以根据实际情况考虑是否排查

主要排查以下内容

  • 当前操作系统中的 WMI 命名空间
  • 所有 WMI 命名空间中包含 CommandLineEventConsumer
  • 所有 WMI 中存在的过滤器、消费者、绑定
1. 查询 WMI 命名空间
代码语言:javascript
复制
Get-CimInstance -ClassName __Namespace -Namespace "root" | Select-Object Name

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
subscription    
DEFAULT         
CIMV2           
msdtc           
Cli             
SECURITY        
SecurityCenter2 
RSOP            
PEH             
StandardCimv2   
WMI             
AccessLogging   
directory       
Policy          
InventoryLogging
Interop         
Hardware        
ServiceModel    
Microsoft       
Appv         
2. 查询包含 CommandLineEventConsumer 类的命名空间
代码语言:javascript
复制
$namespaces = Get-WmiObject -Namespace "root" -Class "__NAMESPACE"

foreach ($namespace in $namespaces) {
    $namespaceName = $namespace.Name
    $query = "SELECT * FROM meta_class WHERE __class = 'CommandLineEventConsumer'"
    $commandLineConsumerClass = Get-WmiObject -Namespace "root\$namespaceName" -Query $query

    if ($commandLineConsumerClass) {
        Write-Host "Namespace: $namespaceName"
    }
}

包含 CommandLineEventConsumer 类的命名空间可以以执行命令的方式响应过滤器,如果存在非默认的命名空间,那就需要注意一下

我通过新建包含 CommandLineEventConsumer 类的命名空间测试事件订阅后门,但是无法详细了解 subscription 命名空间的情况,没有执行成功,但这并不意味着攻击者也不会成功,所以如果你发现了,检查一下总是好的

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
subscription
DEFAULT
3. 查询所有 WMI 中存在的过滤器、消费者、绑定
代码语言:javascript
复制
$namespaces = Get-WmiObject -Namespace "root" -Class "__NAMESPACE"

foreach ($namespace in $namespaces) {
    $namespaceName = $namespace.Name
    $filterInstances = Get-WmiObject -Namespace "root\$namespaceName" -Query "SELECT * FROM __EventFilter"
    $consumerInstances = Get-WmiObject -Namespace "root\$namespaceName" -Query "SELECT * FROM __EventConsumer"
    $bindings = Get-WmiObject -Namespace "root\$namespaceName" -Class "__FilterToConsumerBinding"

    Write-Host "【 Namespace: $namespaceName 】"
    Write-Host "-------------------------"
    Write-Host "Event Filters:"
    Write-Host "-----------------"
    foreach ($filter in $filterInstances) {
        $filterName = $filter.Name
        Write-Host "Filter Name: $filterName"
    }

    Write-Host "Event Consumers:"
    Write-Host "-----------------"
    foreach ($consumer in $consumerInstances) {
        $consumerName = $consumer.Name
        Write-Host "Consumer Name: $consumerName"
    }

    Write-Host "Bindings:"
    Write-Host "-----------------"
    foreach ($binding in $bindings) {
        $filterPath = $binding.Filter
        $consumerPath = $binding.Consumer

        $filter = $filterInstances | Where-Object { $_.__RELPATH -eq $filterPath }
        $consumer = $consumerInstances | Where-Object { $_.__RELPATH -eq $consumerPath }

        if ($filter -and $consumer) {
            $filterName = $filter.Name
            $consumerName = $consumer.Name

            Write-Host "Binding:"
            Write-Host "Filter Name: $filterName"
            Write-Host "Consumer Name: $consumerName"
        }
    }

    Write-Host ""
}

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
【 Namespace: subscription 】
-------------------------
Event Filters:
-----------------
Filter Name: SCM Event Log Filter
Event Consumers:
-----------------
Consumer Name: SCM Event Log Consumer
Bindings:
-----------------
Binding:
Filter Name: SCM Event Log Filter
Consumer Name: SCM Event Log Consumer


剩下都是空的

0x20 最近打开的文件

是windows下用户打开的文档历史文件记录

win + r 输入 Recent

这一般用户确定某个用户已经失陷,之后切到该用户后排查的项

0x21 敏感文件夹检查

  • 临时目录
  • 垃圾桶目录
  • 被删除用户的家目录
  • public 目录
  • web目录
1. 临时目录
1) 用户临时目录
代码语言:javascript
复制
echo %TMP%
echo %TEMP%

每个用户都有临时目录,通常为 C:\Users\<Username>\AppData\Local\Temp

2) 系统临时目录
代码语言:javascript
复制
C:\Windows\Temp
2. 垃圾桶目录

每个本地硬盘分区都有一个隐藏的系统文件夹用于存储该分区删除的文件。回收站的实际物理路径通常是:

代码语言:javascript
复制
C:$/$Recycle.Bin

如何进入该目录呢?

代码语言:javascript
复制
cd /d %SystemDrive%\$Recycle.Bin
3. 被删除的用户家目录

经过测试,默认情况下如果用户被删除,其家目录是不会被删除的,可以通过对比用户家目录和用户,查看是否存在异常

4. public 目录

也就是公用目录,如上图所示

代码语言:javascript
复制
C:\Users\Public
5. web 目录

web 目录具体位置就取决于使用的 web 服务器的配置了可以考虑使用 webshell 检测工具和杀毒软件进行检测

0x22 系统完整性检查

代码语言:javascript
复制
sigverif 

sigverif 是一个用于验证 Windows 系统文件签名的命令行工具。它可以检查系统文件是否被篡改或损坏,以确保系统的完整性和安全性。

sigverif 命令可以检查所有系统文件,包括驱动程序、系统组件、应用程序等。它通过比较系统文件的哈希值与已知的正确哈希值来验证文件的完整性。如果文件的哈希值与已知的正确哈希值匹配,则文件未被篡改;如果不匹配,则文件可能已被篡改或损坏。

如果想看详细的内容,可以点击高级,去日志中查看

0x23 Bits Job 检查

代码语言:javascript
复制
bitsadmin /list /allusers /verbose

列出所有任务

Windows Server 2016 中提示 bitsadmin 已经被弃用了,现在都通过 powershell 来管理 bits 服务

代码语言:javascript
复制
Get-BitsTransfer

如果发现存在攻击者留下的 Job ,可以使用下面的命令删除

代码语言:javascript
复制
Remove-BitsTransfer -BitsJob <BitsJob>

0x24 浏览器排查

浏览器排查主要有三个方面

  • 下载记录
  • 访问记录
  • 浏览器扩展

这里还是以自带的 ie 浏览器为例,Chrome、Edge、Firefox 大家肯定都会检查

1. 下载记录
2. 访问记录
3. 浏览器插件

0x25 屏幕保护排查

HKEY_CURRENT_USER\Control Panel\Desktop

  • SCRNSAVE.exe 设置为恶意 PE 路径
  • ScreenSaveActive- 设置为“1”以启用屏幕保护程序
  • ScreenSaverIsSecure- 设置为“0”无需密码即可解锁
  • ScreenSaveTimeout- 在执行屏幕保护程序之前设置用户不活动超时

在 Windows Server 2016 中,默认没有 SCRNSAVE.exe,如果检查过程中发现该项,可以重点关注

【 Windows Server 2016 】默认情况

0x26 NetSh 排查

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh

【 Windows Server 2016 】 默认情况

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
    2    REG_SZ    ifmon.dll
    4    REG_SZ    rasmontr.dll
    authfwcfg    REG_SZ    authfwcfg.dll
    dhcpclient    REG_SZ    dhcpcmonitor.dll
    dot3cfg    REG_SZ    dot3cfg.dll
    fwcfg    REG_SZ    fwcfg.dll
    hnetmon    REG_SZ    hnetmon.dll
    netiohlp    REG_SZ    netiohlp.dll
    nettrace    REG_SZ    nettrace.dll
    nshhttp    REG_SZ    nshhttp.dll
    nshipsec    REG_SZ    nshipsec.dll
    nshwfp    REG_SZ    nshwfp.dll
    peerdistsh    REG_SZ    peerdistsh.dll
    rpc    REG_SZ    rpcnsh.dll
    whhelper    REG_SZ    whhelper.dll
    wshelper    REG_SZ    wshelper.dll

0x27 辅助功能程序

比较经典的是替换粘滞键,未登录情况下通过连按 5 下 shift 进行获取shell

代码语言:javascript
复制
C:\Windows\System32\sethc.exe

可以通过沙箱或者签名进行验证,这里需要注意: cmd.exe 这种程序也是有微软签名的,不能仅用签名进行验证

签名验证可以参考知识点附录 -> 如何验证程序签名

0x28 AppCert DLLs

AppCert DLLs是一个Windows注册表项,通常用于控制应用程序的证书验证。当有进程使用了CreateProcess、CreateProcessAsUser、CreateProcessWithLoginW、CreateProcessWithTokenW或WinExec等函数时,这些进程会获取HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\AppCertDlls注册表项,此项下的dll都会加载到此进程。

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\AppCertDlls

存在后门时可能是这个样子

img

图片来源 https://blog.csdn.net/qq_36374896/article/details/107005578

【 Windows Server 2016 】默认情况

Windows Server 2016 中默认没有这个注册表项

0x29 AppInit DLL

AppInit DLL(Application Initialization DLL)是一种在Windows操作系统中使用的动态链接库(DLL)。它的作用是在应用程序加载时,可以用于执行自定义的初始化和配置操作。

下面是AppInit DLL的一些常见用途和功能:

  1. 应用程序初始化:AppInit DLL可以用于执行应用程序的初始化操作。例如,它可以加载应用程序所需的其他依赖项、设置环境变量、初始化全局变量等。
  2. 钩子和拦截:AppInit DLL可以用于创建钩子(hook)和拦截应用程序的函数调用。通过拦截应用程序的API调用,AppInit DLL可以修改或监视应用程序的行为。这可以用于实现各种功能,如检测和阻止恶意行为、记录日志、修改应用程序的行为等。
  3. 兼容性修正:AppInit DLL可以用于修复应用程序的兼容性问题。它可以拦截应用程序的调用,并在运行时对这些调用进行修改,以使应用程序能够在特定的操作系统版本或环境中正常工作。

因此,AppInit DLL 用来设置后门非常合适,注册表位置如下

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows

也可以通过 Autoruns 进行查看

【 Windows Server 2016 】默认情况

默认情况下存在该键,两个位置都是空的

0x30 Application Shimming

这是一种在Windows操作系统中使用的兼容性技术,旨在解决应用程序在不同操作系统版本上的兼容性问题。Application Shimming 的原理是在应用程序执行时,通过注入特定的代码或修改应用程序的行为,来实现兼容性修复或功能增强。这些修改通常是通过Shim引擎来实现的,Shim引擎会拦截和修改应用程序的API调用。

攻击者可能会利用Application Shimming 来创建后门的原因包括:

  1. 拦截和修改应用程序的行为:Shim引擎可以拦截应用程序的API调用,并修改它们的行为。攻击者可以利用这一特性,将恶意代码注入到应用程序中,以实现远程控制、数据窃取、命令执行等恶意操作。
  2. 绕过安全措施:Application Shimming 可以绕过一些安全措施,如防火墙、杀毒软件等。攻击者可以利用这一特性,使恶意行为在被安全软件检测之前或之后执行,从而避免被检测和阻止。
  3. 持久性访问:由于Application Shimming 通常是通过注册表设置或文件劫持来实现的,攻击者可以利用这些机制来维持持久性访问。他们可以修改注册表项或替换系统文件,以确保每次应用程序启动时都会加载恶意的Shim代码。

默认 Windows 安装程序 (sdbinst.exe) 当前安装的所有填充码的列表保存在:

  • %WINDIR%\AppPatch\sysmain.sdb
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags

自定义数据库存储在:

  • %WINDIR%\AppPatch\custom & %WINDIR%\AppPatch\AppPatch64\Custom
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Custom

缓存位置

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache

这里都是二进制数据,虽然能看到字符,建议只用来做参考

【 Windows Server 2016 】默认情况

默认

自定义

0x31 IFEO Injection 排查

Image File Execution Options (IFEO) 是一个 Windows 调试功能,而不是一个后门。IFEO 的主要目的是允许开发人员调试和跟踪特定的可执行文件。

IFEO 提供了一种机制,使开发人员能够将一个调试器程序关联到特定的可执行文件,并在执行该可执行文件时启动调试器。这对于开发、调试和分析应用程序非常有用。

当给定的可执行文件被启动时,操作系统会检查注册表中的 IFEO 设置。如果找到了对应的注册表项,系统会自动启动所配置的调试器程序,并将目标可执行文件作为参数传递给调试器。这样,开发人员就可以使用调试器来监视和分析目标应用程序的运行过程,以便调试和解决问题。

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

红框中就是可以被调试的程序,如果在这些项某个项,例如iexplore.exe 中新增一对键值,键的名字为 debugger ,值为要执行的程序,例如 calc.exe,就会在启动 iexplorer.exe 的时候启动计算器

这里需要注意,设置后点击ie浏览器并不会启动ie ,而是只启动调试器,也就是这里的计算器

当然了,聪明的攻击者肯定会在 Payload 中启动原程序,以达到隐藏的目录

这么老多目录,还是通过 powershell 来完成吧

代码语言:javascript
复制
$registryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"
$subKeys = Get-ChildItem -Path $registryPath
$debuggerItems = @()

foreach ($subKey in $subKeys) {
    $keyName = $subKey.PSChildName
    $keyValues = Get-ItemProperty -Path "$registryPath\$keyName"

    foreach ($entry in $keyValues.PSObject.Properties) {
        $entryName = $entry.Name
        $entryValue = $entry.Value

        if ($entryName -eq 'debugger') {
            $debuggerItems += @{
                Subkey = $keyName
                Key = $entryName
                Value = $entryValue
            }
        }
    }
}

if ($debuggerItems.Count -gt 0) {
    Write-Host "Debuggers found:"
    Write-Host "----------------"

    foreach ($item in $debuggerItems) {
        Write-Host "Subkey: $($item.Subkey)"
        Write-Host "Key   : $($item.Key)"
        Write-Host "Value : $($item.Value)"
        Write-Host "----------------"
    }
}
else {
    Write-Host "No debuggers found."
}

【 Windows Server 2016 】默认情况

0x32 COM 劫持

COM(Component Object Model)是一种微软公司开发的软件组件技术,用于在Windows操作系统中实现软件组件之间的通信和交互。COM 提供了一种标准的、可扩展的机制,使不同的应用程序能够通过接口进行相互通信和调用。

COM 的主要功能包括:

  1. 组件化:COM 将软件功能划分为独立的组件,每个组件可以独立开发、测试和部署。这样的组件化方式使得软件开发更加模块化、可维护性更强。
  2. 接口定义:COM 使用接口(Interface)来定义组件之间的通信规范。每个组件提供一个或多个接口,其他组件可以通过接口访问组件的功能。
  3. 组件注册:COM 组件需要在操作系统中进行注册,以便其他应用程序能够找到和使用这些组件。注册表中存储了组件的相关信息,包括组件的唯一标识符(CLSID)和接口标识符(IID)等。
  4. 运行时环境:COM 提供了一个运行时环境,负责加载和实例化组件,并管理组件之间的通信。运行时环境处理了组件的生命周期、对象的创建和销毁、接口的查询和调用等。

COM 劫持与 DLL 劫持原理差不多,都是在文件寻找过程上下文章,默认情况下也是不太好检查,可以想象一下,无非就是一下几种情况

  • 在加载顺序更靠前的地方放置同名文件
  • 直接替换要被读取的文件
  • 向要被读取的文件中注入自定义恶意代码

通常是通过注册表找到具体要读取的文件,查找注册表顺序如下

  1. HKEY_CURRENT_USER\Software\Classes\CLSID
  2. HKEY_CLASSES_ROOT\CLSID
  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\

参考文章 https://paper.seebug.org/2030/

我们以计算器为例,通过 Process Monitor 查看进程加载文件和注册表等信息

这里可以看到,加载 COM 组件时先是去查找了下面的注册表位置,结果没找到

代码语言:javascript
复制
HKCU\Software\Classes\CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}\Instance

之后又去下面的位置进行寻找

代码语言:javascript
复制
HKCR\CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}\Instance

结果找到了

如果攻击者在 HKCU\Software\Classes\CLSID\{7ED96837-96F0-4812-B211-F13C24117ED3}\Instance 放置一个同名的组件,实现了原本的功能,还加入了恶意代码,此时就会造成 COM 劫持

1. 排查注册表

我们首先要进行的检查就是 HKCU\Software\Classes\CLSID\ 下所有的 COM 组件

这些注册表项中的子项 InprocServer32 是我们要关注的,它指定了COM组件的DLL文件路径。

【 Windows Server 2016 】默认情况

默认情况下 HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID 是空的

如果排查过程中发现存在相关设置,可以重点关注,通过验证签名,病毒扫描等方式进行检查

2. 验证 COM 组件签名

如果攻击者比较变态,直接替换了文件或者向文件中注入了恶意代码,而不是劫持加载顺序,那么上面的排查就不会发现了,我们尝试将验证所有的 COM 组件的 DLL 签名

当然了,还是用 powershell 来实现

代码语言:javascript
复制
# 定义函数来进行签名校验
function Verify-FileSignature {
    param (
        [Parameter(Mandatory=$true)]
        [ValidateScript({Test-Path $_ -PathType Leaf})]
        [string]$FilePath
    )
    
    if (Test-Path -Path $FilePath -PathType Leaf) {
        $signature = Get-AuthenticodeSignature -FilePath $FilePath
        if ($signature.Status -eq 'Valid') {
            return "Valid"
        } else {
            return "Invalid"
        }
    } else {
        return "File Not Found"
    }
}

# 定义函数来检查注册表地址
function Check-RegistryPaths {
    param (
        [Parameter(Mandatory=$true)]
        [string[]]$RegistryPaths
    )

    $invalidSignatures = @()

    foreach ($registryPath in $RegistryPaths) {
        if (Test-Path -Path $registryPath) {
            $subkeys = Get-ChildItem -Path $registryPath
            foreach ($subkey in $subkeys) {
                $inprocServer32Path = Join-Path -Path $subkey.PSPath -ChildPath "InprocServer32"
                if (Test-Path -Path $inprocServer32Path) {
                    $defaultPropertyValue = (Get-ItemProperty -Path $inprocServer32Path -Name "(default)" -ErrorAction SilentlyContinue)."(default)"
                    if ($defaultPropertyValue) {
                        # 此处加 Trim('"') 是为了防止类似于 Defender 这种“有个性”的软件胡乱设置注册表
                        $binaryFilePath = $defaultPropertyValue.Trim().Trim('"')
                        $binaryFilePath = [Environment]::ExpandEnvironmentVariables($binaryFilePath)
                        if (Test-Path $binaryFilePath) {
                            $result = Verify-FileSignature -FilePath $binaryFilePath
                            if ($result -eq "Invalid") {
                                $invalidSignatures += @{
                                    RegistryPath = $subkey
                                    BinaryFilePath = $binaryFilePath
                                } 
                                Write-Host "Signature is invalid for file: $binaryFilePath" -ForegroundColor Red
                            } elseif ($result -eq "Valid") {
                                Write-Host "Signature is valid for file: $binaryFilePath " -ForegroundColor Green
                            }
                        } else {
                            $dllFileName = Split-Path -Leaf $binaryFilePath
                            $found = $false
                            $searchPaths = @(
                                (Join-Path -Path $env:SystemRoot -ChildPath $dllFileName),
                                (Join-Path -Path $env:SystemRoot -ChildPath "System32\$dllFileName")
                            )
                            foreach ($path in $searchPaths) {
                                if (Test-Path $path) {
                                    $found = $true
                                    $result = Verify-FileSignature -FilePath $path
                                    if ($result -eq "Invalid") {
                                        $invalidSignatures += @{
                                            RegistryPath = $subkey
                                            BinaryFilePath = $path
                                        }
                                        Write-Host "Signature is invalid for file: $path" -ForegroundColor Red
                                    } elseif ($result -eq "Valid") {
                                        Write-Host "Signature is valid for file: $path " -ForegroundColor Green
                                    }
                                    break
                                }
                            }
                            if (-not $found) {
                                Write-Host "Could not find file '$dllFileName' in default search paths. Skipping signature verification."  -ForegroundColor Yellow
                            }
                        }
                    } else {
                        Write-Host "Binary file path is empty for subkey $($subkey.PSChildName)."  -ForegroundColor Yellow
                    }
                }
            }
        }
    }

    # 打印不通过的签名验证信息
    if ($invalidSignatures.Count -gt 0) {
        Write-Output ""
        Write-Output ""
        Write-Output "--------------------------------------------------------"
        Write-Host "Invalid signatures:" -ForegroundColor Red
        foreach ($invalidSignature in $invalidSignatures) {
            $registryPath = $invalidSignature.RegistryPath
            $binaryFilePath = $invalidSignature.BinaryFilePath
            Write-Host "Registry path: $registryPath" -ForegroundColor Yellow
            Write-Host "Binary file path: $binaryFilePath" -ForegroundColor Yellow
            Write-Output ""
        }
        Write-Output "--------------------------------------------------------"
    }
}

# 要检查的注册表地址数组
$registryPaths = @(
    "Registry::HKEY_CURRENT_USER\Software\Classes\CLSID",
    "Registry::HKEY_CLASSES_ROOT\CLSID",
    "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\"
)

# 调用函数进行检查
Write-Host "Starting signature verification..."

Check-RegistryPaths -RegistryPaths $registryPaths

Write-Host "Signature verification completed."

如果后期大家发现其他关于 COM 相关的注册表,也可以加入到 $registryPaths 数组中,例如 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID

签名验证不通过并不代表这个程序是恶意的,可以先与开发人员确认,并且可以通过沙箱以及在线杀毒程序进行分析

【 Windows Server 2016 】默认情况

默认并不存在签名验证不通过的 COM 组件

3. 杀毒程序扫描

这个就不多说了,大家选择已有或者合适的杀毒程序

0x33 Password Filter

密码过滤器是一种安全功能,用于在用户更改密码时对密码进行验证和强制规则。它允许系统管理员定义一组自定义规则和策略,以确保用户设置的密码符合安全要求。

密码过滤器的主要目的是增强密码的复杂性和强度,从而提高系统的安全性。它可以执行以下任务:

  1. 强制密码策略:密码过滤器可以强制实施密码策略,例如密码长度、复杂性、过期时间等要求。这有助于确保用户选择的密码具有足够的复杂性,不容易被猜测或破解。
  2. 检查常见密码:密码过滤器可以检查用户设置的密码是否属于常见密码列表中。这有助于防止使用容易猜测的密码,如123456password等。
  3. 自定义验证规则:管理员可以定义自定义验证规则,以满足特定的安全需求。例如,要求密码包含特定字符、不允许使用特定单词或模式等。
  4. 通知和警告:密码过滤器可以向用户提供有关密码复杂性要求的通知和警告,以帮助他们创建符合要求的密码。

通过密码过滤器,管理员可以确保用户设置的密码符合组织的安全策略,并提高整个系统的安全性。它是一项重要的安全措施,用于防止弱密码和密码猜测攻击,从而降低系统遭受密码相关威胁的风险。

攻击者常常利用这个功能窃取用户的明文密码,当然主要是新用户

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\ 的 Notification Packages 键对应的值

这些都是 DLL 只不过这里不写 .dll

【 Windows Server 2016 】默认情况

0x34 Network Provider

Network Provider 类型的后门主要是窃取网络登录的明文密码,其实我觉得只要明文密码需要被处理,那么这个处理流程中的这些程序都会被发掘用来做后门

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order 用于配置普通的网络提供程序 DLL 的顺序
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder 用于配置硬件网络提供程序的顺序。这些注册表路径允许用户和管理员管理和控制网络提供程序的加载顺序,以满足特定的网络连接需求和优先级
代码语言:javascript
复制
prl_fs,LanmanWorkstation,RDPNP

这些都是服务名称,在这些服务注册表中都存在 NetworkProvider 子项

也可以通过 Autoruns 进行查看,但更推荐通过注册表查看

【 Windows Server 2016 】默认情况

代码语言:javascript
复制
prl_fs,LanmanWorkstation,RDPNP

这里的 prl_fs 是我的PD 虚拟机的 tools 添加的,所以默认应该不存在

代码语言:javascript
复制
%SystemRoot%\System32\ntlanman.dll
代码语言:javascript
复制
%SystemRoot%\System32\drprov.dll

0x35 Winsock NSP

WinSock NSP(WinSock Namespace Provider)是指在 Windows 操作系统中实现网络套接字编程接口(Socket API)的组件之一。它负责提供网络通信的底层功能,使应用程序能够通过网络进行数据传输。

WinSock NSP 通过一组动态链接库(DLL)来实现,这些 DLL 包含了实现网络协议栈和通信协议的代码。它们提供了一种标准化的编程接口,使开发人员能够使用常见的网络协议(如TCP/IP、UDP)进行网络通信。

通过 WinSock NSP,开发人员可以创建套接字、建立连接、发送和接收数据等网络操作。它提供了一系列函数和数据结构,使应用程序能够方便地进行网络编程,实现网络通信功能

WinSock NSP 后门的原理如下:

  1. 劫持或替换 Namespace Provider DLL:攻击者通过劫持或替换系统中的 Namespace Provider DLL 文件来实现后门功能。Namespace Provider DLL 是实现命名空间提供者功能的动态链接库,用于处理网络命名空间的解析和操作。
  2. 注册恶意 Namespace Provider:攻击者可以注册一个恶意的 Namespace Provider,将其注入到系统的 Namespace Provider 链表中。这样,当应用程序进行网络命名空间解析时,恶意的 Namespace Provider 将被调用,攻击者可以在其中进行拦截、篡改或记录网络流量。
  3. 修改 Namespace Provider 设置:攻击者可以修改系统中的 Namespace Provider 设置,例如修改优先级顺序、修改默认的命名空间解析规则等。这样,攻击者可以将网络流量重定向到恶意的服务器或进行其他恶意操作。

注册表位置

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries\
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries64
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries\
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries64
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Num_Catalog_Entries

前面四个注册表位置每个子键代表一个已注册的 WinSock Namespace Provider。检查这些子键的值,特别是以下几个值:

  • ProtocolChain:这个值指定了命名空间提供者的优先级顺序。确保优先级顺序中没有未知或可疑的提供者。
  • LibraryPath:这个值指定了命名空间提供者 DLL 的路径。验证 DLL 的路径是否与已知的合法提供者相匹配。
  • DisplayName:这个值提供了命名空间提供者的显示名称。确保名称与已知的合法提供者一致。

最后一个注册表主要是表示注册的 WinSock Namespace Providers 的数量。确保该值与实际注册的数量一致,以排除任何异常情况。

这里思路还是通过 powershell 提取每个 dll ,之后进行签名验证

代码语言:javascript
复制
# 定义函数来进行签名校验
function Verify-FileSignature {
    param (
        [Parameter(Mandatory=$true)]
        [ValidateScript({Test-Path $_ -PathType Leaf})]
        [string]$FilePath
    )
    
    if (Test-Path -Path $FilePath -PathType Leaf) {
        $signature = Get-AuthenticodeSignature -FilePath $FilePath
        if ($signature.Status -eq 'Valid') {
            return "Valid"
        } else {
            return "Invalid"
        }
    } else {
        return "File Not Found"
    }
}

# 定义函数来检查注册表地址
function Check-RegistryPaths {
    param (
        [Parameter(Mandatory=$true)]
        [string[]]$RegistryPaths
    )

    $invalidSignatures = @()

    foreach ($registryPath in $RegistryPaths) {
        if (Test-Path -Path $registryPath) {
            $subkeys = Get-ChildItem -Path $registryPath
            foreach ($subkey in $subkeys) {
                # $ParametersPath = Join-Path -Path $subkey.PSPath -ChildPath "Parameters"
                $ParametersPath = $subkey.PSPath
                if (Test-Path -Path $ParametersPath) {
                    $libraryValue = (Get-ItemProperty -Path $ParametersPath -Name "LibraryPath" -ErrorAction SilentlyContinue)."LibraryPath"
                    if ($libraryValue) {
                        $binaryFilePath = $libraryValue.Trim().Trim('"')
                        $binaryFilePath = [Environment]::ExpandEnvironmentVariables($binaryFilePath)
                        if (Test-Path $binaryFilePath) {
                            $result = Verify-FileSignature -FilePath $binaryFilePath
                            if ($result -eq "Invalid") {
                                $invalidSignatures += @{
                                    RegistryPath = $subkey
                                    BinaryFilePath = $binaryFilePath
                                } 
                                Write-Host "Signature is invalid for file: $binaryFilePath" -ForegroundColor Red
                            } elseif ($result -eq "Valid") {
                                Write-Host "Signature is valid for file: $binaryFilePath " -ForegroundColor Green
                            }
                        } else {
                            $dllFileName = Split-Path -Leaf $binaryFilePath
                            $found = $false
                            $searchPaths = @(
                                (Join-Path -Path $env:SystemRoot -ChildPath $dllFileName),
                                (Join-Path -Path $env:SystemRoot -ChildPath "System32\$dllFileName")
                            )
                            foreach ($path in $searchPaths) {
                                if (Test-Path $path) {
                                    $found = $true
                                    $result = Verify-FileSignature -FilePath $path
                                    if ($result -eq "Invalid") {
                                        $invalidSignatures += @{
                                            RegistryPath = $subkey
                                            BinaryFilePath = $path
                                        }
                                        Write-Host "Signature is invalid for file: $path" -ForegroundColor Red
                                    } elseif ($result -eq "Valid") {
                                        Write-Host "Signature is valid for file: $path " -ForegroundColor Green
                                    }
                                    break
                                }
                            }
                            if (-not $found) {
                                Write-Host "Could not find file '$dllFileName' in default search paths. Skipping signature verification."  -ForegroundColor Yellow
                            }
                        }
                    } else {
                        Write-Host "Binary file path is empty for subkey $($subkey.PSChildName)."  -ForegroundColor Yellow
                    }
                }
            }
        }
    }

    # 打印不通过的签名验证信息
    if ($invalidSignatures.Count -gt 0) {
        Write-Output ""
        Write-Output ""
        Write-Output "--------------------------------------------------------"
        Write-Host "Invalid signatures:" -ForegroundColor Red
        foreach ($invalidSignature in $invalidSignatures) {
            $registryPath = $invalidSignature.RegistryPath
            $binaryFilePath = $invalidSignature.BinaryFilePath
            Write-Host "Registry path: $registryPath" -ForegroundColor Yellow
            Write-Host "Binary file path: $binaryFilePath" -ForegroundColor Yellow
            Write-Output ""
        }
        Write-Output "--------------------------------------------------------"
    }
}

# 要检查的注册表地址数组
$registryPaths = @(
    "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries\",
    "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries64",
    "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries\",
    "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries64"
)

# 调用函数进行检查
Write-Host "Starting signature verification..."

Check-RegistryPaths -RegistryPaths $registryPaths

Write-Host "Signature verification completed."

也可以通过 Autoruns 进行排查

【 Windows Server 2016 】默认情况

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 常规安全检查
    • 0x00 杀毒软件
    • 0x01 防火墙配置
      • 1. 防火墙开关
      • 2. 防火墙允许的应用
      • 3. 防火墙出入站策略
    • 0x02 账号信息
      • 1. 查看用户
      • 2. 查看用户组
      • 3. 查找隐藏账户
      • 4. 删除隐藏账户
    • 0x03 登录信息
      • 1. 命令行查询本地/远端会话
      • 2. 任务管理器
    • 0x04 启动项
      • 1. msconfig
      • 2. 全局登录自启动目录
      • 3. 用户登录自启动目录
      • 4. 注册表查看启动项
      • 5. 组策略启动脚本
      • 6. 安全工具检查
    • 0x05 计划任务
      • 1. taskschd.msc 任务计划程序
      • 2. schtasks 查看定时任务列表
      • 3. 注册表查看计划任务
      • 4. 计划任务目录文件
      • 5. 计划任务日志文件
      • 6. 采用工具排查
      • 7. 隐藏计划任务排查
    • 0x06 网络连接
      • 1. netstat
      • 2. nbtstat
      • 3. PowerShell
      • 4. Get-NetworkConnection
      • 5. System Informer
    • 0x07 IPC 共享
    • 0x08 进程
      • 1. 任务管理器
      • 2. tasklist
      • 3. taskkill
      • 4. powershell
      • 5. wmic
      • 6. query 查看当前用户启动的进程
      • 7. tlist.exe官方调试工具
      • 8. Process Explorer
      • 9. System Informer
      • 10. 系统信息(msinfo32)
    • 0x09 环境变量
      • 1. GUI 环境变量查询
      • 2. set 命令查询基本信息
      • 3. powershell 查看环境变量
      • 4. 系统信息(msinfo32)
      • 5. 环境变量 CLR 劫持排查
    • 0x10 系统基本信息及补丁
      • 1. 系统基本信息查询
      • 2. wmic查询补丁信息
      • 3. Windows-Exploit-Suggester
      • 4. WES-NG
    • 0x11 系统日志分析
      • 1. 事件查看器
      • 2. 日志文件
      • 3. wevtutil
      • 4. PowerShell
      • 5. Log Parser
      • 6. LogParser Lizard
      • 7. evtxLogParser
      • 8. sysmon
      • 9. LogonTracer
    • 0x12 命令历史
      • 1) cmd命令行历史
      • 2) powershell 历史
    • 0x13 PowerShell 配置文件
    • 0x14 PowerShell 日志
    • 0x15 PowerShell Alias
    • 0x16 服务程序
      • 1. services.msc
      • 2. SC 命令
      • 3. PowerShell
      • 4. wmic
      • 5. 注册表
      • 6. System Informer
      • 7. Autoruns
      • 8. 系统信息(msinfo32)
      • 9. 排查隐藏的服务
      • 10. 进阶性排查
    • 0x17 远程桌面 RDP
      • 1. 注册表查询 RDP 记录
    • 0x18 DLL 检查
      • 1. DLL 劫持
      • 2. DLL 注入
      • 3. KnownDLLs
    • 0x19 WMI 排查
      • 1. wmic
      • 2. powershell
      • 3. Autoruns
      • 4. 删除 WMI 后门
      • 5. 非常规查询
    • 0x20 最近打开的文件
    • 0x21 敏感文件夹检查
      • 1. 临时目录
      • 2. 垃圾桶目录
      • 3. 被删除的用户家目录
      • 4. public 目录
      • 5. web 目录
    • 0x22 系统完整性检查
    • 0x23 Bits Job 检查
    • 0x24 浏览器排查
      • 1. 下载记录
      • 2. 访问记录
      • 3. 浏览器插件
    • 0x25 屏幕保护排查
    • 0x26 NetSh 排查
    • 0x27 辅助功能程序
    • 0x28 AppCert DLLs
    • 0x29 AppInit DLL
    • 0x30 Application Shimming
    • 0x31 IFEO Injection 排查
    • 0x32 COM 劫持
      • 1. 排查注册表
      • 2. 验证 COM 组件签名
      • 3. 杀毒程序扫描
    • 0x33 Password Filter
    • 0x34 Network Provider
    • 0x35 Winsock NSP
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档