PowerShell一直都是网络攻防对抗中的热点技术,而且随着微软对PowerShell的投入越来越大,针对PowerShell的利用也将越来越复杂。而且现在很多安全设备对PowerShell的监控是非常严格,那么我们怎么能绕过这些检测,达到混淆的效果呢。本期美创安全实验室将带大家了解一下有关PowerShell的混淆方法以及背后原理。

PowerShell攻击利用

PowerShell是一种功能强大的脚本语言和Shell程序框架,他的强大功能性和灵活性简直不知道甩了他的“好兄弟”(默认命令提示符)多少条街。PowerShell被设计出来就是为了取代默认命令提示符,便于系统管理员更加方便地管理计算机的。但所谓“水可载舟、亦可覆舟”,任何事物都有两面性,当PowerShell拥有了强大的能力的同时,他也成为了攻击者手中的利器,给企业网络带来巨大威胁。

自微软2005年发布PowerShell以来,在这15年的攻防博弈中,PowerShell其实已经被广泛运用于不同规模的攻击活动,无论是下载器中、内网横向扩展中、权限维持系统后门中,甚至Muddy Water、Fruity Armor等多个APT组织的攻击事件中都被使用,而PowerShell的许多攻击特性在持续的攻防博弈中也慢慢凸显,例如:

1.无文件特性

可以防御查杀工具、躲避防火墙、绕过IDS/IPS,以及许多反病毒软件。因为其没有文件承载,使其根本不需接触磁盘,直接在内存中加载并执行恶意代码。

2.LotL攻击特性

攻击者轻松达到攻击目的的同时躲避常见的攻击检测和入侵防御系统:PowerShell在众多Windows操作系统中是默认安装的,这类系统自带的、受信任的工具,反恶意软件极难检测和限制,使攻击者无需增加额外的二进制文件,有效的躲避了常见的攻击检测和入侵防御系统。

3.易混淆性

PowerShell具备脚本类语言的特点,灵活多变,很容易配合多种混淆方法,对抗传统安全工具的检测。

4.良好的功能及适应性

PowerShell满足多种攻击场景的需求,并且内置了远程管理机制,可用于远程命令执行,同时PowerShell还支持WMI和.NETFramework等,极易使用。

PowerShell的攻击混淆方法

根据PowerShell的语法我们可以很容易确定混淆的对象,主要是以下三类

命令本身

函数与对象

参数

所以我们也将混淆方法按照作用对象分类,分为作用在命令本身上的、作用在函数与对象上的、作用在参数上的、三者都可以的以及一些其他方法。接下来我们依次介绍一些这些方法。

1.基于命令本身的混淆方法

① 别名,缩写,省略

在PowerShell中输入alias命令即可以查看所有命令的缩写。所以当某些敏感命令被过滤的时候我们可以尝试使用命令缩写执行。例如常见的Invoke-Expression命令,我们可以使用IEX代替他。

② 使用Invoke命令

在PowerShell中,我们可以使用invoke命令调用其他命令。在下面的图中,我们使用(‘downloadstring’)

.invoke(’http://127.0.0.1:8899/powershell.txt’)替换原本downloadstrin(‘http://127.0.0.1:8899/power

shell.txt’)。可以看到这两条命令虽然长得不一样,但最终的执行结果是一样的。

③ 使用NewScriptBlock命令

我们可以使用$ExecutionContext.InvokeCommand.

NewScriptBlock(“”)的方式创建脚本块,然后将我们的语句嵌入其中,在一定程度上可以达到混淆效果。

④ 使用invoke-command{xxx}命令

Invoke-command也可以达成执行其他命令的功能,在某种程度上来说invoke-command与invoke-expression还是有一点相似度的。所以我们可以将invoke-expression内嵌进invoke-command中达到混淆的效果。当然对于invoke-command也可以使用缩写icm。

2.基于函数与对象的混淆方法

① 使用括号与引号

我们可以使用括号与引号作用在脚本中的对象函数上,将其转化为字符串执行。可以起到一定的混淆效果。

② 使用通配符*

New-Object可以通过通配符*写成如下形式:

  • &(Get-Command New-Obje*)

  • &(Get-Command N*-O*)

  • &(GCM *w-O*)

  • &(COMMAND *w-*ct)

3.基于参数的混淆方法

① 使用拼接的方法进行混淆

我们在PowerShell中的参数部分可以使用引号将一个完整的参数分割成好几部分,再使用‘+‘进行连接,最后拼接成完整的参数。

② 使用格式化进行混淆

我们可以在PowerShell中的参数部分使用格式化的方法,把一个完整的参数分成几部分,绕过敏感字符检测。

③ 使用动态变量混淆

以构建DownloadString为例,通过遍历函数并模糊匹配的方式找到DownloadString ,用到了PsObject.

Methods和Where-Object。

④ 使用变量传递的方法

我们可以将我们需要使用的变量用四种其他方式传递进PowerShell语句中,这样可以绕过某些安全工具对PowerShell的参数检查,达到混淆的作用。

☞环境变量

☞ 管道

☞粘贴板

☞隐蔽的进程参数

⑤ 使用ASCII进行混淆

我们可以使用[char]XX代替字符,例如[char]97可以代替字符a,这在某些敏感参数被过滤的情况下特别好用。我们将参数用ASCII码的方式做代替,例如下面:

4.基于三者都可以的混淆方法

① 任意大小写

由于PowerShell对大小写不敏感,所以当某些敏感字符被过滤的时候,我们可以使用大小写打乱正常的字符,如下:

② 反引号作用

在PowerShell中,反引号的作用是转义作用,也就是其它语言中的反斜杠“\”的作用。反引号加在某些字符面前会起到转义的作用,可当他加在其他字符前就不会产生任何作用,也不影响字符的意思,从而实现混淆。

而下面这些字符加上了反引号后会影响其本身的意思,在进行混淆的时候需要注意。

`a----警报

`b----退格

`f----换页

`n----换行

`r----回车

`t----水平制表

`v----垂直制表

③ 空格分断

PowerShell允许在脚本或命令行中添加多余的空格,只要这些空格不影响脚本的运行,不影响正常的语法结构都是无关紧要的。所以我们可以在要执行的命令中添加任意多个空格符,达到混淆作用。

④ 反转字符串

在PowerShell中,提供了一个有关反转字符串的命令:$reverseCmd[-1..-($reverseCmd.Length)],我们将想要执行的命令反写,然后使用反转命令进行执行,从而进行混淆。

⑤ 分割/替换/拼接

PowerShell提供了几个针对字符串的函数,如Split、Join、Replace。分别起到分割、拼接、替换的作用。所以我们可以将自己想要执行的命令用字符串的格式书写,然后利用这三个函数,将字符串打乱使其失去本意,最后在执行时复原起到混淆的作用。

⑥ 编码

在PowerShell中,我们可以使用FromBase64String函数,将我们经过base64编码后的命令解码成正常命令执行。

⑦ 加密

PowerShell提供了一种加解密函数SecureString

ToBSTR(),我们可以使用这个函数将我们想要执行的命令加密成密文,然后再执行前进行解密即可起到混淆作用。

以上就是利用PowerShell在攻击利用时如何进行混淆绕过的全部方法了,下一篇将会给大家带来PowerShell的实战攻击利用与防御方法总结的文章,敬请期待。

声明:本文来自第59号,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。