使用Powershell 获取内网服务器信息和状态

2021-07-16 16:56:17 浏览数 (1)

文章来源|MS08067 内网安全知识星球

本文作者:贝多芬不忧伤(Ms08067内网小组成员)

收集服务器信息和状态

在内网渗透过程中,有时我们是需要了解不同的服务器的基本软硬件配置信息的,同时也可能需要 将它们生成报告进行归档,那么通过 Powershell,我们也能够轻松的去完成这个过程。本文中,我 们将主要说明如何通过 Powershell 收集系统信息和生成报告。

我们可能首先想到的,也是使用不同的Module中的不同的命令,收集诸如 CPU,内存,磁盘,系统等不同的信息,其实在Powershell中,有两种方法去完成信息收集的过程。

1. 使用 Powershell 提供的 Module 和相关命令:比如我们在前面使用过的Get-Process 获取当前计算机中运行的进程

2. 使用 WMI 类:因为有了使用 Get-Process 命令的经验,所以我们可以在不同的 Module 中找到不同的命令,例 如:

  • 获取当前计算机中所有的服务信息 Get-Services
  • 获取 Hyper-V 服务器中的虚拟机信息 Get-VM
  • 获取活动目录域服务中的用户帐号信息 Get-ADUser
  • 获取 DHCP 服务器中,IPv4 作用域信息 Get-DHCPServerv4Scope
  • .......

这种命令其实也非常好查找,我们可以使用以下两条命令就轻松搞定

  • Get-Module 查找当前计算机能够使用的 Module 清单
  • Get-Command -Module #### -Verb Get 在 Module 这个参数后,将 #### 替换成不同的 Module 名称, 就可以获取非常多的不同的命令,获取不同的信息

而另外的一种方法,就是使用 WMI 类,那么在我们使用 WMI 类之前,首先就需要了解以下两个问题?

  • 什么是 WMI 类?
  • 为什么要使用 WMI 类

一个计算机的系统,它基本上包括了两个部分,软件和硬件,细分下来的话,硬件包括了 CPU,内存, 磁盘,网卡,显卡等,而软件包括了操作系统,应用程序。这些组件可以分别来自于不同的厂商,如 CPU 可以来自于 Intel 或 AMD,操作系统可以来自于 Microsoft 或是 Redhat,内存可以是 Samsung 或 Hynix。。。。。。那么接下来就有一个问题了,当我们使用这样的一个计算机运行一个应用程序,并且希望获取这些不同组件的信息怎么办?

DMTF(Distributed Management Task Force) 这一个国际化标准组织,在1999年的时候制定了一个通 用的获取不同组件的模型和方法,叫做 CIM(Common Information Model)。标准制定好之后,各 个组件的厂商,在发布他们产品的时候,都会向操作系统一组相关的 CIM 类,通过这一些 CIM 类,应用程序就可以轻松地获取各种组件的信息。而 CIM 标准在 Windows 平台实现的方法就是 WMI (Windows Management Instrumentation)。这也就是说通过 WMI,管理员可以获取系统中不同组件的信息。

同时我们也能够看到,CIM 标准是在 1999 年正式发布的,微软 1998 年10 月 25号发布的 Windows NT 4.0 SP4 开始正式支持 WMI,相比于 Powershell 2008 年才正式发布,整整早了十年。

  • 在没有 Powershell 的年代,使用 VBScript 编写脚本时获取系统信息时,WMI 是不二之选;
  • 从 Windows Server 2008 到 Windows Server 2016 ,微软一直致力不断完善 Powershell Module 的支 持,要知道,在 Windows Server 2008 可是没有 NetAdapter 这个 Module,自然也就没有 Get-NetAdapter 这个命令可以获取系统中网卡信息,那个年代想在 Powershell 中获取网卡信息,就得靠 Powershell 调用 WMI 类来完成了。

所以接下来的问题就是

  • 如何通过 WMI 类获取网卡信息;
  • Powershell 如何调用 WMI 类。

WMI 类的组织形式,是一种层级结构,叫做命名空间,如下图

你可以在命令行中运行 wmimgmt.msc 命令,打开WMI管理工具后,右键选择 WMI控制(本地)--属性,在 高级选项卡中,选择更改后,就能查看如上截图的 WMI 命名空间,最上层的名称为 Root。不同组件的 WMI 类,就分别注册到了不同的命令空间之下,这也就是意味着,我们要调用 WMI 类,必须指定正确的命令空间。这就像我们打开文件一样,只有打开正确的路径后,才能够正常访问文件。

而当我们点击打开不同的命名空间路径后,会有一点失望,因为我们看不到具体的类,当然也不知道他长什么样子了。其实我们可以通过Powershell的方法来获取具体命令空间下的所有类,使用到命令为 Get-CimClass,它是由 CimCmdlets Module 提供的。比如我们想获取 RootAppv 这个命名空间下的所有类,那么我们可以运行

代码语言:javascript复制
Get-CimClass -Namespace rootappv

而最常见的,也是默认的命名空间是 RootCIMV2,我们可以运行

代码语言:javascript复制
Get-CimClass -Namespace rootCIMV2

将得到该命名空间下所有的 WMI 类,我们也可以运行

代码语言:javascript复制
Get-CimClass -Namespace rootCIMV2 | Measure-Object

统计到的结果如下

可以看到数量为 1202,这个数字很大,但不是绝对的,随着我们的系统安装不同硬件,软件,这个数量 可能还会改变。那么接下来又有一个问题了,1000多个 WMI 类中,我们怎么知道哪一个是网卡的类?这 一个问题,即使你曾经用过,也是不可能一下就记起来的,最简单的办法,当然还是 google.com 搜索 了,比如,我们可以搜索 network adapter wmi class,多搜几次,一定会有的。

接下来我们将使用如下 WMI 类分别获取 CPU,内存,磁盘,网卡,操作系统等基本信息

有了 WMI 类的信息后,我们就可以使用 Powershell 提供的 Get-CimInstance 命令来调用类获取当前系统 中的不同组件信息了。比如我们想获取 CPU 的信息,那么我们可以运行

代码语言:javascript复制
Get-CimInstance -Namespace RootCIMv2 -ClassName Win32_Processor

对于这样的信息,我们也可以进一步的精简,运行如下命令

代码语言:javascript复制
Get-CimInstance -Namespace RootCIMv2 -ClassName Win32_Processor | Select-Object
DeviceID,Name

而对于内存,磁盘,网卡,和操作系统信息,我们可以分别运行以下命令

代码语言:javascript复制
Get-CimInstance -Namespace RootCIMv2 -ClassName Win32_PhysicalMemory
 | SelectObject Manufacturer,SerialNumber,Capacity
代码语言:javascript复制
Get-CimInstance -Namespace RootCIMv2 -ClassName Win32_DiskDrive
 | Select-Object Caption,Size
代码语言:javascript复制
Get-CimInstance -Namespace RootStandardCIMv2 -ClassName MSFT_Netadapter
代码语言:javascript复制
Get-CimInstance -Namespace RootCIMv2 -ClassName Win32_OperatingSystem
 | SelectObject Caption,Version,OSArchitecture

这个过程中,其实我们可以对比一下 Get-Netadapter 这条命令与 Get-CimInstance -Namespace RootStandardCIMv2 -ClassName MSFT_Netadapter 得出的结果,其实是一致的。

我们可以使用同样的方法,依据不同的管理需求,去查找更多的不同类,从而去获取系统中不同的信息。

0 人点赞