tryhackme-Cyber Security 101-Command Line-Windows PowerShell
房间地址:https://tryhackme.com/room/windowspowershell
这是网络安全入门的基础模块的计算机科学基础知识:Windows PowerShell,序号 01 表示第一篇文章,当你不知道从哪里开始的时候,你可以按照数字顺序来进行参考即可。
Windows PowerShell
Task 1 Introduction
嗨!如果您来到这里,要么是因为听说过 PowerShell 的神奇之处,想要了解更多;要么是因为您刚刚从命令行模块的第一个房间——Windows 命令行——过来了。无论哪种方式,您都将踏上探索这个强大 Shell 的奇妙之旅,学习如何使用它来揭开任何 Windows 系统的秘密。Avast,那就上船吧!
https://tryhackme.com/r/room/windowscommandline
学习目标
这是命令行模块的第二个单元。它是 PowerShell 的入门单元,PowerShell 是历史上仅有的第二个为 Windows 操作系统构建的命令行实用程序。
https://tryhackme.com/module/command-line
了解 PowerShell 是什么及其功能。
理解 PowerShell 语言的基本结构。
学习并运行一些基本的 PowerShell 命令。
了解 PowerShell 在网络安全行业的众多应用。
房间先决条件
在进入此房间之前,建议您先了解“Windows 和 AD 基础知识”模块以及“Windows 命令行”房间中的概念。
https://tryhackme.com/module/windows-and-active-directory-fundamentals
https://tryhackme.com/r/room/windowscommandline
Task 2 What Is PowerShell
来自微软官方页面:“PowerShell 是一个由命令行 shell、脚本语言和配置管理框架组成的跨平台任务自动化解决方案。”
https://learn.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.4
PowerShell 是微软专为任务自动化和配置管理而设计的一款强大工具。它结合了命令行界面和基于 .NET 框架构建的脚本语言。与传统的基于文本的命令行工具不同,PowerShell 是面向对象的,这意味着它可以处理复杂的数据类型并更有效地与系统组件交互。PowerShell 最初仅适用于 Windows,最近已扩展到支持 macOS 和 Linux,使其成为跨不同操作系统的 IT 专业人员的多功能选择。
- PowerShell简史
PowerShell 的开发是为了克服 Windows 中现有命令行工具和脚本环境的局限性。21 世纪初,随着 Windows 在复杂的企业环境中日益普及,cmd.exe 和批处理文件等传统工具在自动化和管理这些系统方面显得力不从心。微软需要一款能够处理更复杂的管理任务并与 Windows 现代 API 交互的工具。
微软工程师 Jeffrey Snover 意识到 Windows 和 Unix 处理系统操作的方式不同——Windows 使用结构化数据和 API,而 Unix 则将所有内容视为文本文件。这种差异使得将 Unix 工具移植到 Windows 变得不切实际。Snover 的解决方案是开发一种面向对象的方法,将脚本的简便性与 .NET 框架的强大功能相结合。PowerShell 于 2006 年发布,它允许管理员通过操作对象更有效地自动化任务,并提供与 Windows 系统的更深入集成。
随着 IT 环境不断发展,涵盖各种操作系统,对多功能自动化工具的需求也日益增长。 2016 年,微软做出了回应,发布了 PowerShell Core,这是一个可在 Windows、macOS 和 Linux 上运行的开源跨平台版本。
- PowerShell 的强大功能
要充分理解 PowerShell 的强大功能,我们首先需要理解对象的含义。
在编程中,对象代表具有属性(特性)和方法(操作)的事物。例如,汽车对象可能具有 Color、Model 和 FuelLevel 等属性,以及 Drive()、HonkHorn() 和 Refuel() 等方法。
同样,在 PowerShell 中,对象是封装数据和功能的基本单元,使信息管理和操作更加便捷。PowerShell 中的对象可以包含文件名、用户名或大小作为数据(属性),并执行诸如复制文件或停止进程之类的函数(方法)。
传统 Command Shell 的基本命令是基于文本的,这意味着它们以纯文本形式处理和输出数据。而当在 PowerShell 中运行 cmdlet(发音为 command-let)时,它会返回保留其属性和方法的对象。由于这些对象不需要额外的文本解析,因此可以实现更强大、更灵活的数据操作。
我们将在接下来的部分中进一步探讨有关 PowerShell 的 cmdlet 及其功能。
Task 3 PowerShell Basics
在继续我们的 PowerShell 之旅之前,让我们先连接到实验环境。按下“Start Machine”按钮,然后按下页面顶部的“Start AttackBox”按钮启动 AttackBox。AttackBox 机器将以分屏视图启动。如果看不到,请使用页面顶部的蓝色“Show Split View”按钮。
您可以按照以下步骤使用 Remmina 客户端通过 SSH 连接到目标虚拟机。
点击“应用程序”(如下图所示,编号为 1)。选择“Internet”(编号为 2),然后选择“Remmina”(编号为 3)。

