tryhackme-网络安全基础-命令行- Windows PowerShell-22
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/PSWindows
PS 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-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
[...]
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-Date
NAME
Get-Date
SYNOPSIS
Gets the current date and time.
SYNTAX
Get-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>]
DESCRIPTION
The `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 LINKS
Online Version: https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1&WT.mc_id=ps-gethelp
ForEach-Object
Get-Culture
Get-Member
New-Item
New-TimeSpan
Set-Date
Set-Culture xref:International.Set-Culture
REMARKS
To 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-Alias
CommandType 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 YAML
2.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 PSOjects
0.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 的功能。
Task 4 Navigating the File System and Working with Files
PowerShell 提供了一系列用于浏览文件系统和管理文件的 cmdlet,其中许多命令在传统的 Windows CLI 中都有对应的功能。
与命令提示符中的 dir 命令(或类 Unix 系统中的 ls 命令)类似,Get-ChildItem 会列出使用 -Path 参数指定位置的文件和目录。它可用于浏览目录并查看其内容。如果未指定 Path,则该 cmdlet 将显示当前工作目录的内容。
PS C:\Users\captain> Get-ChildItem
Directory: C:\Users\captain
Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 5/8/2021 9:15 AM Desktop
d-r--- 9/4/2024 10:58 AM Documents
d-r--- 5/8/2021 9:15 AM Downloads
d-r--- 5/8/2021 9:15 AM Favorites
d-r--- 5/8/2021 9:15 AM Links
d-r--- 5/8/2021 9:15 AM Music
d-r--- 5/8/2021 9:15 AM Pictures
d----- 5/8/2021 9:15 AM Saved Games
d-r--- 5/8/2021 9:15 AM Videos
要导航到其他目录,我们可以使用 Set-Location cmdlet。它会更改当前目录,将我们带到指定的路径,类似于命令提示符中的 cd 命令。
PS C:\Users\captain> Set-Location -Path ".\Documents"
PS C:\Users\captain\Documents>
传统的 Windows CLI 使用单独的命令来创建和管理不同的项目(例如目录和文件),而 PowerShell 通过提供一组 cmdlet 来处理文件和目录的创建和管理,从而简化了此过程。
要在 PowerShell 中创建项目,我们可以使用 New-Item 命令。我们需要指定项目的路径及其类型(无论是文件还是目录)。
PS C:\Users\captain\Documents> New-Item -Path ".\captain-cabin\captain-wardrobe" -ItemType "Directory"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 9/4/2024 12:20 PM captain-wardrobe
PS C:\Users\captain\Documents> New-Item -Path ".\captain-cabin\captain-wardrobe\captain-boots.txt" -ItemType "File"
Directory: C:\Users\captain\Documents\captain-cabin\captain-wardrobe
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 11:46 AM 0 captain-boots.txt
类似地,Remove-Item cmdlet 会同时删除目录和文件,而在 Windows CLI 中我们有单独的命令 rmdir 和 del。
PS C:\Users\captain\Documents> Remove-Item -Path ".\captain-cabin\captain-wardrobe\captain-boots.txt"
PS C:\Users\captain\Documents> Remove-Item -Path ".\captain-cabin\captain-wardrobe"
我们可以复制或移动文件和目录,分别使用 Copy-Item(相当于复制)和 Move-Item(相当于移动)。
PS C:\Users\captain\Documents> Copy-Item -Path .\captain-cabin\captain-hat.txt -Destination .\captain-cabin\captain-hat2.txt
PS C:\Users\captain\Documents> Get-ChildItem -Path ".\captain-cabin\"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 9/4/2024 12:50 PM captain-wardrobe
-a---- 9/4/2024 12:50 PM 0 captain-boots.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat2.txt
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
最后,要读取和显示文件的内容,我们可以使用 Get-Content cmdlet,其工作方式类似于命令提示符中的 type 命令(或类 Unix 系统中的 cat)。
PS C:\Users\captain\Documents\captain-cabin> Get-Content -Path ".\captain-hat.txt"
_ _
| | | |
| |__ __ _| |_
| '_ \ / _ | __|
| | | | (_| | |_
|_| |_|\__,_|\__|
Don't touch my hat!
Task 5 Piping, Filtering, and Sorting Data
管道是命令行环境中使用的一种技术,允许将一个命令的输出用作另一个命令的输入。这会创建一个操作序列,其中数据从一个命令流向下一个命令。管道由 | 符号表示,广泛用于 Windows CLI(如本模块前面介绍的那样)以及基于 Unix 的 Shell。
在 PowerShell 中,管道功能更加强大,因为它可以传递对象而不仅仅是文本。这些对象不仅包含数据,还包含描述数据并与数据交互的属性和方法。
例如,如果您想获取目录中的文件列表,然后按大小排序,您可以在 PowerShell 中使用以下命令:
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Sort-Object Length
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:50 PM 0 captain-boots.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat2.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat.txt
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
d----- 9/4/2024 12:50 PM captain-wardrobe
这里,Get-ChildItem 检索文件(作为对象),然后管道 (|) 将这些文件对象发送到 Sort-Object,后者根据其 Length(大小)属性对它们进行排序。这种基于对象的方法允许更详细、更灵活的命令序列。
在上面的示例中,我们利用 Sort-Object cmdlet 根据指定属性对对象进行排序。除了排序之外,PowerShell 还提供了一组 cmdlet,这些 cmdlet 与管道结合使用时,可以进行高级数据操作和分析。
要根据指定条件过滤对象,仅返回符合条件的对象,我们可以使用 Where-Object cmdlet。例如,要仅列出目录中的 .txt 文件,我们可以使用:
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Where-Object -Property "Extension" -eq ".txt"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:50 PM 0 captain-boots.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat2.txt
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
这里,Where-Object 根据文件的扩展名属性进行过滤,确保只列出扩展名等于 (-eq) .txt 的文件。
运算符 -eq(即“等于”)是与其他脚本语言(例如 Bash、Python)共享的一组比较运算符的一部分。为了展示 PowerShell 过滤功能的潜力,我们从该列表中选择了一些最有用的运算符:
-ne:“不等于”。此运算符可用于根据指定条件从结果中排除对象。
-gt:“大于”。此运算符将仅过滤超过指定值的对象。需要注意的是,这是一个严格比较,这意味着等于指定值的对象将被排除在结果之外。
-ge:“大于或等于”。这是前一个运算符的非严格版本。-gt 和 -eq 的组合。
-lt:“小于”。与“大于”类似,这是一个严格运算符。它只会包含严格小于某个值的对象。
-le:“小于或等于”。与 -ge 类似,这是前一个运算符的非严格版本。-lt 和 -eq 的组合。
下面的另一个示例显示,也可以通过选择与指定模式匹配(类似)的属性来过滤对象:
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Where-Object -Property "Name" -like "ship*"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
下一个过滤 cmdlet Select-Object 用于从对象中选择特定属性或限制返回的对象数量。它有助于优化输出,使其仅显示所需的详细信息。
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Select-Object Name,Length
Name Length
---- ------
captain-wardrobe
captain-boots.txt 0
captain-hat.txt 264
captain-hat2.txt 264
ship-flag.txt 2116
cmdlet 管道可以通过添加更多命令来扩展,因为该功能不仅限于两个 cmdlet 之间的管道传输。作为练习,请尝试构建一个 cmdlet 管道来对输出进行排序和筛选,目标是显示 C:\Users\captain\Documents\captain-cabin 目录中最大的文件。
Get-ChildItem | Sort-Object Length -Descending | Select-Object -First 1
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
这组过滤 cmdlet 中的最后一个是 Select-String。此 cmdlet 在文件中搜索文本模式,类似于 Unix 系统中的 grep 或 Windows 命令提示符中的 findstr。它通常用于在日志文件或文档中查找特定内容。
PS C:\Users\captain\Documents\captain-cabin> Select-String -Path ".\captain-hat.txt" -Pattern "hat"
captain-hat.txt:8:Don't touch my hat!
Select-String cmdlet 完全支持使用正则表达式 (regex)。此高级功能允许在文件内进行复杂的模式匹配,使其成为搜索和分析文本数据的强大工具。
https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions
Task 6 System and Network Information
PowerShell 的诞生是为了满足日益增长的对强大自动化和管理工具的需求,以帮助系统管理员和 IT 专业人员。因此,它提供了一系列 cmdlet,允许检索有关系统配置和网络设置的详细信息。
Get-ComputerInfo cmdlet 可以检索全面的系统信息,包括操作系统信息、硬件规格、BIOS 详细信息等。它只需一条命令即可提供整个系统配置的快照。而其传统的对应命令 systeminfo 只能检索一小部分相同的详细信息。
PS C:\Users\captain> Get-ComputerInfo
WindowsBuildLabEx : 20348.859.amd64fre.fe_release_svc_prod2.220707-1832
WindowsCurrentVersion : 6.3
WindowsEditionId : ServerDatacenter
WindowsInstallationType : Server Core
WindowsInstallDateFromRegistry : 4/23/2024 6:36:29 PM
WindowsProductId : 00454-60000-00001-AA763
WindowsProductName : Windows Server 2022 Datacenter
[...]
Get-LocalUser 是管理用户帐户和了解计算机安全配置的关键工具,它会列出系统上的所有本地用户帐户。默认输出会显示每个用户的用户名、帐户状态和描述。
PS C:\Users\captain> Get-LocalUser
Name Enabled Description
---- ------- -----------
Administrator True Built-in account for administering the computer/domain
captain True The beloved captain of this pirate ship.
DefaultAccount False A user account managed by the system.
Guest False Built-in account for guest access to the computer/domain
WDAGUtilityAccount False A user account managed and used by the system for Windows Defender Application Guard scenarios.
与传统的 ipconfig 命令类似,以下两个 cmdlet 可用于检索有关系统网络配置的详细信息。
Get-NetIPConfiguration 提供有关系统上网络接口的详细信息,包括 IP 地址、DNS 服务器和网关配置。
PS C:\Users\captain> Get-NetIPConfiguration
InterfaceAlias : Ethernet
InterfaceIndex : 5
InterfaceDescription : Amazon Elastic Network Adapter
NetProfile.Name : Network 3
IPv4Address : 10.10.178.209
IPv6DefaultGateway :
IPv4DefaultGateway : 10.10.0.1
DNSServer : 10.0.0.2
如果我们需要有关分配给网络接口的 IP 地址的具体详细信息,Get-NetIPAddress cmdlet 将显示系统上配置的所有 IP 地址的详细信息,包括当前未活动的 IP 地址。
PS C:\Users\captain> Get-NetIPAddress
IPAddress : fe80::3fef:360c:304:64e%5
InterfaceIndex : 5
InterfaceAlias : Ethernet
AddressFamily : IPv6
Type : Unicast
PrefixLength : 64
PrefixOrigin : WellKnown
SuffixOrigin : Link
AddressState : Preferred
ValidLifetime : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource : False
PolicyStore : ActiveStore
IPAddress : ::1
InterfaceIndex : 1
InterfaceAlias : Loopback Pseudo-Interface 1
AddressFamily : IPv6
[...]
IPAddress : 10.10.178.209
InterfaceIndex : 5
InterfaceAlias : Ethernet
AddressFamily : IPv4
[...]
IPAddress : 127.0.0.1
InterfaceIndex : 1
InterfaceAlias : Loopback Pseudo-Interface 1
AddressFamily : IPv4
[...]
这些 cmdlet 使 IT 专业人员能够直接从命令行快速访问关键系统和网络信息,从而更轻松地监控和管理本地和远程机器。
Task 7 Real-Time System Analysis
为了收集更高级的系统信息,尤其是有关正在运行的进程、服务和活动网络连接等动态信息,我们可以利用一组超越静态机器详细信息的 cmdlet。
Get-Process 提供所有当前正在运行的进程的详细视图,包括 CPU 和内存使用情况,使其成为强大的监控和故障排除工具。
PS C:\Users\captain> Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
67 5 872 500 0.06 2340 0 AggregatorHost
55 5 712 2672 0.02 3024 0 AM_Delta_Patch_1.417.483.0
309 13 18312 1256 0.52 1524 0 amazon-ssm-agent
78 6 4440 944 0.02 516 0 cmd
94 7 1224 1744 0.31 568 0 conhost
[...]
同样,Get-Service 允许检索有关计算机上服务状态的信息,例如哪些服务正在运行、停止或暂停。它广泛用于系统管理员的故障排除,也用于取证分析师寻找系统上安装的异常服务。
一把梭:为什么可用于取证分析?因为Get-Service中的Name属性具有唯一性。(底层 Name 包含一个唯一标识符 (LUID) 来区分,例如 Contact Data_443f50。)这里点出来只能让你知道看哪里。来解决那些“异常的”Name名称。并不是说这种方法非常好。因为这种方法要求防御者必须提前知道服务的名称。仅为辅助IOC,而非核心的重大发现(服务name 命名为hack的小黑除外)。
当然,还存在Get-Service不显示的隐藏服务(包括services.exe 、 Get-Service 、 sc query):https://www.sans.org/blog/defense-spotlight-finding-hidden-windows-services
PS C:\Users\captain> Get-Service
Status Name DisplayName
------ ---- -----------
Stopped Amazon EC2Launch Amazon EC2Launch
Running AmazonSSMAgent Amazon SSM Agent
Stopped AppIDSvc Application Identity
Running BFE Base Filtering Engine
Running CertPropSvc Certificate Propagation
Stopped ClipSVC Client License Service (ClipSVC)
[...]
为了监控活动的网络连接,Get-NetTCPConnection 会显示当前的 TCP 连接,从而深入了解本地和远程端点。此 cmdlet 在事件响应或恶意软件分析任务中特别有用,因为它可以发现隐藏的后门或与攻击者控制的服务器建立的连接。
PS C:\Users\captain> Get-NetTCPConnection
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess
------------ --------- ------------- ---------- ----- -------------- -------------
[...]
:: 22 :: 0 Listen 1444
10.10.178.209 49695 199.232.26.172 80 TimeWait 0
0.0.0.0 49668 0.0.0.0 0 Listen 424
0.0.0.0 49667 0.0.0.0 0 Listen 652
0.0.0.0 49666 0.0.0.0 0 Listen 388
0.0.0.0 49665 0.0.0.0 0 Listen 560
0.0.0.0 49664 0.0.0.0 0 Listen 672
0.0.0.0 3389 0.0.0.0 0 Listen 980
10.10.178.209 139 0.0.0.0 0 Listen 4
0.0.0.0 135 0.0.0.0 0 Listen 908
10.10.178.209 22 10.14.87.60 53523 Established Internet 1444
0.0.0.0 22 0.0.0.0 0 Listen 1444
此外,我们将提到 Get-FileHash 是一个用于生成文件哈希的有用 cmdlet,它在事件响应、威胁搜寻和恶意软件分析中特别有价值,因为它有助于验证文件完整性并检测潜在的篡改。
PS C:\Users\captain\Documents\captain-cabin> Get-FileHash -Path .\ship-flag.txt
Algorithm Hash Path
--------- ---- ----
SHA256 54D2EC3C12BF3D[...] C:\Users\captain\Documents\captain-cabin\ship-flag.txt
这些 cmdlet 共同提供了一套用于实时系统监控和分析的综合工具,对事件响应者和威胁猎手特别有用。
Task 8 Scripting
脚本编写是指编写并执行包含在文本文件中的一系列命令(称为脚本)的过程,这些命令可以自动执行通常在 Shell(例如 PowerShell)中手动执行的任务。
简而言之,脚本编写就像给计算机一个待办事项列表,其中脚本中的每一行都是计算机将自动执行的一项任务。这可以节省时间,减少出错的可能性,并允许执行过于复杂或繁琐而无法手动完成的任务。随着您对 Shell 和脚本编写的深入了解,您会发现脚本可以成为管理系统、处理数据等众多功能的强大工具。
学习使用 PowerShell 编写脚本超出了本课程的范围。尽管如此,我们必须明白,它的强大功能使其成为所有网络安全角色的一项关键技能。
对于蓝队专业人员(例如事件响应人员、恶意软件分析师和威胁猎手)而言,PowerShell 脚本可以自动执行许多不同的任务,包括日志分析、检测异常和提取入侵指标 (IOC)。这些脚本还可用于对恶意代码(恶意软件)进行逆向工程,或自动扫描系统以查找入侵迹象。
对于红队(包括渗透测试人员和道德黑客)而言,PowerShell 脚本可以自动执行诸如系统枚举、执行远程命令以及编写混淆脚本以绕过防御等任务。它与所有类型的系统深度集成,使其成为模拟攻击和测试系统抵御现实威胁能力的强大工具。
在网络安全领域,系统管理员可以利用 PowerShell 脚本自动执行完整性检查、管理系统配置和保护网络,尤其是在远程或大规模环境中。PowerShell 脚本可用于执行安全策略、监控系统健康状况并自动响应安全事件,从而增强整体安全态势。
无论是用于防御还是进攻,PowerShell 脚本都是网络安全工具包中一项必不可少的功能。
在结束关于脚本的任务之前,我们不得不提一下 Invoke-Command cmdlet。
Invoke-Command 是在远程系统上执行命令的关键工具,因此它对于系统管理员、安全工程师和渗透测试人员来说至关重要。Invoke-Command 可以实现高效的远程管理,并与脚本结合,实现跨多台机器的任务自动化。它还可以用于渗透测试人员(或攻击者)在交战过程中在目标系统上执行有效载荷或命令。
让我们通过 Get-Help 的“示例”页面来了解这个强大 cmdlet 的一些使用示例:
PS C:\Users\captain> Get-Help Invoke-Command -examples
NAME
Invoke-Command
SYNOPSIS
Runs commands on local and remote computers.
------------- Example 1: Run a script on a server -------------
Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01
The FilePath parameter specifies a script that is located on the local computer. The script runs on the remote computer and the results are returned to the local computer.
--------- Example 2: Run a command on a remote server ---------
Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }
The ComputerName parameter specifies the name of the remote computer. The Credential parameter is used to run the command in the security context of Domain01\User01, a user who has permission to run commands. The ScriptBlock parameter specifies the command to be run on the remote computer.
In response, PowerShell requests the password and an authentication method for the User01 account. It then runs the command on the Server01 computer and returns the result.
[...]
Get-Help“示例”页面提供的以及上文所述的前两个示例足以展现 Invoke-Command cmdlet 的简洁性和强大功能。
第一个示例展示了如何将该 cmdlet 与任何自定义脚本轻松结合,从而在远程计算机上自动执行任务。
第二个示例表明,我们无需了解如何编写脚本即可充分利用 Invoke-Command 的强大功能。事实上,通过在 cmdlet 的语法后附加 -ScriptBlock { ... } 参数,我们就可以在远程计算机上执行任何命令(或命令序列)。其结果与我们在远程计算机上的本地 PowerShell 会话中键入命令的效果相同。
在名为“RoyalFortune”的远程计算机上执行 Get-Service 命令的语法(未授权,无账号密码):
Invoke-Command -ComputerName RoyalFortune -ScriptBlock {Get-Service}
Task 9 Conclusion
干得好,伙计们!你们成功驾驭了 PowerShell 的诡异水域,在 TheBlackPearl 上发现了隐藏的宝藏和难以捉摸的服务。
掌握了这些工具,你们就能轻松探索任何 Windows 系统中戒备最森严的角落。
记住,真正的海盗永不停歇地寻宝——所以,继续磨练你的技能吧,谁知道在下一次冒险中你会发现什么宝藏呢?在此之前,祝你的 cmdlet 锋利,脚本运行流畅。一路顺风,狩猎愉快!
要继续提升你的命令行技能,请前往本模块的下一个环节“Linux 命令行”教室。
https://tryhackme.com/r/room/linuxshells

浙公网安备 33010602011771号