简介

内置命令行 shell CMD.exe 和 PowerShell 是包含在所有 Windows 主机中的两个实现。这些工具提供对操作系统的直接访问,自动化常规任务,并为用户提供对计算机和安装应用程序的任何方面的细粒度控制。

cmd与powershell

Windows 命令提示符和 PowerShell 之间存在一些关键差异,我们将在整个模块中看到这些差异。

一个关键差异是,您可以从 PowerShell 控制台运行命令提示符命令,但从命令提示符运行 PowerShell 命令,您必须在命令前加上 powershell (即 powershell get-alias )。下表概述了其他一些关键差异。

PowerShellCommand Prompt  命令提示符
2006 年推出1981 年推出
可以运行批处理命令和 PowerShell cmdlet只能运行批处理命令
支持使用命令别名不支持命令别名
Cmdlet 输出可以传递给其他 Cmdlet命令输出不能传递给其他命令
所有输出都以对象的形式存在命令的输出是文本
能够在脚本中执行一系列 cmdlets一个命令必须完成,下一个命令才能运行
具有集成脚本环境(ISE)没有 ISE
因为它是基于 .NET 框架构建的,所以可以访问编程库无法访问这些库
可以在 Linux 系统上运行只能 在 Windows 系统上运行
正如我们所见,命令提示符是与操作系统交互的一种更静态的方式,而 PowerShell 是一种强大的脚本语言,可用于各种任务,并创建简单和非常复杂的脚本。

CMD

命令提示符,也称为 cmd.exe 或 CMD,是 Windows 操作系统默认的命令行解释器。它最初基于 DOS 中的 COMMAND.COM 解释器,在几乎所有 Windows 操作系统中都非常普遍。它允许用户输入命令,这些命令将被操作系统直接解释并执行。一个命令可以完成诸如更改用户密码或检查网络接口状态等任务。这也减少了系统资源,因为基于图形的程序需要更多的 CPU 和内存。

虽然经常被其流畅的对应程序 PowerShell 所掩盖,但即使在现代,了解 cmd.exe 及其命令仍然会带来好处。

特殊符号

|:管道符,和linux里的基本一样,都是将前面的命令传输到后面 >>:重定向符,将文本快速附加到文件末尾 >:输入符号,将内容覆盖文件 <:取出符号,将文本内容传递给命令

CMD命令

系统导航

到目前为止,我们所涵盖的大部分内容都是关于命令提示符的入门信息,以帮助我们获得基本的理解和感觉。继续这种思路,我们的下一个目标应该是利用命令提示符成功地 navigate 并在系统上移动。

目录列表dir

我们在 Windows 主机上初步探索时最容易做的事情之一就是获取当前工作目录的列表。我们使用 dir 命令来完成这个操作。

dir

如上例所示, dir 是一个易于使用且功能强大的命令。只需调用该命令而不带任何参数,就会给出我们当前目录及其内容的列表。正如在“获取帮助”部分所示,我们还可以使用 /? 参数来提供 dir 的完整功能列表,以及我们可以提供的任何其他参数来利用其高级搜索功能。

用户位置cd

目前位置

在进行主机上的任何操作之前,了解我们当前在文件系统中的位置是有帮助的。我们可以通过使用 cdchdir 命令来确定这一点。

cd

不带参数发出命令会给我们 current working directory 。我们当前的工作目录是我们的初始起点。它描述了我们当前所在的目录。在这里运行的任何命令(如果)不指定其他目录或文件的路径,将引用这个初始点。考虑到我们接下来所做的一切都将引用当前工作目录,除非另有指定,这一点非常重要。

移动

在我们忙着在系统中找到自己的位置时,我们引入了 cdchdir 命令。然而,我们没有探索它们全部的功能。除了列出我们当前目录之外,这两个命令还有一个附加功能。这些命令将把我们移动到命令后面指定的任何目录。指定的目录可以是相对于我们当前工作目录的目录,也可以是从文件系统根目录开始的绝对目录。

探索文件系统

利用我们新获得的技能,我们应该深入研究系统。彻底的探索至关重要,因为它可以帮助我们获得在理解我们正在交互的系统的布局和其中包含的文件方面相当大的优势。然而,当我们浏览 Windows 主机的文件系统时,来回切换目录或为每个子目录发出 dir 命令可能会很无聊。为了节省我们的时间并提高效率,我们可以使用 tree 命令打印出我们指定的完整路径及其子目录。

