从一个恶意活动中学习 PowerShell 解码

2022-11-23 18:58:26 浏览数 (2)

文章目录[隐藏]

  • 1 第一层 – Episode 1
  • 2 第二层 – Attack of Compression
  • 3 第三层 – The Last Beacon

IT 管理人员和安全专家经常会遇到一些看起来比较可疑的 PowerShell 命令,他们有时能够解开这些可疑的命令,但常常还得靠研究人员。本篇文章旨在让大家能够从下列项中来了解可疑命令的目的:

  • Scheduled Tasks (预定任务);
  • RUN Keys in the Registry (注册表中的 RUN 键值);
  • Static PowerShell Scripts (PowerShell 静态脚本);
  • Proxy Logs (Web 服务被 RCE 利用下的代理日志);
代码语言:javascript复制
powershell.exe -EncodedCommand JABzAHIAdgBzAHkAcw..

以下为 Autoruns 导出的数据,数据来源于 Sophos 的检测。在检查日志后,可以发现以随机字符命名的服务名称出现,如下图中所示,圈起来的部分,它的属性看起来非常有趣:

提示:Autoruns 保存的数据文件为 arn 格式

按照常理来说,Windows Server 上会有这样的服务吗?正如预期所那样,这可能是恶意的。这个方法称之为 Living-Off-The-Land (LOLBins),即在没有文件落地 (硬盘) 前就执行恶意代码,主要是为了避免触发任何警告。AV 是基于静态的检测发展过来的,它也完全无法能摆脱这种技术,但是可以通过采取保护措施来保护终端用户机器。

此时,需要对上图中长字符串进行 base64 解码。

以下为一张 base64 代码快速预览表,我把它们都放在了一起:

base64 代码

解码

描述

JAB

$.

变量声明 (UTF-16)

TVq

MZ

MZ 头部

SUVY

IEX

PowerShell Invoke 表达式

SQBFAF

I.E.

PowerShell Invoke 表达式 (UTF-16)

SQBuAH

I.n.

PowerShell Invoke 字符串 (UTF-16),比如 Invoke-MimiKatz

PAA

<.

Emotet 经常使用 (UTF-16)

aWV4

iex

PowerShell Invoke 表达式

aQBlA

i.e.

PowerShell Invoke 表达式 (UTF-16)

dmFy

var

变量声明

dgBhA

v.a.

变更声明 (UTF-16)

H4sIA

gzip 标志 (0x1f8b)

字符串 JABz[..]IAagBwA= cin 最基本的形式是 onion,它具有多个层次,可以巧妙地隐藏真正执行的操作,从而逃避检测,但是与 onion 不同,它只有三层,下面让我们来剥开每一层。

1 第一层 – Episode 1

这个字符串可以使用 CyberChef 来解码,其中包含大量用于编码和解码的小工具:

解码后如下:

代码语言:javascript复制
$s=New-Object IO.MemoryStream(,[Convert]::FromBase64String("ANOTHER_LOONG_STRING_R_U_KIDDING_ME"));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();

对上述确码后的字符串有两个解决方法:

  • 再一次使用 base64 来解码;
  • 字符串有出现 Compression/Decompression,也许可对其进行解压;

以下这张图描述起来更形象:

2 第二层 – Attack of Compression

现在把 H4sIAAAAA[..]GDQAA 进行 base64 解码,如下图所示:

3 第三层 – The Last Beacon

查看解码后的内容,并没有什么东西能引起我的注意,看不到 URL,IP,可识别的端口号或像 DoEvilStuff() 和 DestoryTheResistance() 之类的函数,但在结尾处有一长串字符也许能探索出东西来:

代码语言:javascript复制
[Byte[]]$var_code = [System.Convert]::FromBase64String("/OiJAAAAYInlMdJ..ENUFF_IS_ENUFF_I_QUIT..jEwOAA=")

同样用 CyberChef 来解码,如下图所示:

解码出来的已不在是 [PowerShell,Batch,JS,VBS 等] 脚本,而是 Shellcode。我们遇到过攻击者将 PE 文件代码嵌入在脚本文件中,什么是 ShellCode?在黑客攻击中,ShellCode 是一小段代码,通常用在软件利用漏洞的 Payload,之所以称之为 ShellCode,是因为它会启动命令 shell 程序,攻击者可以通过该 shell 程序来控制受感染的计算机,但是执行类似任务的任何代码都可以称之为 ShellCode。

机器 A – Bob 所有,为攻击者

机器 B – Alice 所有,为受害者

启动命令 Shell 可以为 Bob 提供一个途径,在机器 B 上执行一段恶意程序,可以想象这么一个场景:

  • Bob 知道 Alice 喜欢可爱狗狗图片,因此给她发一封伪装的电子邮件,里面有一个恶意附件,上面写着 “你见过狗演奏四弦琴吗?单击此处查看!”,她单击了此处,然后 Bob 会在 Alice 不知情的情况下进入她的电脑;
  • Bob 知道 Alice 正在运行一台非常旧的 Win7 的电脑,他利用 EtermalBlue 漏洞远程攻击 Alice 操作系统,而无需用户干预;

在分析了 ShellCode 之后,我们发现它是 Cobalt Strike 的一部分。Cobalt Strike 是一个威胁仿真软件,该软件有助于进行安全评估,可复制网络中高级对手的策略和技术,但是总是会有人经常滥用此工具对企业进行攻击。

什么是 Beacon?Beacon 是 Cobalt Strike 的 Payload,用于为高级攻击者建模。

有时候使用正常的解码看不到 IP 地址,上面的示例非常简单,但是为了演示起见,可能会在 ShellCode 之后找到类似的代码:

代码语言:javascript复制
[Byte[]]$var_code = [System.Convert]::FromBase64String('38u[Redacted_Chracters_CMjIyMg')

for ($x = 0; $x -lt $var_code.Count; $x  ) {

$var_code[$x] = $var_code[$x] -bxor 35

}

根据上述代码,接下来需要一个 XOR 操作,如下图所示:

你也能使用 scdbg 工具,scdbg 是一个 ShellCode 仿真工具,运行它时,会向用户显示 ShellCode 试图调用的 Windows API。

scdbg 运行此 ShellCode 后:

IP 在演示中可能有所不同,因为我想在这里介绍两个示例,即恶意代码中有没有 XOR:

Success!我们有 IP 地址以及 ShellCode 调用的端口,以获取进一步的指示。在活动事件中,快速提取并将此信息快速传递给客户的能力会产生重大影响。现在,他们可以监视/阻止此 IP 和相应的端口 (作为事件响应的一部分),切断攻击者对其资产的访问。

直接在内存中执行 ShellCode 会让人感到意外,因为如果它被放在某个磁盘上 (包含依赖项),分析员会对它进行分析,或者会上传到 VirusTotal 上,文件会立即公开。

我想用公开的一小段 [Courtesy: OD] 来结束本篇文章,这小段可以拿来练习。如果你发现一个名为 UigioaCuQxDqfwNx 的恶意服务,并出现以下字符串,如果你想深入 C2 IP,请以安全的方式发布。

代码语言:javascript复制
%COMSPEC% /b /c start /b /min powershell -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQBPAGIAagBlAGMAd

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

0 人点赞