简介
内置命令行 shell CMD.exe 和 PowerShell 是包含在所有 Windows 主机中的两个实现。这些工具提供对操作系统的直接访问,自动化常规任务,并为用户提供对计算机和安装应用程序的任何方面的细粒度控制。
cmd与powershell
Windows 命令提示符和 PowerShell 之间存在一些关键差异,我们将在整个模块中看到这些差异。
一个关键差异是,您可以从 PowerShell 控制台运行命令提示符命令,但从命令提示符运行 PowerShell 命令,您必须在命令前加上 powershell (即 powershell get-alias )。下表概述了其他一些关键差异。
| PowerShell | Command 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
目前位置
在进行主机上的任何操作之前,了解我们当前在文件系统中的位置是有帮助的。我们可以通过使用 cd 或 chdir 命令来确定这一点。
cd
不带参数发出命令会给我们 current working directory 。我们当前的工作目录是我们的初始起点。它描述了我们当前所在的目录。在这里运行的任何命令(如果)不指定其他目录或文件的路径,将引用这个初始点。考虑到我们接下来所做的一切都将引用当前工作目录,除非另有指定,这一点非常重要。
移动
在我们忙着在系统中找到自己的位置时,我们引入了 cd 和 chdir 命令。然而,我们没有探索它们全部的功能。除了列出我们当前目录之外,这两个命令还有一个附加功能。这些命令将把我们移动到命令后面指定的任何目录。指定的目录可以是相对于我们当前工作目录的目录,也可以是从文件系统根目录开始的绝对目录。
探索文件系统
利用我们新获得的技能,我们应该深入研究系统。彻底的探索至关重要,因为它可以帮助我们获得在理解我们正在交互的系统的布局和其中包含的文件方面相当大的优势。然而,当我们浏览 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
创建一个目录来添加到我们的结构是一个简单的任务。我们可以使用 md 和 mkdir 命令。
删除目录 rd/rmdir
使用 rd 或 rmdir 命令可以删除目录。rd 和 rmdir 命令专门用于删除目录树,不处理特定的文件或属性。
单纯使用命令不会删除含有文件的目录
Rd 有一个开关 /S ,我们可以使用它来删除目录及其内容。由于我们希望 Git-Pulls 失效,因此在上面看到的第二个 cmd 会话中执行它。我们使用 rd 发出的命令与 rmdir 相同。
修改目录
文件操作
在管理目录时,我们使用的一些命令也可以用于文件。Windows 提供了许多内置工具,我们可以用来享受文件的魔力。我们这里将介绍其中的几个。我们先来讨论一下如何查看文件及其内容。
我们已经知道,可以根据我们使用的开关,利用 dir 命令查看目录中的文件,以及关于文件的具体信息。这通常是查看目录中哪些文件存在的最简单方法。我们还使用 tree /F 命令可以显示包含树中所有目录和文件的输出。但是,如果我们想查看文件的内容呢?我们可以利用 more 、 openfiles 和 type 命令。
查看文件
more命令
首先,让我们使用 more 。有了这个内置工具,我们可以一次查看文件的内容或打印到文件中的另一个命令的结果。这就像缓冲可能溢出终端缓冲区的滚动文本。
more secrets.txt
请注意,cmd-session 底部显示了文件的浏览百分比。当我们点击 enter 或 space bar 时,它会为我们滚动文档文本,显示文件中越来越多的文件内容。对于包含多个空行或大量数据之间空格的大型文件,我们可以使用 /S 选项将空格压缩到单行,以便更容易查看。这不会修改文件,就像 more 命令输出空格一样。
More /S 更多/S
more /S secrets.txt
Type命令
Type 可以一次显示多个文本文件的内容。也可以使用 type 进行文件重定向。这是一个简单但非常实用的工具。 type 的一个有趣之处在于,它不会锁定文件,所以不用担心弄乱文件。
这仅此而已。Type 提供简单的文件输出。我们也可以使用它来将输出发送到另一个文件。这可以快速创建一个新文件或将数据附加到另一个文件。
创建和修改文件
从命令行创建和修改文件相对容易。我们有多个选项,包括 echo 、 fsutil 、 ren 、 rename 和 replace 。首先, 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 Name 、 IPv4 Address 、 Subnet Mask 和 Default 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 testers 和 even as defenders 来说,会有所帮助。作为系统管理员,PowerShell 可以为我们提供比 CMD 更多的能力。它 expandable ,专为 automation 和脚本而构建,具有更强大的安全实现,并且可以处理 CMD 简单无法处理的许多不同任务。作为渗透测试人员,PowerShell 内置了许多众所周知的能力。PowerShell 的模块导入功能使我们能够轻松地将工具带入环境并确保它们能够正常工作。然而,从隐身的角度来看,PowerShell 的 logging 和 history 功能非常强大,会记录更多我们与主机的交互。因此,如果我们不需要 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 的完整输出。我们可以通过过滤 verb 或 noun 部分来进一步缩减输出。
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,我们可以看到 verb 是 Test , Noun 是 Wsman 。动词和名词之间用短横线 - 分隔。在动词和名词之后,我们会使用与给定 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 中的大多数其他内容一样,我们使用 get 、 new 和 set 动词来查找、创建和修改用户和组。如果处理本地用户和组,可以使用 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