列出文件系统内容

tree

Folder PATH listing
Volume serial number is 26E7-9EE4
C:.
├───3D Objects
├───Contacts
├───Desktop
├───Documents
├───Downloads
├───Favorites
│   └───Links
├───Links
├───Music
├───OneDrive
├───Pictures
│   ├───Camera Roll
│   └───Saved Pictures
├───Saved Games
├───Searches
└───Videos
    └───Captures

创建目录和文件

创建新目录 md/mkdir

创建一个目录来添加到我们的结构是一个简单的任务。我们可以使用 mdmkdir 命令。

删除目录 rd/rmdir

使用 rdrmdir 命令可以删除目录。rd 和 rmdir 命令专门用于删除目录树,不处理特定的文件或属性。

单纯使用命令不会删除含有文件的目录

Rd 有一个开关 /S ,我们可以使用它来删除目录及其内容。由于我们希望 Git-Pulls 失效,因此在上面看到的第二个 cmd 会话中执行它。我们使用 rd 发出的命令与 rmdir 相同。

修改目录

文件操作

在管理目录时,我们使用的一些命令也可以用于文件。Windows 提供了许多内置工具,我们可以用来享受文件的魔力。我们这里将介绍其中的几个。我们先来讨论一下如何查看文件及其内容。

我们已经知道,可以根据我们使用的开关,利用 dir 命令查看目录中的文件,以及关于文件的具体信息。这通常是查看目录中哪些文件存在的最简单方法。我们还使用 tree /F 命令可以显示包含树中所有目录和文件的输出。但是,如果我们想查看文件的内容呢?我们可以利用 moreopenfilestype 命令。

查看文件

more命令

首先,让我们使用 more 。有了这个内置工具,我们可以一次查看文件的内容或打印到文件中的另一个命令的结果。这就像缓冲可能溢出终端缓冲区的滚动文本。

more secrets.txt

请注意,cmd-session 底部显示了文件的浏览百分比。当我们点击 enterspace bar 时,它会为我们滚动文档文本,显示文件中越来越多的文件内容。对于包含多个空行或大量数据之间空格的大型文件,我们可以使用 /S 选项将空格压缩到单行,以便更容易查看。这不会修改文件,就像 more 命令输出空格一样。

More /S  更多/S
more /S secrets.txt

Type命令

Type 可以一次显示多个文本文件的内容。也可以使用 type 进行文件重定向。这是一个简单但非常实用的工具。 type 的一个有趣之处在于,它不会锁定文件,所以不用担心弄乱文件。

这仅此而已。Type 提供简单的文件输出。我们也可以使用它来将输出发送到另一个文件。这可以快速创建一个新文件或将数据附加到另一个文件。

创建和修改文件

从命令行创建和修改文件相对容易。我们有多个选项,包括 echofsutilrenrenamereplace 。首先, echo 通过输出重定向,如果文件已经存在,我们可以修改它,或者在调用时创建一个新文件。

echo创建和附件文件

echo Check out this text > demo.txt

echo More text for our demo file >> demo.txt

Fsutil创建文件

fsutil file createNew for-sure.txt 222

文件重命名

Ren 允许我们将文件名更改为新的名称。

Ren(ame) A 文件

ren demo.txt superdemo.txt

删除文件

使用“del”和“erase”删除文件列表

del file-1
erase file-3 file-5

复制和移动文件

复制文件

copy secrets.txt C:\Users\student\Downloads\not-secrets.txt

在上面的示例中,我们复制了 secrets.txt 并将其移动到“下载”文件夹中,将其重命名为 not-secrets.txt 。默认情况下, copy 将完成其任务并关闭。如果要确保复制的文件正确复制,请使用 /V 选项启用文件验证。

移动文件

move C:\Users\student\Desktop\bio.txt C:\Users\student\Downloads

查看系统信息

系统信息输出

systeminfo

然而,知道一种方法来收集信息是无效的,特别是如果特定命令的监控和跟踪比其他命令更严格。这就是为什么我们需要不止一种已建立的方法来收集所需信息。

系统检查

主机名输出

hostname

版本输出

ver

网络信息

