吉沃运营专员 发表于 2021-10-8 14:01:31

WMI 攻击手法研究 - 识别和枚举 (第四部分)

本篇文章翻译自:Offensive WMI - Reconnaissance & Enumeration (Part 4) :: 0xInfection's Blog — Random ramblings of an Infected Geek


这是 WMI 攻击手法研究系列文章第四篇,将更多地关注信息收集和枚举。WMI 提供了大量的类,可以从中列举出很多东西。因此,让我们来深入了解,不要再浪费时间了。

一、收集基本信息

在之前的文章中,已经有许多为我们提供有关系统的有价值信息的类,例如 StdRegProv 用于注册表,Win32_Process 用于系统上运行的进程,Win32_Bios 用于 BIOS 信息等。让我们尝试进一步探索。

二、主机/操作系统信息

在侦察方面,了解主机/操作系统是一个非常基本的步骤。WMI 有两个类,即 Win32_OperatingSystem 和 Win32_ComputerSystem,可以提供相关信息。对于此示例来说,将过滤掉垃圾以仅打印所需的必要信息。

Get-WmiObject -Class win32_computersystem -Property bootupstate,username,totalphysicalmemory,systemtype,systemfamily,domain,dnshostname,oemstringarray


因此,我们现在拥有的大部分信息都可以帮助我们做一件重要的事情,那就是确定是否处于模拟环境中。当前运行的启动状态表明系统不是在故障安全模式下启动的。我们还可以看到当前的用户是 pew 并且不是任何 AD 域的一部分。我们还获得了可供使用的处理器架构和 RAM。这对于 VM 检测很有用,例如,如果逻辑处理器的数量小于 4 并且可用 RAM 低于 2 Gigs,那么 VM 的可能性很高。当然,SystemFamily 和 OEMStringArray 属性提供了相同的数据,但在受控环境中,可能还有其他指标。

另一个类 Win32_OperatingSystem 也为我们提供了很多有用的信息:

Get-WmiObject -Class win32_operatingsystem | fl *



三、目录列表

列出系统上的文件是一项非常基本的操作。WMI 有一个名为 Win32_Directory 的类,可帮助列出文件。或者,还有另一个名为 CIM_DataFile 的类也可用于实现相同的目的。

Get-WmiObject -Class win32_directory



通常使用通配符搜索文件模式很有帮助。可以使用 cmdlet 的 -Filter 参数来实现类似的功能。假设对具有名为 snapshots 的文件夹的目录路径感兴趣。使用 WMI 查询它看起来像这样:

Get-WmiObject -Class win32_directory -Filter 'name LIKE "%snapshots%"'



四、AV 产品

进行侦察的第一步是枚举哪种产品为系统提供安全性。WMI 在 root\SecurityCenter2 命名空间下提供了一个名为 AntiVirusProduct 的类,其中包含有关安装在系统上的 AV 的信息。在我机器上,它是默认的 Windows Defender。

Get-WmiObject -Namespace root\securitycenter2 -Class antivirusproduct



五、服务

Windows 系统上的服务类似于 Unix 守护进程,或者只是在后台运行的非 UI 进程。当涉及到权限提升时,这是很有用的信息,尤其是在 SYSTEM 创建的服务具有较低的文件权限的情况下。

要列出服务,需要使用 Win32_Service 类。对于下面这个示例,将仅打印由 LocalSystem (或 NT Authority\System) 启动的服务。请注意 Powershell 实用程序的 select 使用,与没有它相比,它显着扩展了输出。

Get-WmiObject -Class win32_service -Filter 'startname="localsystem"' | select *



WMI 还提供了几种与服务交互的方法。它们允许创建、删除、启动、停止、恢复、更新和许多其他操作服务的功能。要列出 Win32_Service 类下可用的方法,可以使用以下命令:

Get-WmiObject -Class win32_service -List | select -ExpandProperty methods



六、登录用户

在系统上获取登录用户非常简单。有两个类 —— Win32_LoggedOnUser 和 Win32_LogOnSession,它们保存有关会话和登录到系统用户的详细信息。从特权用户查询类可以为我们提供有关登录用户的更多信息:

Get-WmiObject -Class win32_loggedonuser



从上面可以看出,每个登录的用户都有一个 LUID (locally-unique identifier)。一些 LUID 是预定义的。例如,系统帐户登录会话的 LUID 始终为 0x3e7 (十进制 999),网络服务会话的 LUID 为 0x3e4 (996),本地服务的 LUID 为 0x3e5 (997),大多数其他 LUID 是随机生成的。

每个登录用户都通过 Dependent 属性定义其依赖项。可以使用 Win32_LogOnSession 类获取每个会话的登录 ID、身份验证类型、开始时间和范围的列表:

Get-WmiObject -Class win32_logonsession | select authenticationpackage,logonid,starttime,scope



七、安装的补丁

枚举机器上安装的更新/补丁通常很有用。如果系统缺少重要补丁,这可能会很容易在一次快速攻击中破坏系统。 WMI 有一个称为 Win32_QuickFixEngineering 的类,其中包含有关已安装更新和安全补丁的信息。查询类是小菜一碟:

