常规安全检查
案例操作系统为 Windows Server 2016
root 账户来模拟普通用户账户
Administrator 为管理员账户
admin$ 账户来模拟隐藏普通账户
Windows 命令行常规情况下是不区分大小写的,因此大小写都可以
0x00 杀毒软件¶
如果应急响应过程中允许,使用杀毒程序进行全盘杀毒肯定非常有帮助的,目前很多企业都有自己的终端管控程序,其中部分自带病毒库和杀毒功能,如果允许可以考虑异构排查
需要注意,大部分杀毒软件都有白名单等功能,全盘查杀可能会跳过这些内容,建议注意是否存在白名单情况,对白名单详细排查
0x01 近期活动¶
这部分偏取证一些,不过对于很多应急场景,例如恶意文件被删除了,分析程序执行非常有用,这部分主要参考以下网址,感谢分享
https://www.sans.org/posters/windows-forensic-analysis/
https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Windows%E7%B3%BB%E7%BB%9F%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%E8%AE%B0%E5%BD%95%E7%9A%84%E8%8E%B7%E5%8F%96%E4%B8%8E%E6%B8%85%E9%99%A4
https://ericzimmerman.github.io/#!index.md
1. LastActivityView¶
https://www.nirsoft.net/utils/computer_activity_view.html
LastActivityView
可以显示多种活动记录,包括文件访问、程序启动和关闭、系统休眠和唤醒、网络活动、打印作业等。它收集并显示这些活动记录的详细信息,如活动时间、活动类型、操作描述、文件路径等。
下载 LastActivityView
及其对应的语言配置文件,将语言配置文件放在与 LastActivityView
同路径下会自动加载语言配置文件
这里可以看到任务运行、打开文件或文件夹、选择打开/保存文件对话框等近期操作,可以通过点击查看,选择一些便于查看的选项
可以导出 html 版本的报告,可以通过筛选功能进行筛选
通过在项上右击属性,查看该项的来源,当然也可以通过调整栏目大小,在后面的栏目中找到
2. 组策略-审核进程创建¶
默认 Windows Server 2016
中没有开启审核进程创建的组策略,但是默认还是会记录部分进程创建,主要是系统上的默认程序
日志位置为 Windows 日志 -> 安全
进程事件ID : 4688
如果组策略开启后,会记录进程创建
Windows + r
输入 gpedit.msc
如果开启,则会记录命令行程序进程创建
3. Amcache¶
Amcache跟踪已安装的应用程序、已执行(或当前)的程序、加载的驱动程序等。使这个工件与众不同的是,它还跟踪可执行文件和驱动程序的SHA1散列。(在Win7+中可用)
以下是Amcache的一些功能和用途:
- 应用程序兼容性:Amcache记录了应用程序的元数据,包括应用程序的名称、版本、文件路径等信息。这些元数据可以用于识别和解决应用程序的兼容性问题。当应用程序启动时,Amcache会检查其元数据,并根据预定义的兼容性规则和设置来确定是否需要应用特定的兼容性修复。
- 应用程序白名单:Amcache还用于应用程序白名单功能,这是一种安全机制,用于限制系统上可以运行的应用程序。管理员可以配置白名单,只允许特定的应用程序在系统上运行,其他应用程序则被阻止。Amcache记录了白名单中的应用程序信息,并与系统上运行的应用程序进行比对,以确定是否允许其运行。
- 性能优化:Amcache还可以提高应用程序的启动性能。通过缓存应用程序的元数据和执行信息,系统可以更快地检索和加载应用程序,从而减少启动时间和响应延迟。
Amcache数据存储在系统的Amcache.hve文件中,通常位于 C:\Windows\AppCompat\Programs
目录下。这个文件是一个二进制格式的注册表文件,包含了所有应用程序的元数据和执行信息。
txt 文件可以直接查看
解析工具
https://github.com/EricZimmerman/AmcacheParser
https://github.com/yoda66/GetAmCache/blob/master/Get-Amcache.ps1
4. ShimCache¶
ShimCache(也称为AppCompatCache)是Windows操作系统中的一个功能,用于记录和缓存应用程序的兼容性信息。它主要用于加快应用程序的启动速度,并提供对应用程序的兼容性修复和调整的支持。
以下是ShimCache的一些功能和用途:
- 加速应用程序启动:ShimCache会缓存应用程序的兼容性信息,包括应用程序的修复补丁、设置和调整等。当用户再次启动一个应用程序时,Windows会检查ShimCache以获取该应用程序的兼容性信息,从而加快应用程序的启动速度。
- 兼容性修复和调整:ShimCache可以存储应用程序的兼容性修复和调整信息。当应用程序启动时,Windows会应用这些修复和调整来解决潜在的兼容性问题,以确保应用程序在当前操作系统上正常运行。
- 应用程序兼容性数据库:ShimCache实际上是一个应用程序兼容性数据库,其中包含了大量应用程序的兼容性信息。这些信息包括修复补丁、设置、调整和其他与应用程序兼容性相关的数据。Windows可以根据这些信息自动应用修复和调整,以提高应用程序的兼容性。
解析工具
https://github.com/EricZimmerman/AppCompatCacheParser/
生成的 csv
文件可以通过 Excel 或者 WPS 文件打开
这里面标记了文件上次修改的时间、是否执行过等信息
5. UserAssist¶
UserAssist记录基于GUI的程序执行的元数据,UserAssist 数据储存在注册表中,路径通常是
当前用户
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist
所有用户
HKEY_USERS\<sid>\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist
其中包含多个子键,每个子键对应一个用户接口包GUID,每个GUID下记录了特定类型的用户活动,如对explorer、IE浏览器以及其他程序的使用情况。
具体而言,UserAssist 存储的信息可能包括但不限于:
- 应用程序的启动次数
- 应用程序最后一次被访问的时间
- 用户在应用程序内的活动频率和持续时间
- 可能还记录了一些额外的参数,反映用户的操作习惯
检查工具
https://www.nirsoft.net/utils/userassist_view.html
下载检查工具的同时,下载语言配置文件,放到工具同目录会自动加载
6. MUICache¶
MUICache 是 Windows 操作系统中的一个功能,用于记录和缓存多语言用户界面(MUI)文件的信息。它主要用于加快多语言应用程序的启动速度,并提供对多语言资源的访问支持。
MUICache是Windows操作系统注册表中的一项,位于
当前用户
HKEY_CURRENT_USER\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
所有用户
HKEY_USERS\<sid>\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
Vista 之前
HKEY_USERS\<sid>\Software\Microsoft\Windows\ShellNoRoam\MUICache
HKEY_USERS\<sid>\Software\Microsoft\Windows\CurrentVersion\Explorer\MUICache
HKEY_USERS\<sid>\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
解析工具
http://www.nirsoft.net/utils/muicache_view.html
7. RunMRU¶
RunMRU (Most Recently Used Run) 是Windows操作系统注册表中的一个键值,它位于
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKEY_USERS\<sid>\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
这个键用于存储用户最近在“运行”对话框中输入过的命令历史记录。
当你按下 Win + R 键打开“运行”对话框并在其中输入命令执行程序、打开文件或网址后,这些输入的历史记录就会被保存在 RunMRU 注册表键下。每个曾经输入过的命令都会作为一个独立的值存储在该键的右侧窗口中,键名为一个顺序编号,键值则是对应输入的命令字符串。
8. AppCompatFlags Registry Keys¶
AppCompatFlags Registry Keys 是Windows操作系统中的一组注册表键,用于记录和管理应用程序的兼容性修复和设置。它们主要用于解决旧版本应用程序在较新版本的Windows上可能出现的兼容性问题。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags
9. Prefetch¶
Prefetch 是Windows操作系统中的一项技术,用于加速应用程序的启动速度和系统的整体性能。它通过在系统启动或应用程序首次运行时预先读取相关文件和数据,以减少后续访问时的延迟。
文件位于 C:\Windows\Prefetch\
,扩展名为pf
解析工具
https://github.com/EricZimmerman/PECmd
Windows Server 2016
中该文件夹下无文件,应该是默认没有开启 Prefetch
10. Application-Experience¶
Application-Experience
日志是 Windows 操作系统中的一个事件日志,用于记录与应用程序体验和兼容性相关的事件和信息。它提供了有关应用程序的启动、运行和兼容性修复的记录。以下是关于 Application-Experience
日志的一些含义:
- 应用程序启动和运行:
Application-Experience
日志记录了应用程序的启动和运行事件。这些事件可以包括应用程序的启动时间、运行时错误、异常终止等。通过分析这些事件,可以了解应用程序的执行情况,以便进行故障排除和优化。 - 兼容性修复:当应用程序在当前操作系统上遇到兼容性问题时,Windows 操作系统可能会尝试自动应用兼容性修复措施。
Application-Experience
日志会记录这些兼容性修复的相关信息,例如应用程序的设置更改、注册表修复、文件替换等。这些记录可以帮助了解应用程序的兼容性修复过程和结果。 - 应用程序兼容性评估:
Application-Experience
日志还记录了应用程序的兼容性评估结果。这些评估可能涉及检查应用程序的兼容性数据库、比较应用程序的配置与兼容性规则等。通过这些评估记录,可以确定应用程序在当前操作系统上的兼容性状况。 - 应用程序配置和设置:
Application-Experience
日志可能还包含与应用程序配置和设置相关的事件和信息。这些信息可以包括应用程序的配置更改、注册表设置、文件路径更改等。通过记录这些事件,可以了解应用程序的配置变化和对应的影响。
具体位置为
这里有 5 个日志文件
- Program-Compatibility-Assistant(程序兼容性助手): 这个日志文件记录了与程序兼容性助手相关的操作和事件。程序兼容性助手是 Windows 操作系统中的一个功能,用于检测和解决应用程序在当前操作系统上的兼容性问题。该日志文件记录了兼容性助手执行的操作、应用程序的兼容性问题和解决方案等信息。
- Program-Compatibility-Troubleshooter(程序兼容性故障排除): 这个日志文件记录了与程序兼容性故障排除相关的操作和事件。程序兼容性故障排除是 Windows 操作系统中的一个功能,用于自动检测和解决应用程序的兼容性问题。该日志文件记录了故障排除执行的操作、检测到的兼容性问题和解决方案等信息。
- Program-Inventory(程序清单): 这个日志文件记录了与程序清单相关的操作和事件。程序清单是 Windows 操作系统中的一个功能,用于跟踪和记录已安装的应用程序的信息。该日志文件记录了应用程序的安装、卸载、更新等操作,以及与程序清单相关的元数据和事件。
- Program-Telemetry(程序遥测): 应用程序遥测日志通常包含了应用程序运行时的行为和性能数据,可能包括启动时间、资源使用情况、功能使用统计等。在Application Experience服务下,这类日志有助于微软或其他开发者了解应用的运行状况以便改进其兼容性和用户体验。
- Steps-Recorder(步骤记录器): 这个日志文件记录了使用步骤记录器工具期间的事件和操作。步骤记录器是 Windows 操作系统中的一个实用工具,用于记录用户在计算机上执行的操作步骤,以便在需要时进行故障排除和问题解决。该日志文件记录了用户的操作步骤、屏幕截图和其他相关信息。
这几个日志文件都可以查看一下
11. Jump Lists¶
Jump Lists(跳转列表)是Windows操作系统中的一个功能,用于提供快速访问应用程序的常用任务和最近打开的文件。它可以让用户更方便地启动应用程序、访问常用功能以及快速打开最近使用的文件
%APPDATA%\Microsoft\Windows\Recent
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations\
与 Win + r
输入 Recent
是一样的
解析工具
https://github.com/EricZimmerman/JumpList
https://ericzimmerman.github.io/#!index.md
12. SRUM¶
SRUM(System Resource Usage Monitor)是Windows操作系统中的一个组件,用于跟踪和记录系统资源的使用情况。它可以提供有关应用程序、进程和用户在系统上使用的资源的详细信息,包括CPU时间、内存使用、网络活动和磁盘活动等。
以下是SRUM的一些功能和用途:
- 资源管理和性能分析:SRUM可以帮助系统管理员和开发人员监视和分析系统资源的使用情况。通过SRUM,可以了解特定应用程序、进程或用户在系统上使用资源的方式,以及它们对系统性能的影响。这可以帮助优化系统配置、调整应用程序性能和识别资源瓶颈。
- 安全审计和威胁检测:SRUM还可以用于安全审计和威胁检测。通过监视系统资源的使用情况,可以检测到异常或可疑的活动模式,例如异常的CPU或内存使用、异常的网络活动或大量的磁盘写入操作。这有助于发现潜在的恶意软件活动、内部滥用或异常行为。
- 用户活动分析:SRUM可以跟踪和记录用户在系统上的活动,例如登录时间、应用程序使用情况、网络连接和文件访问等。这可以用于分析用户行为模式、用户习惯和工作模式,从而改进用户体验、优化资源分配或进行用户行为分析。
文件位置
C:\Windows\System32\sru\SRUDB.dat
解析工具
https://github.com/EricZimmerman/Srum
在 Windows Server 2016
中默认不存在该目录以及文件,如果你的系统里有该文件,使用该解析工具前记得看一下 Github 的注意事项,不然可能会报错
13. LastVisitedMRU¶
LastVisitedMRU是Windows操作系统中的一个注册表键名(Registry key),用于跟踪用户使用的应用程序以及应用程序访问的最后一个文件的目录位置。
LastVisitedMRU保存在注册表中的以下路径下:
14. 最近打开的文件¶
这是一个注册表项跟踪最后打开的文件和文件夹。用于在某些开始菜单中的“最近”菜单等地方填充数据。
位置
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs
HKEY_USERS\<sid>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs
0x02 证书排查¶
这一部分主要是查看一下是否存在恶意程序安装的证书,因为这可能影响后续的签名校验等排查
1. certmgr.msc¶
主要就是对比是否存在和系统默认不一样的证书,尤其是多出来的
【 Windows Server 2016 】默认情况
受信任的跟证书颁发机构 -> 证书
颁发给 颁发者 截止日期 预期目的 友好名称 状态 证书模板
AAA Certificate Services AAA Certificate Services 2029/1/1 客户端身份验证, 代码签名, 加密文件系统, 安全电子邮件, IP 安全隧道终止, IP 安全用户, 服务器身份验证, 时间戳 Sectigo (AAA)
Class 3 Public Primary Certification Authority Class 3 Public Primary Certification Authority 2028/8/2 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证 VeriSign Class 3 Public Primary CA
Copyright (c) 1997 Microsoft Corp. Copyright (c) 1997 Microsoft Corp. 1999/12/31 时间戳 Microsoft Timestamp Root
DigiCert Assured ID Root CA DigiCert Assured ID Root CA 2031/11/10 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert
DigiCert Global Root CA DigiCert Global Root CA 2031/11/10 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert
DigiCert Global Root G2 DigiCert Global Root G2 2038/1/15 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert Global Root G2
DigiCert High Assurance EV Root CA DigiCert High Assurance EV Root CA 2031/11/10 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert
DigiCert Trusted Root G4 DigiCert Trusted Root G4 2038/1/15 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert Trusted Root G4
Microsoft Authenticode(tm) Root Authority Microsoft Authenticode(tm) Root Authority 2000/1/1 安全电子邮件, 代码签名 Microsoft Authenticode(tm) Root
Microsoft Root Authority Microsoft Root Authority 2020/12/31 <所有> Microsoft Root Authority
Microsoft Root Certificate Authority Microsoft Root Certificate Authority 2021/5/10 <所有> Microsoft Root Certificate Authority
Microsoft Root Certificate Authority 2010 Microsoft Root Certificate Authority 2010 2035/6/24 <所有> Microsoft Root Certificate Authority 2010
Microsoft Root Certificate Authority 2011 Microsoft Root Certificate Authority 2011 2036/3/23 <所有> Microsoft Root Certificate Authority 2011
NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc. NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc. 2004/1/8 时间戳 VeriSign Time Stamping CA
Parallels IP Holdings GmbH Symantec Class 3 Extended Validation Code Signing CA - G2 2018/6/25 代码签名 <无>
Symantec Enterprise Mobile Root for Microsoft Symantec Enterprise Mobile Root for Microsoft 2032/3/15 代码签名 <无>
Thawte Timestamping CA Thawte Timestamping CA 2021/1/1 时间戳 Thawte Timestamping CA
USERTrust RSA Certification Authority USERTrust RSA Certification Authority 2038/1/19 客户端身份验证, 代码签名, 加密文件系统, 安全电子邮件, IP 安全隧道终止, IP 安全用户, 服务器身份验证, 时间戳 Sectigo
VeriSign Class 3 Public Primary Certification Authority - G5 VeriSign Class 3 Public Primary Certification Authority - G5 2036/7/17 <所有> <无>
VeriSign Universal Root Certification Authority VeriSign Universal Root Certification Authority 2037/12/2 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 VeriSign Universal Root Certification Authority
中间证书颁发机构 -> 证书
颁发给 颁发者 截止日期 预期目的 友好名称 状态 证书模板
Microsoft Windows Hardware Compatibility Microsoft Root Authority 2002/12/31 代码签名, Windows 硬件驱动程序验证 <无>
Root Agency Root Agency 2040/1/1 <所有> <无>
Symantec Class 3 Extended Validation Code Signing CA - G2 VeriSign Class 3 Public Primary Certification Authority - G5 2024/3/4 代码签名 <无>
VeriSign Class 3 Public Primary Certification Authority - G5 VeriSign Class 3 Public Primary Certification Authority - G5 2036/7/17 <所有> <无>
www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign Class 3 Public Primary Certification Authority 2016/10/25 服务器身份验证, 客户端身份验证, 2.16.840.1.113730.4.1, 2.16.840.1.113733.1.8.1 <无>
中间证书颁发机构 -> 证书吊销列表
颁发者 生效日期 下一次的更新时间
VeriSign Commercial Software Publishers CA, "VeriSign, Inc.", Internet 2001/3/24 2004/1/8
第三方根证书颁发机构 -> 证书
颁发给 颁发者 截止日期 预期目的 友好名称 状态 证书模板
AAA Certificate Services AAA Certificate Services 2029/1/1 客户端身份验证, 代码签名, 加密文件系统, 安全电子邮件, IP 安全隧道终止, IP 安全用户, 服务器身份验证, 时间戳 Sectigo (AAA)
Class 3 Public Primary Certification Authority Class 3 Public Primary Certification Authority 2028/8/2 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证 VeriSign Class 3 Public Primary CA
DigiCert Assured ID Root CA DigiCert Assured ID Root CA 2031/11/10 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert
DigiCert Global Root CA DigiCert Global Root CA 2031/11/10 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert
DigiCert Global Root G2 DigiCert Global Root G2 2038/1/15 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert Global Root G2
DigiCert High Assurance EV Root CA DigiCert High Assurance EV Root CA 2031/11/10 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert
DigiCert Trusted Root G4 DigiCert Trusted Root G4 2038/1/15 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 DigiCert Trusted Root G4
USERTrust RSA Certification Authority USERTrust RSA Certification Authority 2038/1/19 客户端身份验证, 代码签名, 加密文件系统, 安全电子邮件, IP 安全隧道终止, IP 安全用户, 服务器身份验证, 时间戳 Sectigo
VeriSign Universal Root Certification Authority VeriSign Universal Root Certification Authority 2037/12/2 客户端身份验证, 代码签名, 安全电子邮件, 服务器身份验证, 时间戳 VeriSign Universal Root Certification Authority
Sparkle -> 证书
颁发给 颁发者 截止日期 预期目的 友好名称 状态 证书模板
DigiCert Trusted Root G4 DigiCert Trusted Root G4 2040/1/1 <所有> <无>
Sparkle Sparkle 2040/1/1 <所有> <无>
2. Powershell¶
使用 Powershell 可以直接获取个人和本地计算机的证书并进行比较,完成比较需要四个脚本
script1.ps1
用于采集操作系统默认的证书信息,所以是放在一个与受害服务器相同的纯净的操作系统中执行的,目的就是获取到默认证书信息
# 导出本地计算机和当前用户证书存储区
$certStores = @("My", "Root", "CA", "Trust", "AuthRoot", "TrustedPublisher", "TrustedPeople")
$defaultCerts = @{}
$systemTempDir = "C:\Windows\Temp"
$defaultCertsDir = Join-Path -Path $systemTempDir -ChildPath "DefaultCertificates"
foreach ($store in $certStores) {
$certs = @(
Get-ChildItem -Path "Cert:\LocalMachine\$store"
Get-ChildItem -Path "Cert:\CurrentUser\$store"
)
foreach ($cert in $certs) {
$certDir = Join-Path -Path $defaultCertsDir -ChildPath $store
# 确保目录存在
if (-not (Test-Path -Path $certDir)) {
New-Item -ItemType Directory -Path $certDir | Out-Null
}
$certPath = Join-Path -Path $certDir -ChildPath "$($cert.Thumbprint).cer"
$cert | Export-Certificate -FilePath $certPath
# 将指纹存储到哈希表中,便于后续对比
$defaultCerts[$cert.Thumbprint] = @{
Path = $certPath
Subject = $cert.Subject
Issuer = $cert.Issuer
NotBefore = $cert.NotBefore
NotAfter = $cert.NotAfter
}
}
}
# 将哈希表保存为JSON文件
$defaultCertsJsonPath = Join-Path -Path $defaultCertsDir -ChildPath "defaultCerts.json"
$defaultCerts | ConvertTo-Json | Set-Content -Path $defaultCertsJsonPath
Write-Output "默认证书和JSON文件已导出到: $defaultCertsJsonPath"
defaultCerts.json
就是默认证书的情况
script2.ps1
用于采集被检查服务器的证书信息
# 导出本地计算机和当前用户证书存储区
$certStores = @("My", "Root", "CA", "Trust", "AuthRoot", "TrustedPublisher", "TrustedPeople")
$currentCerts = @{}
$systemTempDir = "C:\Windows\Temp"
$currentCertsDir = Join-Path -Path $systemTempDir -ChildPath "CurrentCertificates"
foreach ($store in $certStores) {
$certs = @(
Get-ChildItem -Path "Cert:\LocalMachine\$store"
Get-ChildItem -Path "Cert:\CurrentUser\$store"
)
foreach ($cert in $certs) {
$certDir = Join-Path -Path $currentCertsDir -ChildPath $store
# 确保目录存在
if (-not (Test-Path -Path $certDir)) {
New-Item -ItemType Directory -Path $certDir | Out-Null
}
$certPath = Join-Path -Path $certDir -ChildPath "$($cert.Thumbprint).cer"
$cert | Export-Certificate -FilePath $certPath
# 将指纹存储到哈希表中,便于后续对比
$currentCerts[$cert.Thumbprint] = @{
Path = $certPath
Subject = $cert.Subject
Issuer = $cert.Issuer
NotBefore = $cert.NotBefore
NotAfter = $cert.NotAfter
}
}
}
# 将哈希表保存为JSON文件
$currentCertsJsonPath = Join-Path -Path $currentCertsDir -ChildPath "currentCerts.json"
$currentCerts | ConvertTo-Json -Depth 10 | Set-Content -Path $currentCertsJsonPath
Write-Output "当前证书和JSON文件已导出到: $currentCertsJsonPath"
currentCerts.json
文件就是当前系统的证书情况
script3.ps1
该脚本是用来比较两个文件的
param (
[string]$defaultCertsPath = ".\defaultCerts.json",
[string]$currentCertsPath = ".\currentCerts.json"
)
# 读取JSON文件
$defaultCerts = Get-Content -Path $defaultCertsPath | ConvertFrom-Json
$currentCerts = Get-Content -Path $currentCertsPath | ConvertFrom-Json
$differencesFound = $false
# 比较当前证书是否在默认证书中
foreach ($thumbprint in $currentCerts.PSObject.Properties.Name) {
if (-not $defaultCerts.PSObject.Properties.Name.Contains($thumbprint)) {
Write-Output "-----------------------------------------------"
Write-Output "新增的证书: $($currentCerts.$thumbprint.Path)"
Write-Output " 主题: $($currentCerts.$thumbprint.Subject)"
Write-Output " 颁发者: $($currentCerts.$thumbprint.Issuer)"
Write-Output " 有效期: $($currentCerts.$thumbprint.NotBefore) - $($currentCerts.$thumbprint.NotAfter)"
$differencesFound = $true
}
}
# 检查默认证书是否被篡改
foreach ($thumbprint in $defaultCerts.PSObject.Properties.Name) {
if ($currentCerts.PSObject.Properties.Name.Contains($thumbprint)) {
if ($defaultCerts.$thumbprint.Subject -ne $currentCerts.$thumbprint.Subject -or
$defaultCerts.$thumbprint.Issuer -ne $currentCerts.$thumbprint.Issuer -or
$defaultCerts.$thumbprint.NotBefore -ne $currentCerts.$thumbprint.NotBefore -or
$defaultCerts.$thumbprint.NotAfter -ne $currentCerts.$thumbprint.NotAfter) {
Write-Output "被篡改的证书: $($currentCerts.$thumbprint.Path)"
Write-Output " 原始主题: $($defaultCerts.$thumbprint.Subject)"
Write-Output " 当前主题: $($currentCerts.$thumbprint.Subject)"
Write-Output " 原始颁发者: $($defaultCerts.$thumbprint.Issuer)"
Write-Output " 当前颁发者: $($currentCerts.$thumbprint.Issuer)"
Write-Output " 原始有效期: $($defaultCerts.$thumbprint.NotBefore) - $($defaultCerts.$thumbprint.NotAfter)"
Write-Output " 当前有效期: $($currentCerts.$thumbprint.NotBefore) - $($currentCerts.$thumbprint.NotAfter)"
$differencesFound = $true
}
}
}
if (-not $differencesFound) {
Write-Output "未发现恶意证书。"
}
将 defaultCerts.json
、currentCerts.json
、script3.ps1
放在同级目录下,执行 script3.ps1
可以发现当前系统相对于纯净的系统,多了很多证书,接下来就要判断这些证书是否为恶意攻击者留下的
这并不简单,分两步走,一方面是在线校验这些证书是否签名有效,证书链完整
此时用到 script4.ps1
# 定义证书文件所在的目录路径
$certificateDirectory = '.\'
# 获取指定目录下的所有证书文件
$certFiles = @(
Get-ChildItem -Path $certificateDirectory -Filter '*.cer'
Get-ChildItem -Path $certificateDirectory -Filter '*.crt'
)
# 遍历每个证书文件
foreach ($file in $certFiles) {
try {
# 读取证书文件
$certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($file.FullName)
# 初始化证书链
$chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
$chain.ChainPolicy.RevocationMode = [System.Security.Cryptography.X509Certificates.X509RevocationMode]::Online
$chain.ChainPolicy.UrlRetrievalTimeout = [TimeSpan]::FromMinutes(1)
$chain.ChainPolicy.VerificationFlags = [System.Security.Cryptography.X509Certificates.X509VerificationFlags]::NoFlag
# 构建证书链并检查状态
if (!$chain.Build($certificate)) {
# 证书验证失败时输出证书的详细信息
Write-Host "----------------------------------------------------------------------------"
Write-Host "Validation failed for certificate: $($file.Name)"
Write-Host "Subject: $($certificate.Subject)"
Write-Host "Issuer: $($certificate.Issuer)"
Write-Host "Not Before: $($certificate.NotBefore)"
Write-Host "Not After: $($certificate.NotAfter)"
Write-Host "Thumbprint: $($certificate.Thumbprint)"
Write-Host "Serial Number: $($certificate.SerialNumber)"
Write-Host ""
# 输出错误信息,每个错误后面紧跟分号,最后一行不带分号
foreach ($status in $chain.ChainStatus) {
Write-Host "Error: $status.Status - $($status.StatusInformation)" -NoNewline
}
}
}
catch {
Write-Host "Failed to process file '$($file.Name)': $_"
}
}
将上述证书复制一份到与script4.ps1
同一级目录,并执行 script4.ps1
可以看到这里有两个证书是校验失败了的,对于校验失败的证书,我们需要严格对待,与运维相关人员做详细确认,是否为正常程序留下的证书
对于校验成功的证书,我们要进行第二部,找到证书使用者或者说被颁发者信息(script3.ps1
得到的结果中 CN 对应字符串),之后去威胁情报平台或者搜索引擎中查找相关信息
0x03 账号信息¶
1. 查看用户¶
cmd中输入
此时,会显示出相关的系统账号:
此命令无法看到隐藏账号的情况,例如 admin$
2. 查看用户组¶
cmd中输入
此时,会显示出所有的用户组:
【 Windows Server 2016 】 默认情况
-------------------------------------------------------------------------------
*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
中输入
lusrmgr能够看到常规的隐藏账户情况,即net user admin$ 123456 /add
这类方式添加的隐藏账号
右键用户查看属性即可看到相关用户信息
【 Windows Server 2016 】 默认情况
其他组均为空
2) 注册表查看隐藏账户¶
regedit
为打开注册表编辑器快捷指令
win + r
中输入
不同版本的操作系统位置不同
Windows 2016
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
SAM 目录需要赋予权限,应急结束时记得取消权限
也可以通过命令行命令查询注册表
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\ProfileList\ /s
reg query HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
也可以过滤一下
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\ProfileList\ /s | For /F "tokens=3" %i in ('findstr ProfileImagePath') do @echo %i
Tips:
- Windows reg query 遇到空格的处理方法多少有些奇怪,整体用双引号引上不行,反斜线也不太行,得用双引号把空格引上
- 如果一个用户只是被创建了而没有登录,在注册表中可能是看不到这一项的,因此做实验的朋友们记得登录一次
【Windows Server 2016 】 默认情况
3) wmic查询用户¶
可以通过wmic命令进行查询用户,并且该命令可以直接查询到用户的详细数据,包括隐藏账户
wmic useraccount get /value # 查询用户的详细数据
wmic useraccount get Name,Status,sid # 查询目前有哪些用户,以及是否启用,Status标志位为:OK/Degraded,OK为启用状态
【 Windows Server 2016 】默认情况
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 命令行
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盾检测出来后,右键删除其实是删除了
这个注册表项,但是对于下面的注册表并没有删除
这种删除有效,但严格来说不够完整,可以去注册表删除用户对应的注册表
删除注册表失败可能是权限不够,修改权限或者通过 psexec
以 SYSTEM
权限打开注册表编辑器就可以了,一定要确定好删除的是恶意账号,别删除错了
0x04 登录信息¶
1. 命令行查询本地/远端会话¶
该命令为查看当前系统的会话,查看是否有人使用远程终端登录服务器,所以同样可以看到账号异常
2. 任务管理器¶
任务管理器默认看不到 SMB
连接会话
0x05 启动项¶
启动项排查主要有以下方法和内容,包含了常规的检查办法,还有基本的启动项目录,都需要检查一遍,同时注册表是作为启动项检查方式之一,存在固定的注册表位置和语句,以下也有列举。
1. msconfig¶
msconfig
为打开系统配置程序,内含开机自启项目
win + r
输入
不是很建议使用这个程序来查看开机自启,只能作为查缺补漏项
可以查看到常规系统启动项,并且可以右键查看相应的启动项文件位置,也可以通过右键属性查看相应信息,但是此方法无法看到组策略自启动脚本,实测注册表自启动项也看不到
【 Windows Server 2016 】 默认情况
2. 全局登录自启动目录¶
win + r
输入
一般具体路径如下:
该目录下存在的程序会在用户登录时,以登录用户的权限自动执行程序
【 Windows Server 2016 】 默认情况
3. 用户登录自启动目录¶
具体路径如下:
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. 注册表查看启动项¶
以下为注册表中启动项相关的所有位置,建议都排查一遍:
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
HKEY_LOCAL_MACHINE\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\SYSTEM\CurrentControlSet\Control\Print\Monitors
// 打印处理器
HKEY_LOCAL_MACHINE\SYSTEM\[CurrentControlSet or ControlSet001]\Control\Print\Environments\[Windows architecture: e.g., Windows x64]\Print Processors\[user defined]\Driver
// Active Setup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\*\StubPath
// 登录脚本
HKEY_CURRENT_USER\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
和 &
进行命令拼接进行查询,如下(建议使用 &
而不是 &&
):
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
查询脚本,可以将要查询的内容填写进去,下面代码里只填写了几条作为案例
$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 】 默认情况
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
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中输入:
打开本地组策略中心
计算机配置 => Windows设置 => 脚本(启动/关机)
用户配置 => Windows设置 => 脚本(登录/注销)
此处可以添加开机启动的程序、批处理文件和Powershell脚本,开机时就会根据脚本自动运行添加到程序或任务
此处的任务是不会显示在启动或msconfig里的
以下目录对应的相应的脚本存放目录
//计算机设置处
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown
//用户配置处
C:\Windows\System32\GroupPolicy\User\Scripts\Logon
组策略中心启动/关机的程序或脚本位置并不是固定的,可以随意指定,也就是说最终执行以组策略配置处为准。即使上面的目录中存在程序或脚本,但是在组策略配置处没有添加,也不会执行
相关注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy\Scripts
HKEY_USERS\<sid>\Software\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Logoff
HKEY_USERS\<sid>\Software\Microsoft\Windows\CurrentVersion\Group Policy\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 】
0x06 计划任务¶
定时任务经常是病毒、后门、权限维持等恶意行为的常见操作对象,通过添加新的定时任务,启动恶意脚本、Powershell或者其他命令行语句来达到权限维持或者扩散的目的
排查计划任务开始前,需要先开启计划任务记录,以防相关任务未记录导致无法排查
此处计划任务建议主要以 注册表 排查为主,清晰明了,同时展示内容也相对省去了很多不必要的内容。
1. taskschd.msc 任务计划程序¶
taskschd.msc
为打开任务计划程序
win + r
中输入
可以看到近期活动的计划任务
该处需要注意的是,右侧的两个选项卡
-
显示所有正在运行的任务
-
开启/禁用所有任务历史记录
如右侧显示开启所有任务历史记录,请点击开启,该选项会开启定时任务运行历史记录,有助于排查
点击显示所有正在运行的任务
选项卡,可以显示当前正在运行的定时任务
计划任务中,任务详情需点击相关的计划任务,下面会显示该计划任务属性详情
需要着重注意以下选项卡:触发器、操作和历史记录
其中都会存储定时任务相关的信息,可以帮助排查
以下为病毒创建的计划任务,属性->操作 里可以看到该计划任务所执行的具体操作
点击左侧 任务计划程序(本地)
,显示如下
任务状态可以选择时间,假设选择 24 小时,下面显示的是从现在起,向前数 24 小时,在这时间段启动的任务状态
计划任务状态有以下几种
- 已准备就绪(Ready):任务已经配置好,并且等待触发执行。
- 运行中(Running):任务当前正在执行中。
- 已停止(Stopped):任务已经停止,不再执行。
- 禁用(Disabled):任务已被禁用,不会触发执行。
活动任务指的是当前正在运行的计划任务。这些任务是已经被触发并且正在执行中的任务。活动任务可能包括自动触发的任务和手动触发的任务,任务未过期
2. schtasks 查看定时任务列表¶
在Windows中通常用at
和schtasks
命令添加计划任务,其中at
命令默认是以System权限执行,但是从 Win8开始不再支持 at
命令,所以以下以schtasks
命令来进行介绍
cmd中输入:
即可看到计划任务命令相关用法
可以列出计划任务的信息,但是默认也会非常长,建议输出到文件中查看
schtasks
的 query
指令有三种输出格式, TABLE、LIST、CSV
,如果希望以表格的形式查看,也可以尝试
经过测试,table
的效果不是很好,可以导出到文件中进行查看。CSV
格式还是不错的,可以导出成 CSV
文件
如果不希望每一大项都有一份标题,可以考虑保留一份标题,之后输出纯内容,当然,也可以直接在 excel
中去重等方式完成
如果想查看某一项的内容,可以使用路径+名称的方式
如果想查找指定的计划任务,需要使用 /TN
参数,schtasks
命令对于空格处理允许整体使用双引号,也允许仅仅把空格用双引号引上
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) 计划任务本身的注册表¶
-
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
- ServiceDll:该值指定计划任务服务的动态链接库 (DLL) 文件路径和名称。这个 DLL 包含了计划任务服务的实现代码。
- ServiceDllUnloadOnStop:该值指示当计划任务服务停止时是否卸载 ServiceDll 指定的 DLL。如果该值为 1,则服务停止时会卸载 DLL;如果该值为 0,则 DLL 不会在服务停止时卸载。
- ServiceMain:该值是一个字符串,指定计划任务服务的入口点函数。这个函数在计划任务服务启动时被调用,并负责初始化服务。
- Security 这个项存储了计划任务服务的安全设置,包括访问权限和安全描述符。
【 Windows Server 2016 】默认情况
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
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Parameters
ServiceDll REG_EXPAND_SZ %systemroot%\system32\schedsvc.dll
ServiceDllUnloadOnStop REG_DWORD 0x1
ServiceMain REG_SZ ServiceMain
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule\Security
Security REG_BINARY 01001480900000009C000000140000003000000002001C000100000002801400FF010F000101000000000001000000000200600004000000000014008D00020001010000000000050B00000000001800DD010E000102000000000005200000002002000000001400FF010F00010100000000000512000000000018008D00020001020000000000052000000021020000010100000000000512000000010100000000000512000000
2) 计划任务中任务的注册表¶
计划任务的 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
值后,就可以在下面的注册表中查看具体该计划任务具体配置
可以通过搜索来找到对应的计划任务配置
- Actions:这个项存储了任务的操作(Actions)。它包含了任务执行时要执行的操作的详细信息,例如要运行的程序或脚本以及相关的参数。
- Author:这个项表示任务的作者或创建者。它记录了任务创建时的作者信息。
- Date:这个项表示任务的日期。它记录了任务的创建或修改日期。
- DynamicInfo:这个项存储了任务的动态信息(Dynamic Information)。它可能包含任务最近执行的状态、结果或其他与任务执行相关的信息。
- Hash:这个项存储了任务的哈希值(Hash)。哈希值是根据任务的属性和内容计算得出的唯一标识符,用于验证任务的完整性和一致性。
- Path:这个项表示任务的路径。它记录了任务所在的文件路径或注册表路径。
- Schema:这个项存储了任务的架构(Schema)。它定义了任务的结构和属性,包括触发器、操作和其他相关信息。
- Triggers:这个项存储了任务的触发器(Triggers)。它包含了触发任务执行的条件和设置,例如计划时间、事件触发或系统状态变化等。
- URI:这个项表示任务的统一资源标识符(URI)。它是一个唯一的标识符,用于标识任务的位置或资源。
所以也就是说将该注册表中的内容都看一遍,就可以获取到所有的计划任务
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Schedule\TaskCache\Tasks\
4. 计划任务目录文件¶
计划任务服务会讲所有设置的计划任务保存一份儿到文件,具体路径为
使用记事本打开相关文件
这里提一点,修改计划任务文件不会影响计划任务的执行,通过计划任务程序修改计划任务的属性或者禁止计划任务再启动后,会将计划任务内容写入到计划任务文件中
删除计划任务文件不耽误计划任务执行,也不耽误计划任务显示
5. 计划任务日志文件¶
打开日志管理器
应用程序和服务日志 -> 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 entries
和 Hide Windows entries
这就显示出来了
7. 隐藏计划任务排查¶
如果上面的方法你都找不到计划任务,可以参考我们的文章 《计划任务的攻防战 | Window 应急响应》
https://mp.weixin.qq.com/s/y9_9P6ggxGMrdGMFT-I34A
0x07 网络连接¶
1. netstat¶
cmd中输入:
命令解释如下:
可以通过如下命令,获取当前所有UDP和TCP连接,同时列出所有的进程PID和进程执行程序及对应的服务简称
连接状态有以下几种
- LISTENING:表示监听 ,表示这个端口处于开放状态, 可以提供服务
- ESTABLISHED":表示是对方与你已经连接 正在通信交换数据
- CLOSING:表示关闭的 表示端口人为或者防火墙使其关闭(也许服务被卸载)
- TIME WAIT :表示正在等待连接 就是你正在向该端口发送请求连接状态
2. nbtstat¶
用于显示与 NetBIOS 相关的网络连接和统计信息
3. PowerShell¶
4. Get-NetworkConnection¶
这是一个开源脚本,通过 Powershell 编写,可以获取网络连接的时间戳
https://github.com/IllusiveNetworks-Labs/Get-NetworkConnection
5. System Informer¶
https://systeminformer.sourceforge.io/
Process Hacker 的升级版
0x08 IPC 共享¶
【 Windows Server 2016 】默认情况
0x09 进程¶
1. 任务管理器¶
任务栏右键选择任务管理器 或者使用快捷键 Ctrl+Shift+Esc
快速打开任务管理器,如下图:
可以对进程右键,进一步查看进程信息
2. tasklist¶
cmd中输入:
常用命令解析:
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) 查询指定用户权限的进程¶
2) 查询指定用户正在运行中的进程¶
3) 根据pid查询进程¶
4) 查询指定进程使用的模块¶
3. taskkill¶
taskkill 主要为终止进程操作,需要注意的是使用该命令时,cmd 命令行最好使用管理员权限,常用命令如下:
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环境后,可以通过
本次只涉及如下命令
- Get-Process //相当于
tasklist
命令,直接列出进程 - Format-list * //组合使用,列出进程的详细信息
- Stop-Process //暂停进程
1) Get-Process¶
Powershell里输入:
常规用法:gps -name “*{进程名}*”
组合format-list *
使用
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
获取帮助
演示:
5. wmic¶
wmic 为 WMI(Windows Management Instrumentation,Windows管理工具)的扩展 ,提供了从命令行接口和批处理脚本执行系统管理的支持
可以支持快速查询系统进程相关信息,尤其是可以查询进程命令内容,这对于常规挖矿等进程,可以直接看到进程中的远程矿池地址
cmd/Powershell中输入:
# 列出进程列表,与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中输入:
7. tlist.exe官方调试工具¶
tlist.exe是Microsoft官方提供的windows调试工具包中的工具之一,用于操作进程。
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/tlist-commands
下载后,放在目录下,使用cmd命令行进行操作:
1) 通过 pid 查询进程信息¶
tlist 2796 # 直接跟对应进程的pid,会列出该进程的详细信息,可以看到具体的进程命令、内存信息、dll信息等
tlist msedge # 直接跟进程名称,也同样列出相关信息,此处可以使用通配符
tlist msedg* # 通配符,列出所有msedg*相关进程的详细信息
tlist -v 2796 # -v查看详细信息
2) 查看进程之间的关联关系¶
tlist -g # -g会列出所有进程及所关联的进程,会在进程前面标注[1234],代表该进程是1234关联的进程,但是只能在win7以上系统使用
tilst -g 2796 # 列出指定pid进程的父进程[0]
tlist -g -t # 列出所有进程的进程树及关联的进程,-t为按照进程树列出,退格表示父子进程
可以看到以下进程前面有 [0] ,是相关进程的父进程:
通过缩紧来表示进程关系,缩紧表示父子关系:
3) 查看进程关联的活动服务¶
4) 其他命令解析¶
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. OpenArk¶
https://openark.blackint3.com/
https://github.com/BlackINT3/OpenArk
OpenArk 也是一款集成性的安全排查工具,用于对抗 Rootkit
11. 系统信息(msinfo32)¶
不知道这个程序是从哪代 Windows 加进来的,可以查看的信息不少
win + r
之后输入 msinfo32
或者直接搜索系统信息
可以看到进程开始的时间
0x10 环境变量¶
可以重点关注
path
和pathext
1. GUI 环境变量查询¶
常规查询方式如下:
右键此电脑-属性-高级系统设置-环境变量
也可以直接通过搜索栏搜索 环境变量
【 Windows Server 2016 】默认情况
2. set 命令查询基本信息¶
cmd中输入:
【 Windows Server 2016 】 默认情况
Administrator
用户
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中输入:
【 Windows Server 2016 】 默认情况
Administartor
用户
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
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修改,使之更不易被察觉
利用方式如下:
- 修改环境变量
# cmd中运行以下命令:
SETX COR_ENABLE_PROFILING 1
SETX COR_PROFILER {AABBCCDD-1234-1234-1234-AABBCCDDEEFF} # {}为CLSID内容
- 修改注册表
# 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_PROFILING
和COR_PROFILER
的键值
- 通过注册表查询
0x11 系统基本信息及补丁¶
1. 系统基本信息查询¶
cmd中输入命令:
列出系统信息后,主要关注补丁信息:
2. wmic查询补丁信息¶
cmd中输入:
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.首先更新微软漏洞库文件
- 2.将目标服务器的
systeminfo
命令执行的结果复制保存到本地
- 3.本地使用
systeminfo
命令结果进行检测:
命令结果如下:
4. WES-NG¶
Windows Exploit Suggester - Next Generation (WES-NG)
https://github.com/bitsadmin/wesng
声称是下一代 Windows Exploit Suggester
具体使用方法可以查看 Github
上的项目详情
0x12 系统日志分析¶
无论大家使用哪款程序来帮助分析日志,我都建议大家先把日志备份一份儿,同时在同款主机上测试一下工具的可用性
1. 事件查看器¶
win+r
中输入,打开系统事件查看器:
主要关注以下日志内容:
- 安全日志
记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。安全日志也是调查取证中最常用到的日志。
- 系统日志
记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等。
- 应用程序日志
包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。
当安全日志被删除时,可通过以下日志查看RDP连接日志
- 98 建立网络连接
- 131 建立新的网络连接
- 261 已收到一个连接
- 1149 远程桌面服务: 身份验证成功
- 21 RDP远程登录成功
- 22 已收到 shell 启动通知(22总是伴随着21)
- 23 会话注销成功
- 24 会话断开连接
- 25 会话重新连接成功
- 39 与会话断开连接
- 40 与会话断开连接原因代码
针对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 | 清理日志 |
4778 | 用户重新连接到会话 |
4779 | 用户结束了一个会话 |
4648 | runas 登录 |
其中每个登录事件日志中,还会有登录类型
字段,该字段代表为所使用的登录方式为哪种,如下表:
登录类型 | 描述 | 说明 |
---|---|---|
2 | 交互式登录(Interactive) | 用户在本地进行登录 |
3 | 网络(Network) | 最常见的情况就是连接到共享文件夹或共享打印机时 |
4 | 批处理(Batch) | 通常表明某计划任务启动 |
5 | 服务(Service) | 每种服务都被配置在某个特定的用户账号下运行 |
7 | 解锁(Unlock) | 屏保解锁/RDP会话重连接 |
8 | 网络明文(NetworkCleartext) | 登录的密码在网络上是通过明文传输的,如FTP |
9 | 新凭证(NewCredentials) | 使用带/Netonly参数的RUNAS命令运行一个程序 |
10 | 远程交互(RemoteInteractive) | 通过终端服务、远程桌面或远程协助访问计算机 |
11 | 缓存交互(CachedInteractive) | 以一个域用户登录而又没有域控制器可用 |
可以通过筛选当前安全日志的方式,查看是否存在爆破纪录,如果存在大量、且时间连续的4625日志,说明存在爆破记录:
也可以筛选上面敏感的事件id进行分析,当前日志分析的前提是日志完好的保存且记录配置正确
2. 日志文件¶
Windows Server 2016 的日志存储位置为
其中包含各种日志
安全日志系统默认存放位置:
系统日志默认存放位置:
应用程序日志默认存放位置:
3. wevtutil¶
wevtutil.exe
是 Windows 自带的查询日志的命令行工具
查询日志来源为默认的 evtx
日志文件:
相关参数的简单用法官方文档内有部分解释:
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条:
查找安全日志中,事件ID为4624(登录成功),并且登陆类型为10(远程 RDP 登录)的日志,输出最近3条:
wevtutil qe security /q:"*[EventData[Data[@Name='LogonType']='10'] and System[(EventID=4624)]]" /f:text /rd:false /c:3
当前操作系统没有被远程 RDP 登录过,所以为空
查找安全日志中,目标账户名为'XXX'的日志:
查找安全日志中,在2022-06-28 20:13到2022-06-28 22:06期间所有事件id为4624(登录成功)的日志:
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
)
如果直接 Select *
会查处一堆,包括查询到的所有的内容,当然我们限制查询条数
如果只想看其中几项,可以在 Select
后面指定,但是如何知道到底有哪些项呢?
这样就可以选择了
2) Get-EventLog¶
查询登录成功的日志
如果想查询实际内容,与上面内容一样
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语句格式:
安全日志中的可查询字段内容:
字段名 | 字段内容 | 查询方式 |
---|---|---|
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为登录失败的日志,并且要最近的开始展示
-
查询某个时间内的登录成功日志,并且要看所使用的用户名,ip,登录时间
-
extract_token(strings,5,'|')
结果为账户名 -
extract_token(message,38,' ')
结果为登录ip,null为本地登录 -
timegenerated
结果为日志产生时间
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
以下为常用的查询语句:
-
查询登录成功的事件
-
查询登录失败的事件
-
查询指定时间范围内的登录成功/失败日志
TimeGenerated>'2018-06-19 23:32:11' and TimeGenerated<'2018-06-20 23:34:00'
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
-
筛选指定IP的远程登录成功日志
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做了一个简单的命令调用,工具内预先写了关于 smb
和 rdp
两个协议的日志筛选规则,可以筛选日志内smb协议和rdp协议的登录成功或失败的日志。
虽然内置规则简单,但是胜在方便快捷,对应场景下使用简单方便。
工具使用如下:
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:
看到如下截图即代表安装完成:
2) 使用方法¶
在事件查看器中,找到:
事件查看器--> 应用程序和服务日志--> Microsoft--> Windows--> Sysmon--> Operational
当前模块下所有日志即为sysmon监控记录的日志,可以点击某条日志,在下面板查看日志详情内容。
3) sysmon view可视化分析¶
在 sysmon 目录下管理员启动 cmd,输入如下命令,会在当前目录下生成 eventlog.xml 文件:
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 地址)和帐户名关联到与登录相关的事件中,并将其显示为图形。这样,就可以查看哪个帐户尝试以及使用了哪个主机。
借用官网的图
10. FullEventLogView¶
https://www.nirsoft.net/utils/full_event_log_view.html
FullEventLogView 是一款查看 Windows 日志的利器,可以将所有的日志根据时间线进行聚合显示,而且可以加载离线的日志文件,非常推荐使用
0x13 命令历史¶
1) cmd命令行历史¶
Windows cmd命令行同样存在命令历史,可以通过相关命令/操作进行查询,但是需要注意的是:
cmd命令历史只能在未关闭的cmd命令窗中进行查询,如果cmd窗口关闭,或未通过cmd命令窗进行的命令操作,是不会记录的
原理为每次新建cmd窗口时,进程会开辟一处缓冲区用来写入相关命令历史,如果关闭窗口,即会清空
未关闭的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
的历史记录一样,也是关掉窗口就没了
还有三个简写命令,主打一个越来越简
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 中默认为
默认情况下并不记录时间,无法像 Linux 那样通过配置环境变量的方法让已经记录的命令显示时间
经过测试,重启后不会删除记录
默认情况下 Powershell
的日志中记录的信息不是很有帮助,这里就不展示了
0x14 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
中执行
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 】默认情况
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
默认情况下都不存在这些文件
0x15 PowerShell 日志¶
Win + r
输入 eventvwr
应用程序和服务日志 -> Windows Powershell
0x16 PowerShell Alias¶
直接在 Powershell
命令行输入
【 Windows Server 2016 】默认情况
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
0x17 服务程序¶
Windows服务是在Microsoft Windows操作系统中运行的后台应用程序。服务是一种特殊类型的进程,它们被设计为在操作系统启动时自动启动,并在操作系统运行期间持续运行,即使用户没有登录到系统也是如此。这使得它们能够在系统背后执行各种任务,如网络通信、文件共享、打印管理、安全性等。
1. services.msc¶
win + r
中输入:
需要关注的点有:
1) 服务名称、描述等信息¶
服务描述是否为空,为空项需要重点查看关注下
服务名称是否有明显异常的,异常的需要关注一下
2) 可执行文件、参数、启动类型¶
点击服务项后,右键选择属性 -> 常规
关注 可执行文件、启动参数、启动类型
启动类型有以下几种
- 自动 (延迟启动)
- 自动
- 手动
- 禁用
自动(延迟启动)是介于自动启动和手动启动之间的一种选项。当一个服务被配置为自动(延迟启动)时,在系统启动时并不会立即启动该服务,而是会延迟一段时间后再启动。这个延迟时间是由操作系统进行动态调整的,以确保系统启动过程的平稳性和效率。
3) 启动失败默认操作¶
点击服务项后,右键选择属性 -> 恢复
这里定义了服务失败时触发的操作,如果设置的是运行一个程序,并且在图中运行程序处指定了非默认程序,则需要重点关注
4) 依存关系¶
点击服务项后,右键选择属性 -> 依存关系
可疑的服务需要关注依存关系,停止服务时可能需要将依存关系服务都需要停止,依存次服务的服务可能也是异常服务
2. SC 命令¶
sc.exe
是操作服务控制管理器的命令行程序,此处可以用来查询可疑服务的快捷操作,在cmd中输入:
sc
如果想查询完整的所有信息似乎没有一个现成的指令,可以使用下面的 bat
来操作,设置服务名称
如果输出的文件中文乱码,尝试将第二行的 REM
去掉
@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
直接执行会显示所有的服务
这个信息可以用来对比被害系统是否有哪些默认不存在的服务
【 Windows Server 2016 】默认情况
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
查询起来就很容易进行筛选了,可以使用以下命令查看可以显示和筛选的项
选择显示的内容(以名称、执行命令行、显示名字、启动类型为例)
如果想以其中一项作为筛选条件,可以通过以下格式进行,以服务名称为例
经过测试,发现这个命令在 Windows Server 2016
上并不能获取到启动执行参数
所以这里写了两个脚本,获取所有服务的信息以及获取指定某个服务的信息
获取所有的服务信息
$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"
}
}
查询某个服务的信息
$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¶
这样会显示出所有服务的所有信息,比较乱套,尝试选择部分写入到 CSV
文件中
wmic service get Name, DisplayName, Description, PathName, StartMode, StartName /FORMAT:CSV > services.csv
是以逗号为分隔符号的 CSV
文件,使用 Excel
打开需要设定分隔符为逗号
第一行会出现空行,可以删除掉,这样方便筛选
如果只想查询某一项服务
wmic service where "Name='ServiceName'" get Name, DisplayName, Description, PathName, StartMode, StartName
5. 注册表¶
1) 服务列表¶
这获取得多快你说
有几个注册表项可以设置服务在启动期间自动启动,默认在系统上并不存在
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 】默认情况
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
为例
2) Performance¶
每个服务的注册表项都可以包含一个子项 Performance
用于监控服务的执行,部分 Windows 系统存在关于此项的 1day
排查思路就是把服务的所有注册表项中包含 Performance
子项的,获取 Library
键的值,验证文件签名有效性以及签名发布者是否为微软
通过 Powershell
来完成
$microsoftCNS = @('Microsoft Corporation', 'Microsoft Windows', 'Microsoft Windows Hardware Compatibility Publisher', 'Microsoft Update', 'Microsoft Windows Publisher')
# 定义函数来进行签名校验
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') {
$publisher = $signature.SignerCertificate.Subject
# 解析发布者信息以提取 CN 字段的值
$cnValues = @(($publisher -split ', ' | Where-Object { $_ -like 'CN=*' }).Substring(3))
if ($cnValues.Count -eq 1) {
$cnValue = $cnValues[0]
# Write-Output "CN 字段的值: $cnValue"
# 判断 CN 字段是否为微软官方
if ($microsoftCNS -contains $cnValue) {
# Write-Output "CN 字段值为微软官方。"
return "Valid"
}
}
}
return "Invalid"
}
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
启动服务的工作原理:
- 服务注册:每个服务都在注册表中的特定位置注册,指定了服务的名称、可执行文件路径和其他相关信息。
svchost.exe
根据注册表信息:当计算机启动时,操作系统读取注册表中的服务配置信息,并确定哪些服务需要由svchost.exe
托管。- 创建
svchost.exe
进程:根据注册表中的配置信息,操作系统创建一个或多个svchost.exe
进程,并为每个进程分配一个唯一的服务组标识。 - 加载 DLL:每个
svchost.exe
进程根据其服务组标识加载相应的 DLL(动态链接库),这些 DLL 包含了实际的服务代码和逻辑。 - 启动服务:
svchost.exe
进程加载服务所需的 DLL 后,会启动和执行每个服务。每个服务在svchost.exe
进程中以独立的线程运行。
这么多服务要通过 svchost.exe
来启动,所以 svchost.exe
按照这些服务的特征将其进行了分组
但是这里是不会直接记录组内成员的服务 DLL
的,这些 DLL
记录在哪里呢?
在每个服务以上注册表位置的 ServiceDll
键对应的值
Parametersv6
键,它并不是一个固定的键,而是一种命名约定。Parametersv6
是用于区分不同版本的参数键,特别是在区分适用于 IPv6
的参数与适用于 IPv4
的参数时。
经过搜索,Windows Server 2016
中所有的默认服务注册表项只有 Dhcp
包含 Parametersv6
,所以就不做为查询特征了
所以这部分排查就是将所有服务注册表中包含 Parameters
子项的所有的 ServiceDll
中指定的可执行程序验证签名
还是通过 Powershell
进行排查
$microsoftCNS = @('Microsoft Corporation', 'Microsoft Windows', 'Microsoft Windows Hardware Compatibility Publisher', 'Microsoft Update', 'Microsoft Windows Publisher')
# 定义函数来进行签名校验
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') {
$publisher = $signature.SignerCertificate.Subject
# 解析发布者信息以提取 CN 字段的值
$cnValues = @(($publisher -split ', ' | Where-Object { $_ -like 'CN=*' }).Substring(3))
if ($cnValues.Count -eq 1) {
$cnValue = $cnValues[0]
# Write-Output "CN 字段的值: $cnValue"
# 判断 CN 字段是否为微软官方
if ($microsoftCNS -contains $cnValue) {
# Write-Output "CN 字段值为微软官方。"
return "Valid"
}
}
}
return "Invalid"
}
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. 服务相关日志¶
Windows Server 2016
中主要在以下位置
服务相关的日志ID
- 事件ID 7034 – 服务意外崩溃
- 事件ID 7035 – 服务发送启动/停止控制。
- 事件ID 7036 – 服务启动或停止
- 事件ID 7040 – 启动类型更改(启动 | 按需 | 禁用)
- 事件ID 7045 – 系统上安装了一个服务
重点关注 7045
事件
10. 排查隐藏的服务¶
针对仅通过 SDDL
进行权限控制的方式隐藏的,可以执行以下 Powershell
检查
$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 服务隐藏与排查
11. 进阶性排查¶
排查所有的服务的启动文件签名情况,部分攻击者可能利用权限配置的不合理,通过替换服务启动的应用程序进行提权或者权限维持
$microsoftCNS = @('Microsoft Corporation', 'Microsoft Windows', 'Microsoft Windows Hardware Compatibility Publisher', 'Microsoft Update', 'Microsoft Windows Publisher')
# 定义函数来进行签名校验
function Verify-FileSignature {
param (
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (Test-Path -Path $FilePath -PathType Leaf) {
$signature = Get-AuthenticodeSignature -FilePath $FilePath
if ($signature.Status -eq 'Valid') {
$publisher = $signature.SignerCertificate.Subject
# 解析发布者信息以提取 CN 字段的值
$cnValues = @(($publisher -split ', ' | Where-Object { $_ -like 'CN=*' }).Substring(3))
if ($cnValues.Count -eq 1) {
$cnValue = $cnValues[0]
# 判断 CN 字段是否为微软官方
if ($microsoftCNS -contains $cnValue) {
return "Valid"
}
}
}
return "Invalid"
}
return "File Not Found"
}
# 获取所有服务
$services = Get-WmiObject -Class Win32_Service | Where-Object { $_.PathName -ne $null }
foreach ($service in $services) {
$path = $service.PathName
# 去掉双引号
if ($path.StartsWith('"') -and $path.EndsWith('"')) {
$path = $path.Trim('"')
}
# 处理路径中包含空格的情况
$potentialPaths = @()
$parts = $path -split ' '
for ($i = 0; $i -lt $parts.Length; $i++) {
$potentialPath = ($parts[0..$i] -join ' ')
if (Test-Path -Path $potentialPath -PathType Leaf) {
$potentialPaths += $potentialPath
} elseif (Test-Path -Path "$potentialPath.exe" -PathType Leaf) {
$potentialPaths += "$potentialPath.exe"
}
if ($potentialPaths.Length -ge 1) {
break
}
}
# 逐个验证找到的可执行文件路径
foreach ($potentialPath in $potentialPaths) {
$result = Verify-FileSignature -FilePath $potentialPath
if ($result -ne 'Valid') {
Write-Host "---------------------------------------"
Write-Host "Service Name: $($service.Name)"
Write-Host "Executable Path: $potentialPath"
Write-Host "Signature Status: $result"
Write-Host ""
}
}
}
【 Windows Server 2016 】默认情况
0x18 远程桌面 RDP¶
1. 注册表查询 RDP 记录¶
所有本机连接过的远程桌面RDP,都会在注册表内记录,所以可以通过注册表进行排查RDP信息:
//注册表具体路径
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
文件,是最后一次连接的信息,双击打开即可看到
也可以直接打开 mstsc
直接查看
Windows Server 2016 默认并不会记录全所有的 RDP 连接其他服务器的信息,每台服务器只会记录最后一次登录的账户信息
0x19 DLL 检查¶
在安全模式下 DLL 搜索顺序如下
- DLL 重定向
API sets
SxS manifest redirection
Loaded-module list
Known DLLs
- 流程的包依赖关系图 (Windows 11,版本 21H2 (10.0;内部版本 22000) 及更高版本)
- 应用程序的文件夹
- 系统文件夹 (
C:\Windows\System32
) 使用GetSystemDirectoryA
函数检索此文件夹的路径 - 16 位系统文件夹 (
C:\Windows\System
) 没有获取此文件夹路径的函数,但会对其进行搜索 - Windows 文件夹 (
C:\Windows
) 使用GetWindowsDirectoryA
函数获取此文件夹的路径 - 当前文件夹
- 环境变量中列出的
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
加载顺序进行劫持,这里涉及一个很重要的注册表项
当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 文件
【 Windows Server 2016 】默认情况
AppInit_DLLs
键的值是空的
3. KnownDLLs¶
这个注册表用于指定系统已知的DLL文件列表。
在该注册表项中,每个子项对应一个已知的DLL文件,并且以DLL文件的名称作为子项的名称。例如,如果有一个名为 kernel32.dll
的子项,那么该子项指示系统已知并信任 kernel32.dll
这个DLL文件。
该注册表项的目的是为了提高系统的安全性。当应用程序需要加载一个DLL文件时,系统会首先检查该DLL文件是否在 KnownDLLs
注册表项中。如果是,系统将直接从指定的位置加载该DLL文件,而不会去搜索路径或其他目录。
也可以通过 Autoruns
进行查看
【 Windows Server 2016 】默认情况
右键导出为 reg
结果如下
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"
应急响应过程中可以看看是否有缺少的
0x20 WMI 排查¶
WMI 主要是创建 WMI 事件订阅实现持续控制,通常事件订阅是临时性的,会话结束后就会停止,WMI永久事件订阅,可以创建长期有效的订阅,即使订阅会话已经结束,订阅仍然持续存在。
WMI 事件订阅中有三个角色
- 事件过滤器(Event Filter):事件过滤器定义了订阅的事件条件。它指定了需要监听的WMI对象或类以及要监控的属性或方法的条件。事件过滤器使用WMI查询语言(WQL)来描述事件的筛选条件。
- 事件消费者(Event Consumer):事件消费者定义了在事件发生时要执行的操作。它可以是一个命令行、脚本或可执行文件,也可以是自定义的WMI操作。事件消费者根据事件的特定属性执行相应的操作。
- 绑定(Binding):绑定将事件过滤器和事件消费者连接起来,以建立订阅关系。绑定将事件过滤器与事件消费者相关联,使得在事件满足过滤器条件时,相应的事件消费者将被触发执行。
这听起来很像是 if...then
或者说信号与槽
攻击者通过事件过滤器定义要监听的操作,之后再定义监听到操作后要执行的动作,最后将两者绑定起来
排查思路就是找出当前系统所有命名空间的过滤器、消费者、绑定
经过测试发现,\root\subscription
和 \root\DEFAULT
两个命名空间均可以实现事件订阅后门,这在很多文章中并未提及,大家需要额外注意
部分文章指出 Autoruns
删除 WMI 后门效果不好,这不严谨,详情可以看后续部分
1. wmic¶
查询过滤器
wmic /namespace:"\\root\subscription" path __EventFilter get *
wmic /namespace:"\\root\DEFAULT" path __EventFilter get *
查询消费者
wmic /namespace:"\\root\subscription" path __EventConsumer get *
wmic /namespace:"\\root\DEFAULT" path __EventConsumer get *
查询绑定
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¶
查询过滤器
Get-WmiObject -Namespace "root\subscription" -Query "SELECT * FROM __EventFilter"
Get-WmiObject -Namespace "root\DEFAULT" -Query "SELECT * FROM __EventFilter"
查询消费者
Get-WmiObject -Namespace "root\subscription" -Query "SELECT * FROM __EventConsumer"
Get-WmiObject -Namespace "root\DEFAULT" -Query "SELECT * FROM __EventConsumer"
查询绑定
Get-WmiObject -Namespace "root\subscription" -Class "__FilterToConsumerBinding"
Get-WmiObject -Namespace "root\DEFAULT" -Query "SELECT * FROM __EventConsumer"
当然,我给大家准备了脚本一键查询
$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¶
删除过滤器
删除消费者
wmic /NAMESPACE:"\\root\subscription" path CommandLineEventConsumer where Name="ConsumerName" delete
删除绑定
wmic /NAMESPACE:"\\root\subscription" path __FilterToConsumerBinding where Filter="__EventFilter.Name='FilterName'" delete
2) Powershell¶
删除过滤器
Get-WmiObject -Namespace "root\subscription" -Class "__EventFilter" | Where-Object {$_.Name -eq "FilterName"} | ForEach-Object { $_.Delete() }
删除消费者
Get-WmiObject -Namespace "root\subscription" -Class "CommandLineEventConsumer" | Where-Object {$_.Name -eq "ConsumerName"} | ForEach-Object { $_.Delete() }
删除绑定
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
命名空间¶
【 Windows Server 2016 】默认情况
subscription
DEFAULT
CIMV2
msdtc
Cli
SECURITY
SecurityCenter2
RSOP
PEH
StandardCimv2
WMI
AccessLogging
directory
Policy
InventoryLogging
Interop
Hardware
ServiceModel
Microsoft
Appv
2. 查询包含 CommandLineEventConsumer
类的命名空间¶
$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 】默认情况
3. 查询所有 WMI
中存在的过滤器、消费者、绑定¶
$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 】默认情况
【 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
剩下都是空的
0x21 最近打开的文件¶
是windows下用户打开的文档历史文件记录
win + r
输入 Recent
这一般用户确定某个用户已经失陷,之后切到该用户后排查的项
0x22 敏感文件夹检查¶
- 临时目录
- 垃圾桶目录
- 被删除用户的家目录
- public 目录
- web目录
1. 临时目录¶
1) 用户临时目录¶
每个用户都有临时目录,通常为 C:\Users\<Username>\AppData\Local\Temp
2) 系统临时目录¶
2. 垃圾桶目录¶
每个本地硬盘分区都有一个隐藏的系统文件夹用于存储该分区删除的文件。回收站的实际物理路径通常是:
如何进入该目录呢?
3. 被删除的用户家目录¶
经过测试,默认情况下如果用户被删除,其家目录是不会被删除的,可以通过对比用户家目录和用户,查看是否存在异常
4. public 目录¶
也就是公用目录,如上图所示
5. web 目录¶
web 目录具体位置就取决于使用的 web 服务器的配置了可以考虑使用 webshell
检测工具和杀毒软件进行检测
0x23 系统完整性检查¶
sigverif 是一个用于验证 Windows 系统文件签名的命令行工具。它可以检查系统文件是否被篡改或损坏,以确保系统的完整性和安全性。
sigverif 命令可以检查所有系统文件,包括驱动程序、系统组件、应用程序等。它通过比较系统文件的哈希值与已知的正确哈希值来验证文件的完整性。如果文件的哈希值与已知的正确哈希值匹配,则文件未被篡改;如果不匹配,则文件可能已被篡改或损坏。
如果想看详细的内容,可以点击高级,去日志中查看
0x24 Bits Job 检查¶
列出所有任务
Windows Server 2016
中提示 bitsadmin
已经被弃用了,现在都通过 Powershell
来管理 bits
服务
如果发现存在攻击者留下的 Job
,可以使用下面的命令删除
0x25 浏览器排查¶
浏览器排查主要有三个方面
- 下载记录
- 访问记录
- 浏览器扩展
这里还是以自带的 ie
浏览器为例,Chrome、Edge、Firefox
大家肯定都会检查
1. 下载记录¶
2. 访问记录¶
3. 浏览器插件¶
0x26 屏幕保护排查¶
HKEY_CURRENT_USER\Control Panel\Desktop
SCRNSAVE.exe
设置为恶意 PE 路径ScreenSaveActive
- 设置为“1”以启用屏幕保护程序ScreenSaverIsSecure
- 设置为“0”无需密码即可解锁ScreenSaveTimeout
- 在执行屏幕保护程序之前设置用户不活动超时
在 Windows Server 2016 中,默认没有 SCRNSAVE.exe
,如果检查过程中发现该项,可以重点关注
【 Windows Server 2016 】默认情况
0x27 NetSh 排查¶
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
【 Windows Server 2016 】 默认情况
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
0x28 辅助功能程序¶
比较经典的是替换粘滞键,未登录情况下通过连按 5 下 shift 进行获取shell
功能名称 | 文件位置 |
---|---|
粘滞键 | C:\Windows\System32\sethc.exe |
实用程序管理器 | C:\Windows\System32\utilman.exe |
屏幕键盘 | C:\Windows\System32\osk.exe |
放大镜 | C:\Windows\System32\Magnify.exe |
讲述人 | C:\Windows\System32\Narrator.exe |
显示切换器 | C:\Windows\System32\DisplaySwitch.exe |
应用程序切换器 | C:\Windows\System32\AtBroker.exe |
可以通过沙箱或者签名进行验证,这里需要注意: cmd.exe 这种程序也是有微软签名的,不能仅用签名进行验证
签名验证可以参考知识点附录 -> 如何验证程序签名
0x29 AppCert DLLs¶
AppCert DLLs是一个Windows注册表项,通常用于控制应用程序的证书验证。当有进程使用了CreateProcess、CreateProcessAsUser、CreateProcessWithLoginW、CreateProcessWithTokenW或WinExec等函数时,这些进程会获取HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\AppCertDlls注册表项,此项下的dll都会加载到此进程。
存在后门时可能是这个样子
图片来源
https://blog.csdn.net/qq_36374896/article/details/107005578
【 Windows Server 2016 】默认情况
Windows Server 2016 中默认没有这个注册表项
0x30 AppInit DLL¶
AppInit DLL(Application Initialization DLL)是一种在Windows操作系统中使用的动态链接库(DLL)。它的作用是在应用程序加载时,可以用于执行自定义的初始化和配置操作。
下面是AppInit DLL的一些常见用途和功能:
- 应用程序初始化:AppInit DLL可以用于执行应用程序的初始化操作。例如,它可以加载应用程序所需的其他依赖项、设置环境变量、初始化全局变量等。
- 钩子和拦截:AppInit DLL可以用于创建钩子(hook)和拦截应用程序的函数调用。通过拦截应用程序的API调用,AppInit DLL可以修改或监视应用程序的行为。这可以用于实现各种功能,如检测和阻止恶意行为、记录日志、修改应用程序的行为等。
- 兼容性修正:AppInit DLL可以用于修复应用程序的兼容性问题。它可以拦截应用程序的调用,并在运行时对这些调用进行修改,以使应用程序能够在特定的操作系统版本或环境中正常工作。
因此,AppInit DLL 用来设置后门非常合适,注册表位置如下
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows
也可以通过 Autoruns
进行查看
【 Windows Server 2016 】默认情况
默认情况下存在该键,两个位置都是空的
0x31 Application Shimming¶
这是一种在Windows操作系统中使用的兼容性技术,旨在解决应用程序在不同操作系统版本上的兼容性问题。Application Shimming 的原理是在应用程序执行时,通过注入特定的代码或修改应用程序的行为,来实现兼容性修复或功能增强。这些修改通常是通过Shim引擎来实现的,Shim引擎会拦截和修改应用程序的API调用。
攻击者可能会利用Application Shimming 来创建后门的原因包括:
- 拦截和修改应用程序的行为:Shim引擎可以拦截应用程序的API调用,并修改它们的行为。攻击者可以利用这一特性,将恶意代码注入到应用程序中,以实现远程控制、数据窃取、命令执行等恶意操作。
- 绕过安全措施:Application Shimming 可以绕过一些安全措施,如防火墙、杀毒软件等。攻击者可以利用这一特性,使恶意行为在被安全软件检测之前或之后执行,从而避免被检测和阻止。
- 持久性访问:由于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
缓存位置
这里都是二进制数据,虽然能看到字符,建议只用来做参考
【 Windows Server 2016 】默认情况
默认
自定义
0x32 IFEO Injection 排查¶
Image File Execution Options (IFEO)
是一个 Windows 调试功能,而不是一个后门。IFEO 的主要目的是允许开发人员调试和跟踪特定的可执行文件。
IFEO 提供了一种机制,使开发人员能够将一个调试器程序关联到特定的可执行文件,并在执行该可执行文件时启动调试器。这对于开发、调试和分析应用程序非常有用。
当给定的可执行文件被启动时,操作系统会检查注册表中的 IFEO 设置。如果找到了对应的注册表项,系统会自动启动所配置的调试器程序,并将目标可执行文件作为参数传递给调试器。这样,开发人员就可以使用调试器来监视和分析目标应用程序的运行过程,以便调试和解决问题。
红框中就是可以被调试的程序,如果在这些项某个项,例如iexplore.exe
中新增一对键值,键的名字为 debugger
,值为要执行的程序,例如 calc.exe
,就会在启动 iexplorer.exe
的时候启动计算器
这里需要注意,设置后点击ie浏览器并不会启动ie ,而是只启动调试器,也就是这里的计算器
当然了,聪明的攻击者肯定会在 Payload
中启动原程序,以达到隐藏的目录
这么老多目录,还是通过 Powershell
来完成吧
$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 】默认情况
0x33 COM 劫持¶
COM(Component Object Model)是一种微软公司开发的软件组件技术,用于在Windows操作系统中实现软件组件之间的通信和交互。COM 提供了一种标准的、可扩展的机制,使不同的应用程序能够通过接口进行相互通信和调用。
COM 的主要功能包括:
- 组件化:COM 将软件功能划分为独立的组件,每个组件可以独立开发、测试和部署。这样的组件化方式使得软件开发更加模块化、可维护性更强。
- 接口定义:COM 使用接口(Interface)来定义组件之间的通信规范。每个组件提供一个或多个接口,其他组件可以通过接口访问组件的功能。
- 组件注册:COM 组件需要在操作系统中进行注册,以便其他应用程序能够找到和使用这些组件。注册表中存储了组件的相关信息,包括组件的唯一标识符(CLSID)和接口标识符(IID)等。
- 运行时环境:COM 提供了一个运行时环境,负责加载和实例化组件,并管理组件之间的通信。运行时环境处理了组件的生命周期、对象的创建和销毁、接口的查询和调用等。
COM 劫持与 DLL 劫持原理差不多,都是在文件寻找过程上下文章,默认情况下也是不太好检查,可以想象一下,无非就是一下几种情况
- 在加载顺序更靠前的地方放置同名文件
- 直接替换要被读取的文件
- 向要被读取的文件中注入自定义恶意代码
通常是通过注册表找到具体要读取的文件,查找注册表顺序如下
HKEY_CURRENT_USER\Software\Classes\CLSID
HKEY_CLASSES_ROOT\CLSID
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\
参考文章
https://paper.seebug.org/2030/
我们以计算器为例,通过 Process Monitor
查看进程加载文件和注册表等信息
这里可以看到,加载 COM
组件时先是去查找了下面的注册表位置,结果没找到
之后又去下面的位置进行寻找
结果找到了
如果攻击者在 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
来实现
$microsoftCNS = @('Microsoft Corporation', 'Microsoft Windows', 'Microsoft Windows Hardware Compatibility Publisher', 'Microsoft Update', 'Microsoft Windows Publisher')
# 定义函数来进行签名校验
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') {
$publisher = $signature.SignerCertificate.Subject
# 解析发布者信息以提取 CN 字段的值
$cnValues = @(($publisher -split ', ' | Where-Object { $_ -like 'CN=*' }).Substring(3))
if ($cnValues.Count -eq 1) {
$cnValue = $cnValues[0]
# Write-Output "CN 字段的值: $cnValue"
# 判断 CN 字段是否为微软官方
if ($microsoftCNS -contains $cnValue) {
# Write-Output "CN 字段值为微软官方。"
return "Valid"
}
}
}
return "Invalid"
}
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. 杀毒程序扫描¶
这个就不多说了,大家选择已有或者合适的杀毒程序
0x34 Password Filter¶
密码过滤器是一种安全功能,用于在用户更改密码时对密码进行验证和强制规则。它允许系统管理员定义一组自定义规则和策略,以确保用户设置的密码符合安全要求。
密码过滤器的主要目的是增强密码的复杂性和强度,从而提高系统的安全性。它可以执行以下任务:
- 强制密码策略:密码过滤器可以强制实施密码策略,例如密码长度、复杂性、过期时间等要求。这有助于确保用户选择的密码具有足够的复杂性,不容易被猜测或破解。
- 检查常见密码:密码过滤器可以检查用户设置的密码是否属于常见密码列表中。这有助于防止使用容易猜测的密码,如
123456
、password
等。 - 自定义验证规则:管理员可以定义自定义验证规则,以满足特定的安全需求。例如,要求密码包含特定字符、不允许使用特定单词或模式等。
- 通知和警告:密码过滤器可以向用户提供有关密码复杂性要求的通知和警告,以帮助他们创建符合要求的密码。
通过密码过滤器,管理员可以确保用户设置的密码符合组织的安全策略,并提高整个系统的安全性。它是一项重要的安全措施,用于防止弱密码和密码猜测攻击,从而降低系统遭受密码相关威胁的风险。
攻击者常常利用这个功能窃取用户的明文密码,当然主要是新用户
这些都是 DLL
只不过这里不写 .dll
【 Windows Server 2016 】默认情况
0x35 Network Provider¶
Network Provider
类型的后门主要是窃取网络登录的明文密码,其实我觉得只要明文密码需要被处理,那么这个处理流程中的这些程序都会被发掘用来做后门
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
用于配置硬件网络提供程序的顺序。这些注册表路径允许用户和管理员管理和控制网络提供程序的加载顺序,以满足特定的网络连接需求和优先级
这些都是服务名称,在这些服务注册表中都存在 NetworkProvider
子项
也可以通过 Autoruns
进行查看,但更推荐通过注册表查看
【 Windows Server 2016 】默认情况
这里的 prl_fs
是我的PD
虚拟机的 tools
添加的,所以默认应该不存在
0x36 Winsock NSP¶
WinSock NSP(WinSock Namespace Provider)是指在 Windows 操作系统中实现网络套接字编程接口(Socket API)的组件之一。它负责提供网络通信的底层功能,使应用程序能够通过网络进行数据传输。
WinSock NSP 通过一组动态链接库(DLL)来实现,这些 DLL 包含了实现网络协议栈和通信协议的代码。它们提供了一种标准化的编程接口,使开发人员能够使用常见的网络协议(如TCP/IP、UDP)进行网络通信。
通过 WinSock NSP,开发人员可以创建套接字、建立连接、发送和接收数据等网络操作。它提供了一系列函数和数据结构,使应用程序能够方便地进行网络编程,实现网络通信功能
WinSock NSP 后门的原理如下:
- 劫持或替换 Namespace Provider DLL:攻击者通过劫持或替换系统中的 Namespace Provider DLL 文件来实现后门功能。Namespace Provider DLL 是实现命名空间提供者功能的动态链接库,用于处理网络命名空间的解析和操作。
- 注册恶意 Namespace Provider:攻击者可以注册一个恶意的 Namespace Provider,将其注入到系统的 Namespace Provider 链表中。这样,当应用程序进行网络命名空间解析时,恶意的 Namespace Provider 将被调用,攻击者可以在其中进行拦截、篡改或记录网络流量。
- 修改 Namespace Provider 设置:攻击者可以修改系统中的 Namespace Provider 设置,例如修改优先级顺序、修改默认的命名空间解析规则等。这样,攻击者可以将网络流量重定向到恶意的服务器或进行其他恶意操作。
注册表位置
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
,之后进行签名验证
$microsoftCNS = @('Microsoft Corporation', 'Microsoft Windows', 'Microsoft Windows Hardware Compatibility Publisher', 'Microsoft Update', 'Microsoft Windows Publisher')
# 定义函数来进行签名校验
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') {
$publisher = $signature.SignerCertificate.Subject
# 解析发布者信息以提取 CN 字段的值
$cnValues = @(($publisher -split ', ' | Where-Object { $_ -like 'CN=*' }).Substring(3))
if ($cnValues.Count -eq 1) {
$cnValue = $cnValues[0]
# Write-Output "CN 字段的值: $cnValue"
# 判断 CN 字段是否为微软官方
if ($microsoftCNS -contains $cnValue) {
# Write-Output "CN 字段值为微软官方。"
return "Valid"
}
}
}
return "Invalid"
}
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 】默认情况
0x37 Windows Defender 日志¶
1. 通过 Defender 程序¶
直接搜索 Defender
这三个项都可以查看详细信息看一下
2. 通过事件查看器¶
应用程序和服务日志 -> Microsoft
-> Windows
-> Windows Defender
-> Operational
相关事件 ID
事件ID | 事件内容 |
---|---|
1000 | 反恶意软件扫描启动 |
1001 | 反恶意软件扫描已完成 |
1002 | 反恶意软件扫描在完成之前已停止 |
1003 | 反恶意软件扫描已暂停 |
1005 | 反恶意软件扫描失败 |
1006 | 反恶意软件引擎发现恶意软件或其他可能不需要的软件 |
1007 | 反恶意软件平台执行了一项操作来保护系统免受恶意软件或其他可能不需要的软件的攻击 |
1008 | 反恶意软件平台尝试执行操作来保护系统免受恶意软件或其他可能不需要的软件的攻击,但操作失败 |
1009 | 反恶意软件平台从隔离区中还原了项 |
1011 | 反恶意软件平台从隔离区中删除了项目 |
1013 | 反恶意软件平台删除了恶意软件和其他可能不需要的软件的历史记录 |
1015 | 反恶意软件平台检测到可疑行为 |
1116 | 反恶意软件平台检测到恶意软件或其他可能不需要的软件。 |
1117 | 反恶意软件平台执行了一项操作来保护系统免受恶意软件或其他可能不需要的软件的攻击 |
更多事件ID以及含义查看以下官方链接
https://learn.microsoft.com/zh-cn/microsoft-365/security/defender-endpoint/troubleshoot-microsoft-defender-antivirus?view=o365-worldwide
0x38 防火墙配置¶
1. 防火墙开关¶
查看防火墙当前状态
win+r
中输入:
进行查看当前防火墙状态
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
中输入
【 Windows Server 2016 】 默认情况
0x39 pathext 排查¶
pathext
是 Windows 的一个环境变量,它的意义是当执行 testapp
时,该如何查找要执行的文件
通过 pathext
环境变量可以明确,会按照下面的顺序查找
- testapp.com
- testapp.exe
- testapp.bat
- ...
至于去那里查找,那就是当前目录以及 PATH 环境变量的事情了。
我们需要关注的是 pathext
是否被增加了其他后缀,是否存在劫持的可能
【 Windows Server 2016 】默认情况
0x40 Sandbox 排查¶
部分恶意攻击者开始使用 Windows 自带的 Sandbox 来制造隔离环境,逃避杀软检测,目前该技术只在 Windows 10/11 等系统中存在
Windows Sandbox 默认关闭,可以使用下面的 PowerShell 命令进行查看
也可以通过 DISM 命令查询
参考文章: https://www.welivesecurity.com/en/eset-research/operation-akairyu-mirrorface-invites-europe-expo-2025-revives-anel-backdoor/
https://blog-en.itochuci.co.jp/entry/2025/03/12/140000
0x41 Windows 空格路径截断排查¶
在 Windows 系统中,部分程序在解析程序路径时,遇到存在空格的路径,如果没有使用双引号包裹,可能存在截断的问题,这个问题我们在 Windows 服务的文章中已经有提到,但是我发现不同程序的处理是不一样的,因此我们采取相对严格的排查策略
如果系统中存在 C:\t m p\a b c.exe
,那么我们应该检查以下文件是否存在
- C:\t
- C:\t.com
- C:\t.exe
- 其他后缀,具体根据 pathext 环境变量
C:\t m
C:\t m.com
C:\t m.exe
- 其他后缀,具体根据 pathext 环境变量
C:\t m p\a
C:\t m p\a.com
C:\t m p\a.exe
- 其他后缀,具体根据 pathext 环境变量
C:\t m p\a b
C:\t m p\a b.com
C:\t m p\a b.exe
- 其他后缀,具体根据 pathext 环境变量
下面提供 PowerShell 和 Go 语言两个版本的排查脚本
https://github.com/Just-Hack-For-Fun/Check_Path_Blank
PowerShell¶
可以指定检查路径,例如 C:\
,如果不加参数。默认会检查所有的盘符的所有路径,包括共享盘符
param(
[Parameter(ValueFromRemainingArguments = $true)]
[string[]]$Paths
)
$startTime = Get-Date
# 如果没有参数,获取所有本地盘符
if (-not $Paths -or $Paths.Count -eq 0) {
$Paths = (Get-PSDrive -PSProvider 'FileSystem' | Where-Object { $_.Root -match '^[A-Z]:\\$' }).Root
}
# 获取可执行扩展名数组
$pathexts = $env:PATHEXT.ToLower().Split(';') | ForEach-Object { $_.TrimStart('.') } | Where-Object { $_ }
Write-Host "`n检测带空格路径的截断前缀可执行文件风险" -ForegroundColor Cyan
foreach ($rootPath in $Paths) {
Write-Host "`n扫描路径: $rootPath" -ForegroundColor Gray
# 递归扫描所有文件和文件夹
Get-ChildItem -LiteralPath $rootPath -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match '\s' } | # 路径含空格
ForEach-Object {
$fullPath = $_.FullName
$baseRoot = $rootPath
if ($fullPath.StartsWith($baseRoot)) {
$relativePath = $fullPath.Substring($baseRoot.Length)
} else {
$relativePath = $fullPath
}
if (-not $_.PSIsContainer) {
$spaceIndexes = (0..($relativePath.Length - 1)) | Where-Object { $relativePath[$_] -eq ' ' }
foreach ($spaceIdx in $spaceIndexes) {
$prefix = $relativePath.Substring(0, $spaceIdx)
$checkBase = Join-Path $baseRoot $prefix
if (Test-Path $checkBase -PathType Leaf) {
Write-Host "发现可疑文件: $checkBase (截断自 $fullPath)" -ForegroundColor Yellow
}
foreach ($ext in $pathexts) {
$exePath = "$checkBase.$ext"
if (Test-Path $exePath -PathType Leaf) {
Write-Host "发现可疑可执行文件: $exePath (截断自 $fullPath)" -ForegroundColor Red
}
}
}
}
}
}
$endTime = Get-Date
$duration = $endTime - $startTime
Write-Host "`n扫描开始时间: $startTime"
Write-Host "扫描结束时间: $endTime"
Write-Host ("总耗时: {0:hh\:mm\:ss}" -f $duration)
Golang¶
可以指定检查路径,例如 C:\
,如果不加参数。默认会检查所有的盘符的所有路径,包括共享盘符
Golang 语言的程序可能比 PowerShell 效率更高一些
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"time"
)
// 获取当前系统的 PATHEXT 并返回小写的扩展名(不带点)
func getPathexts() []string {
pathext := os.Getenv("PATHEXT")
if pathext == "" {
pathext = ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL"
}
items := strings.Split(strings.ToLower(pathext), ";")
var result []string
for _, ext := range items {
ext = strings.TrimSpace(ext)
ext = strings.TrimPrefix(ext, ".")
if ext != "" {
result = append(result, ext)
}
}
return result
}
// 获取所有本地盘符(大写且存在的)
func getAllDrives() []string {
var drives []string
for c := 'C'; c <= 'Z'; c++ {
drive := fmt.Sprintf("%c:\\", c)
if _, err := os.Stat(drive); err == nil {
drives = append(drives, drive)
}
}
return drives
}
// 针对每个空格前缀检查是否有风险文件
func checkPrefixRisk(fullPath string, baseRoot string, pathexts []string) {
if !strings.Contains(fullPath, " ") {
return
}
relativePath := fullPath
// 计算相对路径
if strings.HasPrefix(strings.ToLower(fullPath), strings.ToLower(baseRoot)) {
relativePath = fullPath[len(baseRoot):]
}
spaceIndexes := []int{}
for idx, c := range relativePath {
if c == ' ' {
spaceIndexes = append(spaceIndexes, idx)
}
}
for _, idx := range spaceIndexes {
prefix := relativePath[:idx]
base := filepath.Join(baseRoot, prefix)
if fi, err := os.Stat(base); err == nil && !fi.IsDir() {
fmt.Printf("[可疑文件] %s (截断自 %s)\n", base, fullPath)
}
for _, ext := range pathexts {
exePath := base + "." + ext
if fi, err := os.Stat(exePath); err == nil && !fi.IsDir() {
fmt.Printf("[可疑可执行文件] %s (截断自 %s)\n", exePath, fullPath)
}
}
}
}
func main() {
startTime := time.Now()
args := os.Args[1:]
var rootDirs []string
if len(args) == 0 {
rootDirs = getAllDrives()
if len(rootDirs) == 0 {
fmt.Println("未找到任何可用盘符。")
return
}
} else {
rootDirs = args
}
pathexts := getPathexts()
fmt.Printf("检测带空格路径的截断前缀可执行文件风险\n")
fmt.Printf("开始扫描,请耐心等待... 开始时间: %v\n", startTime.Format("2006-01-02 15:04:05"))
for _, root := range rootDirs {
fmt.Printf("\n扫描路径: %s\n", root)
filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error {
if err != nil {
return nil
}
if !d.IsDir() {
checkPrefixRisk(path, root, pathexts)
}
return nil
})
}
endTime := time.Now()
duration := endTime.Sub(startTime)
fmt.Printf("\n扫描开始时间: %v\n", startTime.Format("2006-01-02 15:04:05"))
fmt.Printf("扫描结束时间: %v\n", endTime.Format("2006-01-02 15:04:05"))
fmt.Printf("总耗时: %v\n", duration.Round(time.Second))
}
【 Windows Server 2016 】默认情况
检测带空格路径的截断前缀可执行文件风险
扫描路径: C:\
发现可疑文件: C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps (截断自 C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps Icons)
发现可疑文件: C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps (截断自 C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps Icons-journal)
发现可疑文件: C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64)
发现可疑文件: C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64 Critical)
发现可疑文件: C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64 Critical)
发现可疑文件: C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 Critical)
发现可疑文件: C:\Windows\System32\Tasks\Microsoft\Windows\Data Integrity Scan\Data Integrity Scan (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\Data Integrity Scan\Data Integrity Scan for Crash Recovery)
发现可疑可执行文件: C:\Windows\WinSxS\amd64_microsoft-windows-iis-legacysnapin_31bf3856ad364e35_10.0.14393.0_none_ae953f82c8b8a231\IIS6.msc (截断自 C:\Windows\WinSxS\amd64_microsoft-windows-iis-legacysnapin_31bf3856ad364e35_10.0.14393.0_none_ae953f82c8b8a231\IIS6 Manager.lnk)
发现可疑可执行文件: C:\Windows\WinSxS\amd64_microsoft-windows-iis-managementconsole_31bf3856ad364e35_10.0.14393.0_none_b54808dbd1ca2029\IIS.msc (截断自 C:\Windows\WinSxS\amd64_microsoft-windows-iis-managementconsole_31bf3856ad364e35_10.0.14393.0_none_b54808dbd1ca2029\IIS Manager.lnk)
检测带空格路径的截断前缀可执行文件风险
开始扫描,请耐心等待... 开始时间: 2025-07-17 21:55:58
扫描路径: C:\
[可疑文件] C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps (截断自 C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps Icons)
[可疑文件] C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps (截断自 C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\HubApps Icons-journal)
[可疑文件] C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64)
[可疑文件] C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64 Critical)
[可疑文件] C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64 Critical)
[可疑文件] C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 Critical)
[可疑文件] C:\Windows\System32\Tasks\Microsoft\Windows\Data Integrity Scan\Data Integrity Scan (截断自 C:\Windows\System32\Tasks\Microsoft\Windows\Data Integrity Scan\Data Integrity Scan for Crash Recovery)
[可疑可执行文件] C:\Windows\WinSxS\amd64_microsoft-windows-iis-legacysnapin_31bf3856ad364e35_10.0.14393.0_none_ae953f82c8b8a231\IIS6.msc (截断自 C:\Windows\WinSxS\amd64_microsoft-windows-iis-legacysnapin_31bf3856ad364e35_10.0.14393.0_none_ae953f82c8b8a231\IIS6 Manager.lnk)
[可疑可执行文件] C:\Windows\WinSxS\amd64_microsoft-windows-iis-managementconsole_31bf3856ad364e35_10.0.14393.0_none_b54808dbd1ca2029\IIS.msc (截断自 C:\Windows\WinSxS\amd64_microsoft-windows-iis-managementconsole_31bf3856ad364e35_10.0.14393.0_none_b54808dbd1ca2029\IIS Manager.lnk)
参考文章: https://mp.weixin.qq.com/s/_OLwgWbrnAhXLGdc0n_Kaw