首页 > 系统相关 >【待做】脚本命令类恶意代码——PowerShell混淆脚本分析方法

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

时间:2024-09-10 21:16:31浏览次数:12  
标签:脚本 混淆 恶意代码 命令 使用 字符串 World PowerShell

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

相关文章

  • 【Azure Service Bus】创建 ServiceBus 的Terraform脚本报错GetAuthorizationRule: In
    问题描述在使用Terraform部署ServiceBus时候,遇见了如下报错:Error:ErrormakingReadrequestonAzureServiceBusTopicAuthorizationRule:servicebus.TopicsClient#GetAuthorizationRule:Invalidinput:autorest/validation:validationfailed:parameter=authorization......
  • 【Azure Service Bus】创建 ServiceBus 的Terraform脚本报错GetAuthorizationRule: In
    问题描述在使用Terraform部署ServiceBus时候,遇见了如下报错:Error:ErrormakingReadrequestonAzureServiceBusTopicAuthorizationRule:servicebus.TopicsClient#GetAuthorizationRule:Invalidinput:autorest/validation:validationfailed:parameter=authorizat......
  • 【Harmony】文本高亮显示、关键字凸显字体大小、颜色、背景色等风格自定义、嵌入html
    预览效果如图(网上找到demo,如有疑问请留评论蛤!):这个是超链接例子的数据结构如下:newCustomMessage($r('app.media.styled_text_user_image1'),'央视新闻','2小时前',[newCustomSpan(CustomSpanType.Normal,'【准备回家!'),newCustomSpan(CustomSpanType.Hasht......
  • 在 PowerShell 中,执行 ISO 文件中的 setup 程序并进行静默安装通常涉及以下步骤:
    在PowerShell中,执行ISO文件中的setup程序并进行静默安装通常涉及以下步骤:挂载ISO文件:首先,您需要将ISO文件挂载到虚拟光驱中。这可以使用PowerShell实现。执行静默安装:挂载ISO文件后,您可以运行setup.exe并使用适当的静默安装参数来进行安装。下面是一个P......
  • Shell脚本基础、组成结构、调试、运算符
    思维导图:一、脚本基础1、shell编程介绍与特性        Shell是种命令解释程序,也可以看作是一种命令语言的解释器。用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行。Shell所使用的这种命令语言称为Shell语言。Shell语......
  • jmeter通过beanshell中脚本实现随机获取某天(“yyyy-MM-dd HH:mm:ss“)前1周,一个月,一
    在接口测试中,请求参数中涉及时间的参数可能不是固定死的,因此jmeter想通过beanshell中脚本实现随机获取某天(statusTimeEnd(“yyyy-MM-ddHH:mm:ss”))前1周,一个月,一个季度,半年的时间0点,其中statusTimeEnd的值在用户参数中已配置。参考JMeter性能测试实战的方法:http://lit......
  • 搭建单机版DolphinScheduler,并编写启动关闭脚本
    一.为什么要搭建单机版DolphinScheduler支持多种部署模式,包括单机模式(Standalone)、伪集群模式(Pseudo-Cluster)、集群模式(Cluster)等。在其他模式下配置完成后启动会非常的吃内存,对电脑非常的不友好。而单机模式就不会有这种情况,在我的虚拟机里启动单机模式后大概也就占了1G左右......
  • 【Shell-多并发】使用Shell脚本在循环中进行多并发的操作
    【Shell-多并发】使用Shell脚本在循环中进行多并发的操作1)方式一(利用for循环)1.1.案例一(缺少wait导致执行顺序有误)1.2.案例二(缺少控制阻塞导致任务全部执行)1.3.案例三(最终版)2)方式二(利用命名管道来做任务队列)3)Shell脚本中$的含义1)方式一(利用for循环)1.1.案例一(缺少wait......
  • js中eval执行的脚本参数不固定,并且脚本中有return时,如何处理
    最近就遇到了用eval执行动态脚本时,拿不到return中的值的问题,如下界面:点击测试函数,进行计算,计算时遇到两点问题:1.传入的参数是动态的,如何解决变量声明问题?2.eval进行执行脚本时,拿不到return的值?现在将代码贴下,查看解决方案:functionemrscript():any{letobj={}......
  • 安装mayavi命令,使用cxfreeze打包python脚本
    pipinstallnumpy出现Anewreleaseofpipisavailable:23.2.1->24.2输入:python-mpipinstall--upgradepipsetuptoolswheelpipinstallPyQt5pipinstallvtkpipinstallmayavipipinstallscipypipinstallconfigobj 查看当前项目的依赖包:pipfr......