文章来源|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 得出的结果,其实是一致的。
我们可以使用同样的方法,依据不同的管理需求,去查找更多的不同类,从而去获取系统中不同的信息。