脚本命令类恶意代码——PowerShell混淆脚本分析方法

由于PowerShell具有强大的系统管理和自动化能力,它可以被用于执行恶意代码、进行横向移动、执行无文件攻击等恶意行为。其中,Office宏病毒是一种常见的恶意软件形式,它利用Office文档中的宏代码来调用PowerShell并执行恶意行为。这种攻击方式通常会利用社会工程学手段来诱使用户启用宏代码,从而触发PowerShell的执行。此外,还有一种被称为"无文件攻击"的攻击技术,通过利用PowerShell的内存执行功能,无需在受感染系统上写入可执行文件,从而执行恶意行为而不留下明显的痕迹。

正是因为PowerShell具有强大而且灵活的功能,攻击者可以利用其复杂性来进行更多样化的混淆。为了保证兼容性和易用性,PowerShell支持绝大部分CMD命令和功能,因此,接下来的总结的混淆手法如果CMD和PowerShell通用的就不再过多介绍。

语法使用

常用参数

隐藏窗口

-WindowStyle Hidden

-w Hidden

-w 1

处理Base64字符串

-EncodedCommand

-ENCOD

-enc

-e

字符操作

和CMD命令混淆类似,PowerShell命令也可以使用大小写、双引号、圆括号、转义字符进行混淆,其中,转义字符的使用需要有所注意。

转义字符

恶意命令中常见的混淆技术之一是利用转义字符插入进行欺骗。在PowerShell中,反引号`是用作转义字符,它可以转义一些特殊字符。此外,反引号有时还可以对一些字母进行转义,以改变其普通解释。以下是对字母的转义。

对于PowerShell混淆,可以在命令中插入反引号,但插入的位置需要注意,如果存在可以被转义的字母,就会出现如下情况。

字符串操作

字符串拼接

在PowerShell中,可以使用单引号 (') 进行字符串拼接。单引号字符串在 PowerShell 中被视为原始字符串,不进行变量替换或转义字符处理。

使用单引号拼接new-object的混淆命令片段

$Y7jmxz8=&('new-'+'obje'+'ct')NET.webcLIEnt; 

字符串格式化

在PowerShell中可以使用字符串格式化(-F)功能来构建字符串。

  • 字符串格式化表达式中的大括号 {} 在这里充当占位符,用于指定要插入的值的位置。
  • 表达式中的数字 {0}, {1}, {2}...是占位符的索引,从零开始。
  • -F 是 PowerShell 中用于执行字符串格式化的操作符。

根据给定的占位符索引和对应的值,字符串格式化表达式会将值插入到相应的位置上,从而构建最终的字符串。

使用字符串格式化构建字符串System.IO.Directory的混淆命令片段

$7CRqx=[TyPe]("{3}{1}{2}{0}{4}"-F'IreCTo','ystEM.','iO.D','S','ry');

字符串分割

在PowerShell中,Split是一个字符串方法,可用于按照指定的分隔符将字符串拆分为子字符串。

以*为分隔符分割网址的混淆命令片段

$Mv5ki8y=(('h'+'ttp'+':/')+'/'+('fort'+'c')+('oll'+'in')+('sa'+'thl')+('e'+'tef')+'ac'+'t'+'o'+'ry'+'.c'+'om'+('/wp-a'+'dm'+'in'+'/i/')+('*h'+'tt')+'p:'+'/'+'/'+'g'+'et'+'m'+('i'+'ng.c')+'om'+'/'+'fo'+'ru'+'m/'+('p'+'/*h')+'t'+('tp://'+'g')+'af'+'f'+('a-'+'mu')+('s'+'ic.')+('co'+'m/c')+('gi-'+'bi')+'n'+'/'+('UM'+'/')+('*htt'+'p')+':/'+'/f'+('ran'+'k'+'fur')+'te'+('lf'+'a')+('r'+'ol'+'i'+'llo'+'.com/las')+('e'+'u/c7'+'/')+'*'+('htt'+'p'+'://evilnerd')+'.o'+'rg'+('/cgi-'+'b')+('in'+'/nU')+('i'+'/*h')+'t'+'t'+('p'+':/')+('/ga'+'p')+'e'+'sm'+('m.or'+'g/o')+('l'+'d/'+'M/*ht')+'tp'+':/'+('/'+'gr')+('m'+'l'+'.net')+('/w'+'p')+('/C'+'/'))."sPL`It"([char]42);

