Powershell基础之脚本执⾏
Bat
这就是我们常⽤的Bat脚本,全名为批处理⽂件,脚本中就是我们在CMD中使⽤到的命令,这⾥提⼀个⼩问题:CMD的命令⾏执⾏命令的优先级是.bat > .exe,那么假如我放⼀个cmd.bat在system32⽬录下,那么优先执⾏的是cmd.bat,这⾥⾯的内容就变得不可描述起来了
VBscript
执⾏vbs就是常说的vbscript,是微软为了⽅便⾃动化管理windows⽽推出的脚本语⾔,这⾥了解⼀下即可,不是⽂章重点。
⼀个⼩例⼦通过vbs操作WMI
Set wmi = GetObject("winmgmts:")
Set collection = wmi.ExecQuery("select * from Win32_Process")shell最简单脚本
For Each process in collection
WScript.ObjectText_
Next
Powershell
这就是我们的主⾓,在现在和未来⼀定是powershell占据主要地位(对于这⼀点搞Win多⼀点的朋友⼀定不会怀疑),⾸先我们来看⼀个简单的例⼦
script.ps1:
# 脚本内容
function test-conn { Test-Connection  -Count 2 -ComputerName $args}
# 载⼊脚本⽂件
.script.ps1
# 调⽤函数
test-conn localhost
Powershell执⾏策略
那么你可能会在调⽤脚本的时候出现报错,这是powershell的安全执⾏策略,下⾯我们来了解⼀下执⾏策略:PowerShell 提供了Restricted、AllSigned、RemoteSigned、Unrestricted、Bypass、Undefined 六种类型的执⾏策略简单介绍各种策略如下:
那么我们如何绕过这些安全策略呢?下⾯提供⼏种⽅法,⽹上还有很多的绕过⽅法,⼤家可以⾃⾏研究:
powershell的脚本调⽤⽅法:
如果脚本是直接写的代码⽽不是只定义了函数那么直接执⾏脚本.script.ps1即可powershell的脚本调⽤⽅法:
但是如果是载⼊⾥⾯的函数需要.+空格+.script.ps1
或者使⽤Import-Module .script.ps1, 这样才能直接使⽤脚本的函数
通过控制台执⾏Powershell
对于我们安全测试⼈员通常获取到的⼀个Shell是CMD的, 那么我们想要尽可能少的操作就可以直接通
过控制台来执⾏powershell的命令, 那么先来看⼀个简单的例⼦
可以看到我们通过CMD界⾯执⾏了Powershell的代码, 那么其实这样的执⾏⽅式在真实的安全测试环境中利⽤更多, 下⾯是⼀个Powershell 通过这种⽅式执⾏的所有可选的参数:
PowerShell[.exe]
[-PSConsoleFile <file> | -Version <version>]
[-EncodedCommand <Base64EncodedCommand>]
[-ExecutionPolicy <ExecutionPolicy>]
[-File <filePath> <args>]
[-InputFormat {Text | XML}]
[-NoExit]
[-NoLogo]
[-NonInteractive]
[-NoProfile]
[-OutputFormat {Text | XML}]
[-Sta]
[-WindowStyle <style>]
[-Command { - | <script-block> [-args <arg-array>]
| <string> [<CommandParameters>] } ]
PowerShell[.exe] -Help | -? | /?
名称解释
-Command需要执⾏的代码
-ExecutionPolicy设置默认的执⾏策略,⼀般使⽤Bypass
-
EncodedCommand
执⾏Base64代码
-File这是需要执⾏的脚本名
-NoExit 执⾏完成命令之后不会⽴即退出,⽐如我们执⾏powerhsell whoami 执⾏完成之后会推出我们的PS会话,如果我们加上这个参数,运⾏完之后还是会继续停留在PS的界⾯
-NoLogo不输出PS的Banner信息
-Noninteractive不开启交互式的会话
-NoProfile不使⽤当前⽤户使⽤的配置⽂件
-Sta以单线程模式启动ps
-Version设置⽤什么版本去执⾏代码
-WindowStyle
设置Powershell的执⾏窗⼝,有下⾯的参数Normal, Minimized, Maximized, or Hidden
最后举⼀个执⾏Base64代码的例⼦:
我们先试⽤上⾯⼀个表格提到的编码代码编码命令whoami, 得到字符串:dwBoAG8AYQBtAGkACgA=
通过下⾯的命令来执⾏代码
powershell -EncodedCommand dwBoAG8AYQBtAGkACgA=
那么这种需求在什么地⽅呢? ⽐如我们的代码特别长或者会引起⼀起歧义的时候就需要我们使⽤这种⽅式去执⾏, 同时也是⼀个混淆的⽅式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。