除了上面提供的主机信息,让我们快速看一下一些关于目标的基本网络信息。深入了解目标的连接方式以及它可以在网络上访问哪些设备,是作为攻击者时的宝贵工具。

为了快速收集这些信息,并且使用一个简单易用的命令,命令提示符提供了 ipconfig 工具。ipconfig 工具显示机器当前的所有 TCP/IP 网络配置。让我们来看一个 ipconfig 配置示例,不提供任何其他参数。

ipconfig

使没有指定参数,我们也会收到一些关于主机的基本网络信息,例如 Domain NameIPv4 AddressSubnet MaskDefault Gateway 。这些信息可以深入了解目标所在的网络以及与之相连的网络,以及更广泛的环境。如果需要更多信息或想深入了解每个适配器的具体设置,我们可以使用以下命令: ipconfig /all 。正如提供的标志所暗示的那样,该命令提供了系统上所有已连接网络适配器的完整列表(完整 TCP/IP 配置)以及附加信息,包括每个适配器的物理地址( MAC Address )、DHCP 设置和 DNS 服务器。

Ipconfig 是一个高度通用的命令,用于收集有关目标主机网络连接的信息;但是,如果我们需要快速查看目标主机与哪些主机有过接触,那么别无他法,只能使用 arp 命令。

arp

arp 实用程序有效地显示了地址解析协议( ARP )缓存中的内容和条目。我们也可以使用此命令有效地修改表条目

 arp /a

<SNIP>

Interface: 10.0.25.17 --- 0x17
  Internet Address      Physical Address      Type
  10.0.25.1             00-e0-67-15-cf-43     dynamic
  10.0.25.5             54-9f-35-1c-3a-e2     dynamic
  10.0.25.10            00-0c-29-62-09-81     dynamic
  10.0.25.255           ff-ff-ff-ff-ff-ff     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static

Interface: 172.16.50.15 --- 0x1a
  Internet Address      Physical Address      Type
  172.16.50.1           15-c0-6b-58-70-ed     dynamic
  172.16.50.20          80-e5-53-3c-72-30     dynamic
  172.16.50.32          fb-90-01-5c-1f-88     dynamic
  172.16.50.65          7a-49-56-10-3b-76     dynamic
  172.16.50.255         ff-ff-ff-ff-ff-ff     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static

<SNIP>

用户信息

whoami

查看权限

可以使用 whoami 来查看当前用户在系统上的安全权限。通过了解当前用户启用哪些权限,我们可以确定目标主机上的能力。让我们尝试从受攻击的用户帐户运行 whoami /priv

whoami /priv

从上面的输出中,我们似乎只能访问基本权限集,大多数选项都已禁用。这属于域上提供的标准用户帐户的限制范围。但是,如果这些设置有任何配置错误,或者用户提供了任何额外的权限,我们可能会利用这一点来尝试提升我们当前用户的权限。

查看组

除了深入了解当前用户权限外,我们还应该花时间看看我们的帐户所属的哪些组。这可以深入了解当前用户所属的其他组,包括任何默认组(内置组),更重要的是,我们的用户是否明确授予了对这些组的访问权限。要查看当前用户所属的组,我们可以发出以下命令: whoami /groups

whoami /groups

除了创建帐户时添加的内置组之外,我们的用户不是其他任何组的成员。然而,重要的是要记住,在某些情况下,用户可以根据所属组获得额外的访问权限、特权和权限。

查看其他用户/群组

在调查了我们当前的受攻击的用户帐户后,我们需要稍微扩展一下,看看我们是否能够访问其他帐户。在大多数环境中,网络上的机器都与域关联。

由于域关联网络的性质,任何人可以登录网络上的任何物理主机,而无需在机器上拥有本地帐户。我们可以利用这一点,通过扫描当前主机上哪些用户已访问我们的其他帐户,看看我们是否能够访问其他帐户。这非常有利于维护网络上的持久性。为此,我们可以利用 net 命令的特定功能。

Net User

Net User 允许我们显示主机上所有用户的列表、特定用户的详细信息,以及创建或删除用户。

从提供的输出中,该机器只创建了几个用户帐户。但是,如果我们使用的是人口较多的网络,可能会遇到更多试图进行攻击的帐户。

Net Group / Localgroup  

除了用户帐户,我们还应该快速查看网络上存在的哪些组。