将会弹出一个窗口,提示您输入密码以解锁 AttackBox 的密钥环。点击“取消”即可忽略该提示。

从下拉菜单中选择 SSH 选项(下图中的数字 1),然后在顶部的栏中粘贴目标 IP:MACHINE_IP(数字 2)。最后,点击 Enter。

在下一个窗口中,输入下面卡片中的凭据,然后单击“确定”。
Username captain
Password JollyR0ger#
IP MACHINE_IP
- 启动 PowerShell
您可以通过多种方式启动 PowerShell,具体取决于您的需求和环境。如果您在 Windows 系统上使用图形界面 (GUI),以下是一些可行的启动方式:
“开始”菜单:在 Windows“开始”菜单搜索栏中输入“powershell”,然后在搜索结果中点击“Windows PowerShell”或“PowerShell”。
“运行”对话框:按 Win + R 打开“运行”对话框,输入“powershell”,然后按 Enter。
“文件资源管理器”:导航到任意文件夹,在地址栏中输入“powershell”,然后按 Enter。这将在该特定目录中打开 PowerShell。
“任务管理器”:打开“任务管理器”,依次选择“文件”>“运行新任务”,输入“powershell”,然后按 Enter。
或者,也可以通过输入 powershell 并按 Enter 键从命令提示符 (cmd.exe) 启动 PowerShell。
在我们的例子中,我们只能访问目标 VM 的命令提示符,这是我们将使用的方法。
captain@THEBLACKPEARL C:\Users\captain>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindowsPS C:\Users\captain>
PowerShell 启动后,我们会在当前工作目录中看到 PS(代表 PowerShell)提示符。
- 基本语法:动词-名词 Verb-Noun
如前所述,PowerShell 命令被称为 cmdlet(发音为 command-lets)。它们比传统的 Windows 命令功能强大得多,并且允许进行更高级的数据操作。
Cmdlet 遵循一致的动词-名词命名约定。这种结构使每个 cmdlet 的功能易于理解。动词描述操作,名词指定执行操作的对象。例如:
Get-Content:检索(获取)文件内容并将其显示在控制台中。
Set-Location:更改(设置)当前工作目录。
- 基本 Cmdlet
要列出当前 PowerShell 会话中可执行的所有可用 cmdlet、函数、别名和脚本,我们可以使用 Get-Command。它是发现可用命令的重要工具。
PS C:\Users\captain> Get-CommandCommandType 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
[...]
Function A:
Function Add-BCDataCacheExtension 1.0.0.0 BranchCache
Function Add-DnsClientDohServerAddress 1.0.0.0 DnsClient
[...]
Cmdlet Add-AppxPackage 2.0.1.0 Appx
Cmdlet Add-AppxProvisionedPackage 3.0 Dism
Cmdlet Add-AppxVolume 2.0.1.0 Appx
[...]
对于 cmdlet 检索到的每个 CommandInfo 对象,控制台上都会显示一些基本信息(属性)。可以根据显示的属性值过滤命令列表。例如,如果我们只想显示“function”类型的可用命令,可以使用 -CommandType "Function",如下所示:
PS C:\Users\captain> Get-Command -CommandType "Function"CommandType Name Version Source
----------- ---- ------- ------
Function A:
Function Add-BCDataCacheExtension 1.0.0.0 BranchCache
Function Add-DnsClientDohServerAddress 1.0.0.0 DnsClient
Function Add-DnsClientNrptRule 1.0.0.0 DnsClient
[...]
我们将在接下来的任务中学习更高效的 cmdlet 输出过滤方法。
另一个值得我们随时掌握的必备 cmdlet 是 Get-Help:它提供了有关 cmdlet 的详细信息,包括用法、参数和示例。它是学习如何使用 PowerShell 命令的必备 cmdlet。
PS C:\Users\captain> Get-Help Get-DateNAMEGet-DateSYNOPSISGets the current date and time.SYNTAXGet-Date [[-Date] <System.DateTime>] [-Day <System.Int32>] [-DisplayHint {Date | Time | DateTime}] [-Format <System.String>] [-Hour <System.Int32>] [-Millisecond <System.Int32>] [-Minute <System.Int32>] [-Month <System.Int32>] [-Second <System.Int32>] [-Year <System.Int32>] [<CommonParameters>]Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>] [-DisplayHint {Date | Time | DateTime}] [-Hour <System.Int32>] [-Millisecond <System.Int32>] [-Minute <System.Int32>] [-Month <System.Int32>] [-Second <System.Int32>] [-UFormat <System.String>] [-Year <System.Int32>] [<CommonParameters>]DESCRIPTIONThe `Get-Date` cmdlet gets a DateTime object that represents the current date or a date that you specify. `Get-Date` can format the date and time in several .NET and UNIX formats. You can use `Get-Date` to generate a date or time character string, and then send the string to other cmdlets or programs.`Get-Date` uses the current culture settings of the operating system to determine how the output is formatted. To view your computer's settings, use `(Get-Culture).DateTimeFormat`.RELATED LINKSOnline Version: https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1&WT.mc_id=ps-gethelpForEach-ObjectGet-CultureGet-MemberNew-ItemNew-TimeSpanSet-DateSet-Culture xref:International.Set-CultureREMARKSTo see the examples, type: "get-help Get-Date -examples".For more information, type: "get-help Get-Date -detailed".For technical information, type: "get-help Get-Date -full".For online help, type: "get-help Get-Date -online".
如上图所示,Get-Help 告诉我们,通过在基本语法后附加一些选项,我们可以检索有关 cmdlet 的其他有用信息。例如,通过在上面显示的命令后附加 -examples,我们将看到所选 cmdlet 的常用使用方法列表。
为了让 IT 专业人员更轻松地过渡,PowerShell 为许多传统 Windows 命令提供了别名(即 cmdlet 的快捷方式或替代名称)。对于熟悉其他命令行工具的用户来说,Get-Alias 功能必不可少,它会列出所有可用的别名。例如,dir 是 Get-ChildItem 的别名,cd 是 Set-Location 的别名。
PS C:\Users\captain> Get-AliasCommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias asnp -> Add-PSSnapin
Alias cat -> Get-Content
Alias cd -> Set-Location
Alias CFS -> ConvertFrom-String 3.1.0.0 Microsoft.PowerShell.Utility
Alias chdir -> Set-Location
Alias clc -> Clear-Content
Alias clear -> Clear-Host
[...]
- 在哪里查找和下载 Cmdlet
PowerShell 的另一个强大功能是可以通过从在线存储库下载其他 cmdlet 来扩展其功能。
注意:请注意,本节列出的 cmdlet 需要有效的互联网连接才能查询在线存储库。连接的计算机无法访问互联网,因此这些命令在此环境下无法运行。
要在 PowerShell 库等在线存储库中搜索模块(cmdlet 集合),我们可以使用 Find-Module。有时,如果我们不知道模块的确切名称,搜索名称相似的模块会很有用。我们可以通过筛选 Name 属性并在模块的部分名称后附加通配符 (*) 来实现,使用以下标准 PowerShell 语法:Cmdlet -Property "pattern*"。
PS C:\Users\captain> Find-Module -Name "PowerShell*" Version Name Repository Description
------- ---- ---------- -----------
0.4.7 powershell-yaml PSGallery Powershell module for serializing and deserializing YAML2.2.5 PowerShellGet PSGallery PowerShell module with commands for discovering, installing, updating and publishing the PowerShell artifacts like Modules, DSC Resources, Role Capabilities and Scripts.
1.0.80.0 PowerShell.Module.InvokeWinGet PSGallery Module to Invoke WinGet and parse the output in PSOjects0.17.0 PowerShellForGitHub PSGallery PowerShell wrapper for GitHub API
一旦识别,就可以使用 Install-Module 从存储库下载并安装模块,从而使模块中包含的新 cmdlet 可供使用。
PS C:\Users\captain> Install-Module -Name "PowerShellGet"Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"):
有了这些必备工具,我们现在可以开始探索 PowerShell 的功能。