https://mp.weixin.qq.com/s/QdX7Tnc1OyyNDSF9cnhgbQ
原创 Iam0x17 十七的安全日志
前言
由于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字符串作为输出,分别使用三种方式执行字符串中的命令。
$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脚本进行调试。
这两个工具都提供了强大的调试功能,能够逐行执行脚本并查看变量、输出和错误信息等。
3.1 vscode
1.打开vscode,安装powershell扩展,选微软官方的即可。
2.在编辑器中打开脚本文件,设置断点。
3.F5开始调试,单步运行,在左边栏的变量和监视中查看变量和输出。
3.2 PowerShell ISE
打开PowerShell ISE,选择要调试的脚本文件,F9设置断点,F5调试运行
标签:脚本,混淆,恶意代码,命令,使用,字符串,World,PowerShell From: https://www.cnblogs.com/o-O-oO/p/18406924