Powershell 和混淆

admin 2024年5月17日19:09:02评论1 views字数 5962阅读19分52秒阅读模式

Powershell 和混淆

什么是 Powershell?

Powershell 是 Microsoft 于 2006 年开发的一种面向对象的自动化语言。该平台采用 .NET 构建,旨在使系统管理员更轻松地管理设备和创建计划任务。2016年,源代码开源发布。那么为什么这个标题为“恶意软件”的博客中有powershell呢?攻击者在攻击活动中攻击相当多的用户,并旨在感染他们最能感染的系统。在这里,他们也使用了预计所有设备上都会出现的技术和语言。事实上,Powershell 默认在 Windows 设备上运行,并且具有相当多的功能,这使其成为攻击者极其常用的工具。另外,由于它是用.NET编写的,所以它可以使用很多API,也有自己的API。这实际上揭示了我们所说的“人才”的概念。例如,借助“DownloadString” API,它能够在设备上运行命令/shellcode/可执行文件,而无需对设备磁盘进行任何写入操作。或者使用“Marshall”类,可以在内存上解密 shellcode,并且可以在不写入磁盘的情况下执行 shellcode。

正如我们上面提到的,攻击选项和技术相当多,但众所周知,powershell是一种开源脚本语言,由于没有编译,因此可以清楚地看到要运行的命令或脚本的所有命令。那么攻击者如何仍然在设备上运行恶意 powershell 命令或脚本呢?

使用的参数

在powershell上执行命令时,攻击者会使用多个参数来检测用户的攻击并避开安全产品。这些参数是;

ExecutionPolicy:出于安全目的而创建的策略。用于确定可以在设备上运行/安装的 powershell 脚本的类型。

1. Restricted, is the ExecutionPolicy value that is loaded by default. No powershell scripts can be run on the device.2. AllSigned, Only scripts signed by trusted publishers can be run.3. RemoteSigned, This is the default policy on Windows Server 2012 R2 devices. Only locally generated script files can be run on the system.4. Unrestricted, Locally created and signed PowerShell scripts can be run. Command prompt is shown for scripts run remotely.5. Bypass, All PowerShell scripts can be run on the device.

攻击者通过假设 ExecutionPolicy 值默认为 Restricted 或 RemoteSigned 来计划攻击,因为用户通常不会更改它。因此,命令行中经常显示“powershell -EPbypass”或“powershell-ExecutionPolicybypass”。Powershell 中给出的这些参数区分大小写,并且可以使用缩写。

EncodedCommand:默认情况下,Powershell 可以解码并运行 Base64 值。使用“powershell -EncodedCommand 'Base64'”命令行,您可以运行在 powershell 中 Base64 编码的命令/脚本,无论行数如何。

NonInteractive:它用于执行非交互式命令/脚本。接收用户输入的 Read-Host 等方法被禁用。

WindowStyle:当脚本运行时,它用于确定 powershell 窗口的状态。它经常被攻击者用作“-WindowStyle hide”。Powershell 窗口不会向用户显示。

NoProfile:它允许运行脚本的用户在不加载 powershell 配置文件的情况下运行命令/脚本。用户希望在设备启动时自动定义的 Powershell 变量、自定义设置、功能或不同配置都包含在此配置文件中。通过禁用此配置文件,攻击者还禁用了 ExecutionPolicy 值。

Sta:代表单线程单元。攻击者使用此参数的原因是:某些 COM(组件对象模型)对象需要单线程单元模型。COM 对象用于访问系统服务或其他软件。攻击者还使用此参数来确保某种命令/脚本在其脚本/命令中使用 COM 对象时能够正常工作。

常见的 powershell 命令行可以如下 => “powershell -NoP -sta -NonI -W Hidden -Enc”或“powershell -epbypass -sTa -nOnI -whidden -enC”等。

以上是一些powershell参数。要访问所有这些“powershell -?”您可以运行该命令。

什么是混淆?

混淆可以解释为使某些事情变得难以理解。通常,脚本语言在用于恶意目的时会受到混淆。请参阅 JavaScript 混淆等。那么,这种“使其难以理解”是如何运作的呢?举个简单的例子;

$value1="Onlyf8"$value2="Oxxxaaanaaaabbbxlxxxaaaabbbbyfaaaaxxxxbb8"$value2.Replace("x","").Replace("a","").Replace("b","")

看上面的例子,当这3个命令运行时,$value1和$value2的值是相同的。混淆是指以不同方式以简单方式编写并在执行时制作原始命令时很容易被理解为有害的命令的编写。