Net Group 将显示我们发出命令的主机上存在的任何组,创建和删除组,并将用户添加或删除到组。如果主机加入域,它还将显示域组信息。请记住, net group 必须针对域服务器(例如 DC)运行,而 net localgroup 可以针对任何主机运行,以显示其包含的组。

探索网络资源

之前,我们关注的是当前用户在本地主机上的访问权限。但在域环境中,用户通常需要在网络上的共享上存储与工作相关的任何材料,而不是在本地机器上存储文件。这些共享通常位于离普通员工物理访问点之外的服务器上。通常,标准用户将拥有必要的权限来读取、写入和执行共享上的文件,前提是他们有有效的凭据。当然,我们可以利用这一点作为额外的持久性方法,但首先我们如何定位这些共享呢?

Net Share

正如我们从上面的例子中看到的,我们有一个当前被入侵的用户可以访问的股票列表。通过阅读注释,我们可以推断 Records 是一个手动安装的共享,可能包含一些对我们有用的潜在信息。理想情况下,如果我们在一个会话中发现一个开放的共享,我们需要跟踪以下内容:

  • 我们是否有适当的权限访问此共享文件夹?
  • 我们可以在共享文件上读写和执行文件吗?
  • 关于该股,是否有任何有价值的数据?

除了提供信息外, shares 也非常适合托管我们需要的任何东西,并且作为渗透者横向移动到不同的主机。如果我们不介意偷偷摸摸,我们可以将一个负载或其他数据扔到共享主机上,以启用网络上其他主机的移动。尽管这超出了本模块的范围,但滥用共享主机的方式是一种极好的持久性方法,而且可以用来提升权限。

Net View

Net View 将显示您发出命令的主机知道的任何共享资源。这包括域资源、共享文件夹、打印机等等。

powershell

PowerShell 已经在 IT 和 Infosec 专业人员中变得越来越突出。它被广泛用于系统管理员、渗透测试人员、安全运营分析员以及在任何管理 Windows 系统的技术领域。考虑 IT 管理员和 Windows 系统管理员管理 IT 环境,该环境由 Windows 服务器、台式机(Windows 10 和 11)、Azure 和基于云的 Microsoft 365 应用程序组成。其中许多人都使用 PowerShell 自动化他们必须每天完成的任务。这些任务包括:

  • 服务器配置和安装服务器角色
  • 为新员工创建 Active Directory 用户帐户
  • 管理 Active Directory 组权限
  • 禁用和删除 Active Directory 用户帐户
  • 管理文件共享权限
  • 与 Azure AD 和 Azure VMs 交互
  • 创建、删除和监控目录和文件
  • 收集工作站和服务器信息
  • 为用户设置 Microsoft Exchange 邮箱(在云和/或本地)

从 IT 管理员的角度来看,使用 PowerShell 有无数种方法,考虑到这个角度,对于我们 penetration testerseven as defenders 来说,会有所帮助。作为系统管理员,PowerShell 可以为我们提供比 CMD 更多的能力。它 expandable ,专为 automation 和脚本而构建,具有更强大的安全实现,并且可以处理 CMD 简单无法处理的许多不同任务。作为渗透测试人员,PowerShell 内置了许多众所周知的能力。PowerShell 的模块导入功能使我们能够轻松地将工具带入环境并确保它们能够正常工作。然而,从隐身的角度来看,PowerShell 的 logginghistory 功能非常强大,会记录更多我们与主机的交互。因此,如果我们不需要 PowerShell 的功能并且想更加隐身,那么我们应该利用 CMD。

Get-Help

使用帮助功能。如果我们想查看特定 cmdlet 提供的选项和功能,可以使用 Get-Help cmdlet。

Get-Help Test-Wsman

Get-Help 可以提供有关 cmdlet 的有用信息。请注意, Syntax 输出显示了几个可用选项和与每个选项一起使用的其他关键字。 Aliases 也被提及,它们本质上是命令的简称。我们将在本节的后面更详细地讨论别名。 Remarks 输出提供了有关 cmdlet 的更多信息,甚至还有我们可以使用的其他选项来了解更多关于 cmdlet 的信息。这些其他选项之一是 -online ,如果主机具有互联网访问权限,它将打开对应 cmdlet 的 Microsoft 文档网页。

