脚本病毒分析扫描专题2-Powershell代码阅读扫盲

4.2、PowerShell

为了保障木马样本的体积很小利于传播。攻击者会借助宏->WMI->Powershell的方式下载可执行文件恶意代码。最近也经常会遇见利用Powershell通过Windows自带的组件执行系统命令绕过UAC下载文件手法的文章。

  • UAC:用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。

  • PowerShell:Windows PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的对象,在病毒样本传播与渗透测试场景中用于下载第二阶段的病毒文件和执行文件。

4.2.1 Powershell代码阅读扫盲

(1) 环境介绍
  • 开发工具

开发工具可以使用自带的Windows PowerShell ISE。

PowerShell的运行后缀为.ps1,也可以通过交互式运行。

脚本病毒分析扫描专题2-Powershell代码阅读扫盲

:Windows下PowerShell默认的权限级别是Restricted,如果在Restricted权限运行PowerShell会提示错误信息:

  • 代码调试

自带的编译器常用快捷键:F9下断点、F5执行、F10单步执行


PS C:\WINDOWS\system32> xx.ps1
有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
+ CategoryInfo : SecurityError: (:) [],ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess

解决方案

将执行权限修改为RemoteSigned或者Unrestricted:


Set-ExecutionPolicy RemoteSigned
(2) Powershell启动命令参数
  • EncodedCommand

使用此参数向PowerShell传递base64编码字符串并运行。

变种使用方法:

方式1:"-enc"
方法2:"-Enc"
方法3:"-EncodedCommand"
方法4:"-encodedcommand"
方法5:"-encodedCommand"
方法6:"-ec"
方法7:"-en"
方法8:"-ENC"
  • WindowStyle Hidden

使用此参数避免PowerShell执行时显示运行窗口。其中“-window hidden”方法使用最多主要与前文提到的Cerber勒索软件有关。

变种使用方法:

方式1 :"-window hidden"
方法2 :"-W Hidden"
方法3 :"-w hidden"
方法4 :"-windowstyle hidden"
方法5 :"-win hidden"
方法6 :"-WindowStyle Hidden"
方法7 :"-win Hidden"
方法8 :"-wind hidden"
方法9 :"-WindowStyle hidden"
方法10:"-WindowStyle hiddeN"
方法11:"-windows hidden"
方法12:"-WindowStyle hiddeN"
方法13:"-windows hidden"
方法14:"-Win Hidden"
方法15:"-win hid"
方法16:"-Windows hidden"
方法17:"-Wind Hidden"
方法18:"-Win hidden"
  • NonInteractive

使用此参数避免显示一个交互对话窗口。此方法与WindowStyle隐藏方法配合使用以隐藏执行痕迹。

其中使用“-noni”的变种中76%是通用型的shellcode注入代码或SET工具,而使用“-NonI”的变种主要是PowerShell Empire工具。

变种使用方法:

方式1 :"-noni"
方法2 :"-Nonl"
方法3 :"-noninteractive"
方法4 :"-Nonlnteractive"
方法5 :"-nonl"
  • NoProfile

使用此参数阻止PowerShell在开机时加载配置文件脚本,以避免载入非预期的命令或设置。与非交互方式类似,“-nop”方法主要由SET和通用型shellcode注入变种采用,而“-NoP”方法主要由PowerShell Empire使用。

变种使用方法:

方式1 :"-nop"
方法2 :"-NoP"
方法3 :"-noprofile"
方法4 :"-NoProfile"
方法5 :"-noP"
  • ExecutionPolicy ByPass

使用此参数绕过默认的PowerShell脚本执行策略(即受限策略),可以执行任何代码。有趣的是,使用EncodedCommand参数执行的代码不受执行策略影响。

变种使用方法:

方式1:	"-ep bypass"
方式2: "-exec bypass"
方式3: "-executionpolicy bypass"
方式4: "-Exec Bypass"
方式5: "-ExecutionPolicy ByPass"
方式6: "-Exec ByPass"
方式7: "-ExecutionPolicy Bypass"
方式8: "-ExecuTionPolicy ByPasS"
方式9: "-exe byPass"
方式10: "-ep Bypass"
方式11: "-ExecutionPolicy BypasS"
方式12: "-Exe ByPass"
  • Sta

使用单线程模式(现在是PowerShell 3.0的默认模式)。此参数基本上是PowerShell Empire在使用。

变种使用方法:

方法1:"-sta"
  • NoExit