Get-WmiObject -Class win32_quickfixengineering



八、事件日志

Win32_NtLogEvent 类为我们提供了有关系统捕获的事件日志的有用数据。可以使用以下命令来查询:

Get-WmiObject -Class win32_ntlogevent



每个日志条目都包含详细信息,例如时间、生成事件的来源、严重性和消息。严重性由输出中的 Type 属性指示。 谈到事件类型,有五个不同的级别,如下表所示:


ValueMeaning
1Error
2Warning
4Information
8Security Audit Success
16Security Audit Failure


当然,我们可以使用 -Filter 参数来搜索特定的事件类型。

九、共享

Win32_Share 类表示系统上的共享资源。这可能是磁盘驱动器、打印机、进程间通信或其他可共享设备。在企业网络中,通常有很多共享,可能在渗透测试期间派上用场。让我们看看如何枚举可用共享:

Get-WmiObject -Class win32_share | select type,name,allowmaximum,description,scope



在上面的示例中,使用 select 仅过滤了所需的有用信息。从命令的输出中获得了每个可用共享的共享类型、名称、并发访问权限、描述和范围。同样,类型是定义共享资源类型的常量:


ValueMeaning
0Disk Drive
1Print Queue
2Device
3IPC
2147483648Disk Drive Admin
2147483649Print Queue Admin
2147483650Device Admin
2147483651IPC Admin


AllowMaximum 是一个布尔属性,指示对资源的并发访问是否受到限制。如果该值设置为 True,则对共享访问没有限制,否则可能表明资源中存在敏感内容,或者更好地监视访问共享的客户端。

WMI 还提供 Create、SetShareInfo 和 Delete 等方法来创建、更新和删除共享。



十、网络信息

网络信息由 Win32_IP4RouteTable 类提供。类似于 ipconfig 命令,但更详细。

Get-WmiObject -Class win32_ip4routetable



在谈论网络内容时,我想提到另一个名为 Win32_NetworkAdapter 的有用类。查询它可以为我们提供有关系统拥有的网络硬件的有用指示。这反过来对 VM 检测很有用,例如,可以运行以下查询来识别系统是否被 VMWare 虚拟化:

Get-WmiObject -Class Win32_NetworkAdapter -Filter 'name like "%vmware%"'
Get-WmiObject -Class Win32_NetworkAdapter -Filter 'manufacturer like "%vmware%"'

十一、用户帐户

用户帐户信息由 Win32_UserAccount 类提供。对于默认的本地系统,只有几个帐户,最常见的是管理员、来宾、本地用户和 Windows Defender (WDAGUtilityAccount)。可以通过以下方式快速获取用户列表:

Get-WmiObject -Class win32_useraccount



但是,对于加入域或域控制器,还会有其他几个帐户,包括 krbtgt、sqladmin、webadmin 等。对于默认的 Windows Server 2012 设置,只有 3 个帐户,如下所示。



十二、用户组

与用户帐户类似,用户组信息由 Win32_Group 类提供。在本地上查询类很容易:


Get-WmiObject -Class win32_group



如果在企业环境中运行相同的命令,例如在加入域的网络中,组的数量会增加,让我们可以更广泛地了解网络上的用户组。这将包括本地域、当前域、受信任域和受信任群:



十三、系统机密

当涉及到侦察时,系统机密再次成为枚举的有用信息。如果在系统上有足够的权限,那么就可以创建磁盘的卷影副本并尝试从那里提取机密。但在此之前,对于那些不熟悉卷影副本的人:

提示:卷影拷贝是 Microsoft Windows 中的一项技术,可以创建计算机文件或卷的备份副本或快照,即使它们正在使用中。

为了卷影与副本进行交互,有 2 种可用的方法,如下图所示:



快速创建卷影副本很容易,只需要指定创建副本的卷和上下文:

(Get-WmiObject -Class win32_shadowcopy -List).create("C:\", "ClientAccessible")



为此,我们可以创建一个符号链接,以便从本地资源管理器轻松访问卷影副本:

$link = (Get-WmiObject -Class win32_shadowcopy).deviceobject + "/"
cmd /c mklink /d C:\shadowcopy "$link"



一旦准备好使用卷影副本,那就可以简单地使用 -Thorough 选项运行诸如 Invoke-SessionGopher.ps1 之类的工具来搜索文件系统上的机密。这将为 PuTTY、WinSCP、FileZilla、SuperPuTTY、RDP 等生成保存的会话信息。就我自已机器而言,我使用脚本找到了一些保存的 RDP 会话和 PuTTY 会话。



十四、结论

所以这完全是一篇通过 WMI 收集信息的简单文章。我们看到了如何方便地只需轻按几个键即可收集如此多的有用数据。当然,上面提供的信息并不是详尽无遗的,在侦察方面有无限的可能性需要考虑。

这就是现在的人们,我将在我们的下一篇文章中与您见面,将重点介绍通过 WMI 进行的 Active Directory 枚举。Sláinte!

页: [1]
查看完整版本: WMI 攻击手法研究 - 识别和枚举 (第四部分)