使用 Update-Help

Update-Help

注意在运行 Update-Help 后,关于 Test-Wsman 的信息填充了多少更多。您可以自由地将此输出与在我们首次介绍 Get-Help 时显示的输出进行比较。

获取命令帮助

Get-Command

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Add-AppPackage                                     2.0.1.0    Appx
Alias           Add-AppPackageVolume                               2.0.1.0    Appx
Alias           Add-AppProvisionedPackage                          3.0        Dism
Alias           Add-ProvisionedAppPackage                          3.0        Dism
Alias           Add-ProvisionedAppxPackage                         3.0        Dism
Alias           Add-ProvisioningPackage                            3.0        Provisioning
Alias           Add-TrustedProvisioningCertificate                 3.0        Provisioning
Alias           Apply-WindowsUnattend                              3.0        Dism
Alias           Disable-PhysicalDiskIndication                     2.0.0.0    Storage
Alias           Disable-StorageDiagnosticLog                       2.0.0.0    Storage
Alias           Dismount-AppPackageVolume                          2.0.1.0    Appx
Alias           Enable-PhysicalDiskIndication                      2.0.0.0    Storage
Alias           Enable-StorageDiagnosticLog                        2.0.0.0    Storage
Alias           Flush-Volume                                       2.0.0.0    Storage
Alias           Get-AppPackage                                     2.0.1.0    Appx

<SNIP>

上面的输出为了节省屏幕空间而被截断了。使用 Get-Command 而没有其他修饰符将执行当前加载到 PowerShell 会话中的每个 cmdlet 的完整输出。我们可以通过过滤 verbnoun 部分来进一步缩减输出。

Get-Command (verb)

Get-Command -verb get

<SNIP>
Cmdlet          Get-Acl                                            3.0.0.0    Microsoft.Pow...
Cmdlet          Get-Alias                                          3.1.0.0    Microsoft.Pow...
Cmdlet          Get-AppLockerFileInformation                       2.0.0.0    AppLocker
Cmdlet          Get-AppLockerPolicy                                2.0.0.0    AppLocker
Cmdlet          Get-AppvClientApplication                          1.0.0.0    AppvClient  
<SNIP>

使用 -verb 修饰符并查找名称中包含 get 的任何 cmdlet、别名或函数,我们将获得一个详细的列表,其中包含 PowerShell 当前知道的所有内容。我们也可以使用 get* 而不是 -verb get 进行精确搜索。Get-Command cmdlet 将 * 认识为通配符,并显示 get (任何内容)的每个变体。我们也可以通过搜索名词来进行类似操作。

Get-Command (noun)

Get-Command -noun windows*  

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Apply-WindowsUnattend                              3.0        Dism
Function        Get-WindowsUpdateLog                               1.0.0.0    WindowsUpdate
Cmdlet          Add-WindowsCapability                              3.0        Dism
Cmdlet          Add-WindowsDriver                                  3.0        Dism
Cmdlet          Add-WindowsImage                                   3.0        Dism
Cmdlet          Add-WindowsPackage                                 3.0        Dism
Cmdlet          Clear-WindowsCorruptMountPoint                     3.0        Dism
Cmdlet          Disable-WindowsErrorReporting                      1.0        WindowsErrorR...
Cmdlet          Disable-WindowsOptionalFeature                     3.0        Dism
Cmdlet          Dismount-WindowsImage                              3.0        Dism
Cmdlet          Enable-WindowsErrorReporting                       1.0        WindowsErrorR...
Cmdlet          Enable-WindowsOptionalFeature                      3.0        Dism

在上面输出中,我们使用了 -noun 修饰符,进一步增强了过滤器,并查找名词中包含 windows* 的任何部分,因此我们的结果非常具体。 Anything 以 windows 开头并在名词部分后跟任何其他内容的都将 match 这个过滤器。这只是展示了 Get-Command cmdlet 强大功能的一些示例。与 Get-Help cmdlet 配合使用,这些可以直接由 PowerShell 提供的强大帮助功能。我们的下一个技巧将深入探讨我们的 PowerShell 会话历史记录。

Cmdlets