使用此参数阻止PowerShell在运行启动命令后退出。这是PowerWorm恶意软件除EncodedCommand参数外使用的唯一参数。

变种使用方法:

方法1:"-noexit"
  • ExecutionPolicy Hidden

这实际上不是一个有效的参数,因此PowerShell会忽略该参数。使用该参数的每个样本我都标记为与“TXT C2”脚本有关,该脚本试图加载一个包含另一段PowerShell脚本的DNS TXT记录,与PowerWorm类似。可能攻击者本来想使用的是ByPass参数,因为他们的后续命令中使用了“-w hidden”参数。

变种使用方法:

方法1:"-ep hidden"
  • NoLogo

避免PowerShell启动时显示版权信息。

变种使用方法:

方式1:	"-Nol"
方式2: "-NoL"
方式3: "-nologo"
方式4: "-nol"
  • ExecutionPolicy Unrestricted

与ByPass类似,但会在运行从Internet下载的未签名脚本前警告用户。使用此参数的脚本在试图执行从Internet下载的脚本时会触发警告信息。

变种使用方法:

方式1:	"-ExecutionPolicy Unrestricted"
  • Command

利用该参数可以执行参数后面的命令,就如同直接在PowerShell提示符下输入命令一样。我只捕捉到一个样本,它直接附加到某个恶意软件中,该恶意软件在FireEye发布的一篇关于绕过基于签名的检测方法的博文中提到过。该PowerShell脚本包含在一个DOCM文件的“Comments“域中,通过Word文档的宏加载执行。以下是该样本的恶意PowerShell代码片段,通过将多条命令组合在一起,可以实现FTP传输和NetCat建连目的。

变种使用方法:

方式1:	"-c"

常见组合示例代码:

方式1:	"-window hidden -enc"
方式2: "-enc"
方式3: "-nop -noni -enc"
方式4: "-NoP -sta -Nonl -W Hidden -Enc"
方式5: "-EncodedCommand"
方式6: "-ep bypass -noni -W Hidden -Enc"
方式7: "-Nop -Nonl -W Hidden -Enc"
方式8: "-nop -win hidden -noni -enc"
方式9: "-executionpolicy bypass -windowstyle hidden -enc"
方式10: "-nop -exec bypass -win Hidden -noni -enc"

测试下载本地计算器示例代码:

1)下载文件:在捕获到的样本中最常用的办法就是使用.net框架下的System.Net.WevClient类的DownloadFile()方法来下载文件。

2)运行文件:运行计算机上的可执行文件或文档,例如.exe或.txt文件。

示例代码:01-PowerShell基本语句.ps1

# 1、下载文件

pOWErsHell.ExE -exEcUTIonPOLICy BYpAsS -nOprOFile -winDOWStyLE HiDden (NEW-objeCt SYSTeM.Net.weBCLIEnT).DOWNloaDfIlE('file://C:\Windows\System32\calc.exe','D:\powershell_calc.EXE');

# 1.1 拆分代码

$client = new-object System.Net.WebClient
$client.DownloadFile(‘file://C:\Windows\System32\calc.exe’, ‘D:\powershell_calc.EXE’) # 2、运行文件 sTArt-PrOCeSS 'D:\powershell_calc.EXE'
(3) 交互式SHELL

与Office Macor的不同,Powershell有许多内置的交互式Shell命令。

    • 01 获取帮助命令
Get-Help
    • 02 查找实现指定任务的命令
Get-Command 

Get-command pwd  # 查看pwd对应的Powershell命令

Get-command ls   # 查看ls对应的Powershell命令  

Get-command cd   # 查看cd对应的Powershell命令
    • 03 将管道输出的结果保存到文件中

通过Out-File命令或者重定向>>操作符将输出结果保存到文件中。


Get-Command | Out-File D:\unicodefile.txt
    • 04 获取进程信息

Get-Process
    • 05 环境变量

dir ENV: # 查看所有环境变量
$ENV:COMPUTERNAME # 查看计算机名
    • 06 获取历史命令

Get-History
  • 07 向文件的结尾处加入信息

Get-Process >> D:\files.txt Get-Process | Out-File -Append D:\files.txt "Hello zzzhhh" >> D:\files.txt
(4) 变量

初始化变量的方式,是在变量后加入$+变量名,其次是除了花括号字符{}和冒号(

上一篇:Python 通过sgmllib模块解析HTML


下一篇:开发客户端软件时,出现System.Windows.Markup.XamlParseException错误