Powershell 上有许多不同且更多的混淆技术。在本文中,我们将展示并分析我们经常遇到的技术。

特殊字符混淆

在 Powershell 上,可以通过在大括号之间使用特殊字符来定义变量。例如,${# ;}=1如。我们通过Daniel Bohannon 编写的powershell 工具Invoke-Obfuscation创建一个使用此技术编码的脚本。现在让我们看看如何扭转这种技术。

${$!-}  =+  $(  )  ;${;/=}  =${$!-};${-}=  ++  ${$!-}  ;${/}  =++${$!-};${(}  =  ++  ${$!-};${#}=  ++${$!-};${.}  =++  ${$!-}  ;${)@}  =  ++  ${$!-}  ;${!}  =++${$!-}  ;${;~+}=  ++  ${$!-};${@}=++${$!-}  ;${[$ }  ="["+  "$(  @{}  )"[  ${!}]  +"$(@{})"["${-}"+"${@}"]+"$(@{  })  "["${/}"  +"${;/=}"  ]+"$?"[${-}  ]+"]";${$!-}="".("$(@{}  )  "[  "${-}${#}"]  +  "$(  @{  }  )  "["${-}${)@}"]+  "$(  @{})"[${;/=}]+  "$(  @{}  )"[  ${#}]  +  "$?"[  ${-}  ]  +"$(@{  })  "[${(}]);${$!-}=  "$(@{})"["${-}${#}"  ]+  "$(  @{})"[  ${#}]  +  "${$!-}"[  "${/}${!}"]  ;.${$!-}(  "${[$ }${-}${;/=}${@}+  ${[$ }${-}${;/=}${!}  +${[$ }${-}${;/=}${;/=}  +${[$ }${-}${;/=}${.}  +${[$ }${-}${-}${#}+${[$ }${(}${/}  +  ${[$ }${-}${-}${-}+${[$ }${-}${-}${;/=}  +  ${[$ }${-}${;/=}${;~+}+${[$ }${-}${/}${-}+${[$ }${-}${;/=}${/}+  ${[$ }${.}${)@}|  ${$!-}  "  )

上面是一个使用特殊字符技术进行混淆的 powershell 脚本。现在让我们一步一步地扭转它。

首先,这不是 powershell 中的一行,因为我们可以看到它是用来分隔;的。字符之间逐行。在这些字符之后,我们跳过该行并使脚本可以逐行运行。

Powershell 和混淆

现在它的可读性更强了(:D)。那么这些线有什么作用呢?让我们使用 Powershell ISE 逐行运行它。

Powershell 和混淆

当我们一步步运行它时,我们注意到;在第 1 行中,为创建的第一个变量分配了值“0”,然后为另一个不同的变量分配了该值。当我们来到第3行时,您可以看到值++0被分配给创建的变量。该行中定义为0 的变量加1并分配给新创建的变量。这样,0-9之间的所有数字都存储在一个变量中。那么这些数字会做什么呢?

Powershell 和混淆

数字定义完成后,我们来到第 12 行。使用各种本机 powershell 变量为该行中的变量分配字符串“[Char]” 。那么这个“[Char]字符串会做什么呢?

Powershell 和混淆

在下一行中,可以看到插入方法是通过使用System.Collections.Hashtable变量的索引创建的,该变量也是本机变量之一(上图中红色框内的变量)。从字符串“$?”中仅获取字母r即True。

Powershell 和混淆

然后可以看到,“ie”字符串是通过对System.Collections.Hashtable字符串使用索引来获得的,而“iex”方法是通过对上一行创建的变量取字母“x”来获得的。最后一行显示混淆的脚本将使用“iex”后跟“[Char]”运行。要在不运行此命令的情况下获取它,我们可以执行以下操作;现在我们知道了IEX变量,那么如果我们输入“echo”而不是这个变量,它将打印屏幕而不是执行命令。但是这个脚本中有两个iex 。第一个位于第 15 行的开头,第二个位于末尾。写入前导iex以创建字符串,写入最后一个 iex 以执行命令。我们可以编写“echo”并获取命令,而不是在末尾带有iex字符串的变量。

Powershell 和混淆

使用特殊字符混淆反转脚本的另一种方法是:例如,变量“${;#'}”被分配数字0。使用各种文本编辑器工具,您可以将该变量的值在出现的任何地方更改为0,并将所有行中其他变量的数值更改为0,并使最后一行中替换“[Char][x]” x的数字可读并获取整个字符串。

字符串连接混淆

在 Powershell 中,$a="A"+"B"可以组合两个或多个字符串以将它们分配给变量或作为方法的参数。另一种字符串分片方法是列表方法。$a=("{0}{1}")-f'A','B; -f键之后的每个字符串元素都从 0 开始索引,然后根据-f键之前的字符串中大括号之间的索引号在字符串中进行替换。上面的两个 powershell 命令还将变量$a的值设置为AB。那么如果这两种技术一起使用会发生什么呢?

Powershell 和混淆

你会得到一个甜蜜的 powershell 脚本:)大量的随机变量名称、字符串合并、列表格式的字符串修改、Base64、Gunzip 等。这真是一团糟。我们应该从哪里开始?首先,我们使变量名称可读。然后我们删除'+'整个脚本中的字符。

Powershell 和混淆

现在有些字符串稍微可读/可预测。现在让我们关注第二行;

$value1_=[Ref].Assembly.GetType((('{4}{0}{9}tem.{3}ana{6}ement.{8}{2}t{7}mati{7}n.{8}m{9}i{5}ti{1}{9}')-f'y','l','u','M','S','U','g','o','A','s'));

-f开关后有 10 个值,当第一个值的索引以 0 的方式写入时,我们看到以下字符串;

$value1_=[Ref].Assembly.GetType(('System.Management.Automation.AmsiUtils'))

这就是-f结构的解析方式。现在让我们以相同的方式使所有行都可读。

Powershell 和混淆

我们已经解决了所有的字符串,现在让我们来理解它们。我们注意到,行中提到的许多概念都是关于禁用 powershell 中的安全机制的。这些; AMSI(反恶意软件扫描接口)、ScriptBlockLogging(记录正在运行的powershell脚本的安全机制)等。第一行的版本控制被认为是为了检查这些安全机制是否存在。AMSI机制是PowerShell 4.0中添加的功能,ScriptBlockLogging是PowerShell 5.0中添加的功能。如果这些命令将在版本 3 及更低版本的 powershell 上运行,则当我们尝试对这些机制进行操作时,我们将收到错误,因为尚不存在这些机制。正因为如此,攻击者被认为已经实施了这种控制。

在最后一行,执行与号 (&) 和以下命令。那么这个命令是什么?与+字符合并后,我们遇到一个使用 Base64Decode 解压缩的字符串,然后使用格式列表进行 Gunzip 解压缩。换句话说,就是想要执行的命令;用Gunzip压缩,用Base64编码,与格式列表兼容,用+字符分段并最终确定。如果我们反向执行此顺序,我们就可以得到原始字符串。

Powershell 和混淆

我们进入下一步,首先在 CyberChef 上执行FromBase64的原始字符串,然后执行Gunzip Decompress。我们又遇到了一个powershell脚本。当我们查看这个 powershell 脚本时,我们可以了解到它使用 .NET 方法运行 shellcode。据了解,在内存块中用VirtualAlloc分配一块地方,然后用 Base64 编码这个新创建的部分,然后用Copy移动解码后的 shellcode ,然后用CreateThread运行它。

Powershell 和混淆

在下一阶段,我们将获取 shellcode,看看能得到什么。首先,我们使用 CyberChef 解码此处的 Base64 值,并使用下载功能下载它。

Powershell 和混淆

我们将使用BlobRunner调试此 shellcode 。这里有两种方法;我们可以使用BlobRunner.exe [ShellCode File]行从命令行运行 BlobRunner ,然后通过调试器附加到此进程(BlobRunner 在运行 ShellCode 之前自行停止并等待您按下按键)并通过切换断点继续程序BlobRunner 加载 ShellCode 的地址,或者我们可以直接从调试器运行 BlobRunner 并更改命令行并执行相同的操作。

Powershell 和混淆

当我们运行它时,我们会看到动态解析的 API。在这里,我们检测到jmp rax行中解析的 API被调用,并且我们在此行切换断点并跟踪通过RAX寄存器调用的 API 。

Powershell 和混淆

首先,使用LoadLibrary API加载ws2_32库,我们了解到它将执行套接字操作。然后我们看到它使用WSAStartup API 创建了一个套接字。

Powershell 和混淆

它使用绑定API激活创建的套接字。当我们查看参数时,发现4444端口正在监听。

Powershell 和混淆

因此,我们确定第一步反混淆的powershell脚本是bind shell类型的恶意软件。

如需批评/纠正/建议,请通过我的联系地址与我联系。您的评论对我很有价值:)

原文来自:https://onlyf8.com//powershell-obfuscationEN

原文始发于微信公众号(Ots安全):Powershell 和混淆

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月17日19:09:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Powershell 和混淆http://cn-sec.com/archives/2746638.html

发表评论

匿名网友 填写信息