Cmdlets 遵循动词-名词的结构,这通常使我们可以更容易地理解任何给定 cmdlet 的作用。比如 Test-WSMan,我们可以看到 verbTestNounWsman 。动词和名词之间用短横线 - 分隔。在动词和名词之后,我们会使用与给定 cmdlet 一起提供的选项来执行所需操作。

Cmdlets 类似于 PowerShell 代码或其他编程语言中使用的函数,但有一个显著的区别。Cmdlets 是 not 用 PowerShell 编写的。函数是用 C#或另一种语言编写的,然后编译以供使用。正如我们在上一节看到的,我们可以使用 Get-Command cmdlet 来查看可用的应用程序、cmdlets 和函数,以及一个标记为”CommandType”的特性,它可以帮助我们识别其类型。

导航

现在我们已经了解了 PowerShell 是什么以及内置帮助功能的基础,让我们来学习 PowerShell 的基本导航和使用。

工作目录

我们只能在知道我们已经在哪里的情况下移动,对吧?我们可以通过使用 Get-Location cmdlet 来确定我们当前的工作目录(相对于主机系统)。

Get-Location

Path
----
C:\Users\DLarusso

我们可以看到它打印了我们当前正在从中工作的目录的完整路径;在这种情况下,那就是 C:\Users\DLarusso 。现在我们已经有了方向,让我们看看这个目录中存在哪些对象和文件。

列出目录

Get-ChildItem 命令行可以显示我们当前目录的内容或我们指定的目录内容。

Get-ChildItem 

Directory: C:\Users\DLarusso


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        10/26/2021  10:26 PM                .ssh
d-----         1/28/2021   7:05 PM                .vscode
d-r---         1/27/2021   2:44 PM                3D Objects
d-r---         1/27/2021   2:44 PM                Contacts
d-r---         9/18/2022  12:35 PM                Desktop
d-r---         9/18/2022   1:01 PM                Documents
d-r---         9/26/2022  12:27 PM                Downloads
d-r---         1/27/2021   2:44 PM                Favorites
d-r---         1/27/2021   2:44 PM                Music
dar--l         9/26/2022  12:03 PM                OneDrive
d-r---         5/22/2022   2:00 PM                Pictures

移动到新目录

更改我们的位置很简单;我们可以使用 Set-Location cmdlet 来完成。

Set-Location .\Documents\

PS C:\Users\tru7h\Documents> Get-Location

Path
----
C:\Users\DLarusso\Documents

我们向 Set-Location 命令传递了参数 .\Documents\ ,告诉 PowerShell 我们想要移动到 Documents 目录,该目录位于我们当前工作目录中。我们也可以像这样传递完整的文件路径:

Set-Location C:\Users\DLarusso\Documents

显示文件内容

现在,如果我们想查看文件的内容,可以使用 Get-Content 。在 Documents 目录中,我们注意到一个名为 Readme.md 的文件。让我们查看一下。

Get-Content Readme.md

别名

PowerShell 别名是 cmdlet、命令或可执行文件的另一个名称。我们可以使用 Get-Alias cmdlet 查看默认别名的列表。大多数内置别名都是 cmdlet 的缩写版本,这使得它们更容易记忆且快速使用。

将别名设置得比实际 cmdlet、命令或可执行文件的名称更短是一种很好的做法。就连 Get-Alias cmdlet 也有一个默认的别名 gal ,如下面的剪辑所示。

模块

一旦我们确定了要使用的 PowerShell 模块,就需要确定如何以及从哪里运行它。我们还必须考虑所选模块和脚本是否已经在主机上,或者是否需要将它们传送到主机上。 Get-Module 可以帮助我们确定哪些模块已经加载。

Get-Module

