【权限维持技术】编写PowerShell脚本

admin 2024年1月10日16:55:22评论23 views字数 3355阅读11分11秒阅读模式
【权限维持技术】编写PowerShell脚本

免责声明

【权限维持技术】编写PowerShell脚本

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。

【权限维持技术】编写PowerShell脚本

PowerShell脚本

【权限维持技术】编写PowerShell脚本
PowerShell脚本是一系列PowerShell指令的集合,存储在一个文件中,用于自动执行复杂和重复的任务。这些脚本文件的扩展名通常为.ps1。
在PowerShell脚本中,您可以使用条件语句(如if...else)、循环语句(如for or foreach)、定义变量、调用函数和Cmdlet、处理错误等PowerShell的所有基础特性。例如,以下脚本可以列出一个目录中的所有文件,并删除它们:
$folderPath = "C:MyFolder"Get-ChildItem -Path $folderPath | Remove-Item
在上面的例子中,第一行定义了一个变量,保存了一个文件夹的路径。第二行则通过Get-ChildItem cmdlet获取了该路径下的所有项,并通过管道符'|'将结果传递给Remove-Item cmdlet删除它们。
为了运行PowerShell脚本,你需要在PowerShell环境中输入脚本的完整路径,如下所示:
C:PathToYourScript.ps1
但是为了执行脚本,你可能需要修改PowerShell的执行策略。默认策略通常不允许未签名的脚本运行。可以使用 Set-ExecutionPolicy cmdlet修改执行策略。
【权限维持技术】编写PowerShell脚本

变量

【权限维持技术】编写PowerShell脚本
在PowerShell中,变量用于存储值,这些值可以包括字符串、整数、布尔值(True或False),还可以是对象或其他复杂数据类型。所有变量都以美元符号($)开头。
声明和分配变量的基本语法如下:
$myVariable = "This is my variable."
这里,"myVariable"是变量名,可以是你选定的任何名称(只要符合命名规则),"This is my variable."是赋给它的值。
为了在脚本或命令输出中显示变量的值,只需要直接引用变量名即可。例如:
Write-Output $myVariable
这条命令将会输出 "This is my variable."。

【权限维持技术】编写PowerShell脚本

PowerShell变量不仅可以存储简单的数据类型(如字符串和数字),也可以存储数组和哈希表等复杂数据类型。例如,以下代码声明了一个数组变量:
$myArray = 1,2,3,4,5

【权限维持技术】编写PowerShell脚本

而这段代码声明了一个哈希表变量:
$myHashTable = @{Name="PowerShell"; Version="7.0"}

【权限维持技术】编写PowerShell脚本

在PowerShell中,你甚至可以在变量中存储整个对象,比如进程对象或服务对象,这就使得在后续的处理和操作中更为灵活。
【权限维持技术】编写PowerShell脚本

对象

【权限维持技术】编写PowerShell脚本
在PowerShell中,所有的事物都被视为对象。对象是包含数据和行为的实体。
数据通常以对象的属性(或字段)形式呈现,属性包含有关对象的详细信息。例如,如果有一个表示文件的对象,其属性可能包括文件名、大小、创建日期等。
行为经常体现为对象的方法,方法表示对象可以执行的操作。例如,文件对象可能有一个删除方法,用于删除文件。
PowerShell提供了几种方法来创建自定义对象。下面是一个例子,创建一个简单的对象来表示一辆汽车:
$car = New-Object -TypeName psobjectAdd-Member -InputObject $car -MemberType NoteProperty -Name Make -Value 'Toyota'Add-Member -InputObject $car -MemberType NoteProperty -Name Model -Value 'Corolla'Add-Member -InputObject $car -MemberType NoteProperty -Name Year -Value 2020
在这个例子中,我们首先使用New-Object cmdlet创建一个新的空白对象,并将其存储在$car变量中。
然后我们使用Add-Member cmdlet,将几个名为NoteProperty的成员(等同于属性)添加到我们的汽车对象中,包括Make (制造商),Model (型号) 和 Year (年份)。

【权限维持技术】编写PowerShell脚本

现在,$car变量就包含了我们自定义的汽车对象。我们可以通过$car.Make,$car.Model和$car.Year来访问这辆汽车的各种属性。
【权限维持技术】编写PowerShell脚本

条件判断

【权限维持技术】编写PowerShell脚本
最常见的是使用if,elseif和else进行条件判断。下面是一个示例:
$number = 10if ($number -gt 5) {    Write-Output "Number is greater than 5"} elseif ($number -eq 5) {    Write-Output "Number is equal to 5"} else {    Write-Output "Number is less than 5"}
这个脚本中,脚本将根据变量$number的值,输出对应的结果。

【权限维持技术】编写PowerShell脚本

【权限维持技术】编写PowerShell脚本

循环

【权限维持技术】编写PowerShell脚本
对于循环,有几个常见的选项,包括for,foreach,while和do-while。
以下是for循环的一个示例:
for ($i = 0; $i -lt 10; $i++) {    Write-Output $i}
foreach循环的一个示例:
$numbers = 1,2,3,4,5foreach ($number in $numbers) {    Write-Output $number}
while循环的一个示例:
$i = 0while ($i -lt 10) {    Write-Output $i    $i++}
do-while循环的一个示例:
$i = 0do {    Write-Output $i    $i++} while ($i -lt 10)
【权限维持技术】编写PowerShell脚本

编写PowerShell脚本

【权限维持技术】编写PowerShell脚本
先验知识已经足够,现在我们想编写一个脚本,目标是搜集主机的CPU、物理内存以及补丁信息,并根据CPU和物理内存信息判断是否为虚拟机、沙箱,最后把信息写入文件。
我们使用Windows自带的PowerShell IDE来编写,左下角搜索"Windows Powershell ISE"并打开:

【权限维持技术】编写PowerShell脚本

使用WMI来查询我们感兴趣的信息(不了解WMI的可以看我之前的文章),再使用条件判断确定是否是虚拟机或沙箱:
# 获取CPU和内存信息$cpu = Get-WmiObject -Class Win32_Processor$physicalMemory = Get-WmiObject -Class Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | % {[Math]::Round(($_.sum / 1GB), 2)}# 判断是否可能是虚拟机if ($cpu.NumberOfLogicalProcessors -eq 1 -or $physicalMemory -lt 2) {    Write-Output "This might be a virtual machine."}# 搜集已安装的补丁$hotfixes = Get-WmiObject -Class WIN32_QuickFixEngineering | Select-Object -Property Description,HotFixID,InstalledOn# 格式化并写入文件$output = @"System Information==================Number of Logical Processors: $($cpu.NumberOfLogicalProcessors)Physical Memory (GB): $physicalMemoryInstalled Hotfixes==================$($hotfixes | Format-Table | Out-String)"@$output | Out-File -FilePath .system_info.txt
然后执行我们的脚本,就能在当前目录下写入系统信息:

【权限维持技术】编写PowerShell脚本

【权限维持技术】编写PowerShell脚本

总结

【权限维持技术】编写PowerShell脚本
本文我们介绍了PowerShell的对象、变量、条件与循环,结合之前的知识,我们已经具备了自己写PowerShell脚本的能力,最后举例编写了一个搜集系统信息的简单脚本。后续文章将讲述在内网渗透中如何利用PowerShell达到我们的目标。

【权限维持技术】编写PowerShell脚本

原文始发于微信公众号(赛博安全狗):【权限维持技术】编写PowerShell脚本

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月10日16:55:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【权限维持技术】编写PowerShell脚本http://cn-sec.com/archives/2226195.html

发表评论

匿名网友 填写信息