字符串替换

在PowerShell中,可以使用Replace方法来替换字符串中的特定文本。

将字符串中的"G6T"替换为"\"的混淆命令片段

$HOME+((('G6'+'T'+'F2s')+('2k'+'3m')+('G6T'+'Jw')+'w9'+'w_'+'bG'+'6T')-rEPlace([ChaR]71+[ChaR]54+[ChaR]84),[ChaR]92)

DotNet类使用

PowerShell是基于.NET Framework构建的,它提供了访问和使用.NET Framework中各种功能和类的能力。在开发复杂功能时,PowerShell可以使用.NET Framework中的类来实现更高级的操作。由于PowerShell的语法过为灵活,混淆脚本中会出现各种使用类的方式。

一般情况下,调用一个类中的方法时,可以使用New-Object命令实例化对象,通过对象名点号来访问该类中的方法。

$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://example.com/test.test", "test.txt")

为了对命令进行混淆,为了更隐蔽的调用方法,混淆代码中会使用SET-ITEM去实例化对象。

SET-ITEM('wc')([Type]("System.Net.WebClient"));
SET-ITEM('wc') = "System.Net.WebClient";

对于静态类,除了使用SET-ITEM外,还可以直接使用[Type]操作符获取静态类的类型

$directory = [TYPE]"System.IO.Directory"
$directory::CreateDirectory("C:\NewFolder")

动态执行代码

在PowerShell中,有三种方式可以动态执行代码,分别是Invoke-Expression(简写为IEX)、&(调用操作符)、.(点操作符)。

这里以动态执行Get-Process为例,将Get-Process字符串作为输出,分别使用三种方式执行字符串中的命令。

Invoke-Expression

$code = "Get-Process"
Invoke-Expression $code

点操作符

$code = "Get-Process"
.($code)

调用运算符

$code = "Get-Process"
& $code

数据输出

对于含有动态执行代码命令的语句,可以使用输出命令对部分混淆命令快速解密。

打印输出

在PowerShell中,可以使用Write-Host、Write-Output等命令来打印输出。

Write-Host:将输出直接打印到控制台,不会被重定向或捕获。

Write-Host "Hello, World!"

Write-Output:将输出发送到输出流,可以通过管道传递给其他命令进行处理。

Write-Output "Hello, World!"

文件写入

在PowerShell中,可以使用Set-Content、Add-Content和Out-File命令来进行文件写入操作。

Set-Content:将文本内容覆盖写入文件。可以使用-Path参数指定要写入的文件路径,使用-Value参数指定要写入的文本内容。

Set-Content -Path "file.txt" -Value "Hello, World!"

#参数可以省略
Set-Content "file.txt" "Hello, World!"

Add-Content:将文本内容追加写入文件,而不覆盖原有内容。可以使用-Path参数指定要写入的文件路径,使用-Value参数指定要写入的文本内容。

Add-Content -Path "file.txt" -Value "Hello, World!"

#参数可以省略
Add-Content "file.txt" "Hello, World!"

Out-File:通常用于将输出重定向到文件,并提供更多的选项来控制写入行为。

# 将输出写入文件
"Hello, World!" | Out-File -FilePath "file.txt"

# 指定编码方式
"Hello, World!" | Out-File -FilePath "file.txt" -Encoding UTF8

# 追加内容到文件
"Hello, World!" | Out-File -FilePath "file.txt" -Append

动态调试

可以使用vscode和PowerShell ISE对PowerShell脚本进行调试。这两个工具都提供了强大的调试功能,能够逐行执行脚本并查看变量、输出和错误信息等。

vscode

1.打开vscode,安装powershell扩展,选微软官方的即可。

2.在编辑器中打开脚本文件,设置断点。

3.F5开始调试,单步运行,在左边栏的变量和监视中查看变量和输出。

PowerShell ISE

打开PowerShell ISE,选择要调试的脚本文件,F9设置断点,F5调试运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值