PS C:\htb> Get-Module 

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     0.0        chocolateyProfile                   {TabExpansion, Update-SessionEnvironment, refreshenv}
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     0.7.3.1    posh-git                            {Add-PoshGitToProfile, Add-SshKey, Enable-GitColors, Expan...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...
可用列表
Get-Module -ListAvailable 

 Directory: C:\Users\tru7h\Documents\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.1.0      PSSQLite                            {Invoke-SqliteBulkCopy, Invoke-SqliteQuery, New-SqliteConn...


    Directory: C:\Program Files\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.0.1      Microsoft.PowerShell.Operation.V... {Get-OperationValidation, Invoke-OperationValidation}
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-Packa...
Script     3.4.0      Pester                              {Describe, Context, It, Should...}
Script     1.0.0.1    PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Set-PSReadLineKeyHandler, Remov...

-ListAvailable 修饰符将显示我们已安装但未加载到会话中的所有模块。

使用 Import-Module

Import-Module 命令允许我们将模块添加到当前的 PowerShell 会话中。

要理解将模块导入我们当前的 PowerShell 会话的概念,我们可以尝试运行 PowerSploit 的一部分 cmdlet ( Get-NetLocalgroup )。在不导入模块的情况下尝试这样做时,我们会收到错误消息。一旦我们成功导入 PowerSploit 模块(它已被放置在目标主机的桌面上供我们使用),我们将可以使用许多 cmdlet,包括 Get-NetLocalgroup。

Import-Module .\PowerSploit.psd1
查看 PSModulePath
$env:PSModulePath

当导入 PowerSploit.psd1 模块时, Get-NetLocalgroup 函数会被识别。这是因为当我们加载 PowerSploit.psd1 时,会包含多个模块。可以通过将文件添加到 PSModulePath 中引用的目录来永久添加一个模块或多个模块。如果我们使用 Windows OS 作为主要攻击主机,这个操作是有意义的,但在实际操作中,将特定的脚本传输到攻击主机并按需导入它们会更有效率。

检查执行策略状态
Get-ExecutionPolicy 

我们当前的设置限制了用户可以执行的操作。如果我们想要更改设置,可以使用 Set-ExecutionPolicy cmdlet 来完成。

设置执行策略
Set-ExecutionPolicy undefined

通过将策略设置为未定义,我们是在告诉 PowerShell 我们不希望限制我们的交互。现在我们应该能够导入并运行我们的脚本。

更改执行策略范围
Set-ExecutionPolicy -scope Process 

在进程级别更改它,一旦我们关闭 PowerShell 会话,我们的更改将恢复。在处理脚本和新模块时,请记住执行策略。当然,我们首先想查看我们试图加载的脚本,以确保它们是安全的。作为渗透测试人员,我们可能会遇到需要创造性地绕过主机执行策略的情况。这篇博客文章介绍了一些我们在实际项目中成功使用过的创造性方法。

使用 Get-Command

如果我们想查看导入的模块为会话带来了哪些别名、cmdlets 和函数,我们可以使用 Get-Command -Module <modulename> 来帮助我们了解。

Get-Command -Module PowerSploit

模块仓库

在当今时代,共享信息变得极其容易。这适用于解决方案和新创作。当谈到 PowerShell 模块时,PowerShell Gallery 是最佳选择。它是一个包含由 Microsoft 和其他用户创建的 PowerShell 脚本、模块等内容的仓库。它们可以涵盖从处理用户属性这样简单的事情到解决复杂的云存储问题等各种内容。

方便的是,PowerShell 中已经内置了一个模块,旨在帮助我们与 PowerShell Gallery 交互,该模块名为 PowerShellGet 。让我们来看看它:

Get-Command -Module PowerShellGet 
查找模块

此模块具有许多不同的功能,以帮助我们处理和从库中下载现有模块,以及创建和上传我们自己的模块。从我们的功能列表中,让我们尝试一下 Find-Module。对系统管理员来说将极其有用的一个模块是 AdminToolbox 模块。它是一个包含其他几个模块的集合,这些模块提供了用于 Active Directory 管理、Microsoft Exchange、虚拟化以及其他管理员在任何给定日常任务中可能需要的其他工具。

Find-Module -Name AdminToolbox 
安装模块

与许多其他 PowerShell cmdlet 类似,我们也可以使用通配符进行搜索。一旦找到我们希望使用的模块,安装它就很容易了,只需 Install-Module 就可以了。请记住,以这种方式安装模块需要管理员权限。

用户和组管理

作为一名系统管理员,用户和组管理是一项关键技能,因为我们的用户通常是管理和组织最大的攻击向量。作为渗透测试人员,了解如何枚举、解释和利用用户和组是在渗透测试过程中获取访问权限和提升权限的最简单方法之一。本节将涵盖用户和组是什么,如何使用 PowerShell 管理它们,以及简要介绍 Active Directory 域和域用户的概念。

用户管理

用户账户是人员访问和使用主机资源的一种方式。在某些情况下,系统也会使用专门配置的用户账户来执行操作。当考虑账户时,我们通常会遇到四种不同类型:

  • 服务账户
  • 内置账户
  • 本地账户
  • 域用户

默认本地账户

在每次安装 Windows 时,都会创建几个账户,以帮助主机管理和基本使用。以下是标准内置账户的列表。

Account  账户Description  描述
Administrator此账户用于在本地主机上完成管理任务。
Default Account系统使用默认账户来运行多用户认证应用程序,例如 Xbox 实用程序。
Guest Account该账户是一个具有有限权限的账户,允许没有正常用户账户的用户访问主机。它默认禁用,并且应该保持禁用状态。
WDAGUtility Account该账户是为了 Defender 应用程序保护而设置的,它可以将应用程序会话沙盒化。

添加/删除/编辑用户账户和组

像 PowerShell 中的大多数其他内容一样,我们使用 getnewset 动词来查找、创建和修改用户和组。如果处理本地用户和组,可以使用 localuser & localgroup 来完成。对于域资源, aduser & adgroup 就可以搞定。如果我们不确定,始终可以使用 Get-Command *user* cmdlet 来查看我们有什么访问权限。让我们尝试其中几个。

识别本地账户
PS C:\htb> Get-LocalUser  
  
Name               Enabled Description
----               ------- -----------
Administrator      False   Built-in account for administering the computer/domain
DefaultAccount     False   A user account managed by the system.
DLarusso           True    High kick specialist.
Guest              False   Built-in account for guest access to the computer/domain
sshd               True
WDAGUtilityAccount False   A user account managed and used by the system for Windows Defender A...

Get-LocalUser 将显示我们主机上的用户。这些用户只能访问这个特定的主机。让我们假设我们想要创建一个名为 JLawrence 的新本地用户。我们可以使用 New-LocalUser 来完成这项任务。如果我们不确定正确的语法,请别忘了 Get-Help 命令。在创建新本地用户时,从语法角度来看,唯一真正的要求是输入 name 并指定一个 password (或 -NoPassword )。所有其他设置,如描述或账户过期,都是可选的。

创建新用户
New-LocalUser -Name "JLawrence" -NoPassword

在上面,我们创建了用户 JLawrence 并且没有设置密码。因此这个账户是活跃的并且可以无密码登录。根据我们使用的 Windows 版本,不设置密码会向 Windows 标记这是一个 Microsoft live 账户,并且它尝试以这种方式登录而不是使用本地密码。

修改用户
$Password = Read-Host -AsSecureString

Set-LocalUser -Name "JLawrence" -Password $Password -Description "CEO EagleFang"
识别组
PS C:\htb> Get-LocalGroup  

Name                                Description
----                                -----------
Access Control Assistance Operators Members of this group can remotely query authorization attr...
Administrators                      Administrators have complete and unrestricted access to the...
Backup Operators                    Backup Operators can override security restrictions for the...
Cryptographic Operators             Members are authorized to perform cryptographic operations.
Device Owners                       Members of this group can change system-wide settings.
Distributed COM Users               Members are allowed to launch, activate and use Distributed...
Event Log Readers                   Members of this group can read event logs from local machine
Guests                              Guests have the same access as members of the Users group b...
Hyper-V Administrators              Members of this group have complete and unrestricted access...
IIS_IUSRS                           Built-in group used by Internet Information Services.
Network Configuration Operators     Members in this group can have some administrative privileg...
Performance Log Users               Members of this group may schedule logging of performance c...
Performance Monitor Users           Members of this group can access performance counter data l...
Power Users                         Power Users are included for backwards compatibility and po...
Remote Desktop Users                Members in this group are granted the right to logon remotely
Remote Management Users             Members of this group can access WMI resources over managem...
Replicator                          Supports file replication in a domain
System Managed Accounts Group       Members of this group are managed by the system.
Users                               Users are prevented from making accidental or intentional s...

PS C:\Windows\system32> Get-LocalGroupMember -Name "Users"

ObjectClass Name                             PrincipalSource
----------- ----                             ---------------
User        DESKTOP-B3MFM77\demo             Local
User        DESKTOP-B3MFM77\JLawrence        Local
Group       NT AUTHORITY\Authenticated Users Unknown
Group       NT AUTHORITY\INTERACTIVE         Unknown