【Day 27】Cmd 指令很乱,主办单位要不要管一下 (上) - Cmd 指令混淆

环境

  • Windows 10 21H1
  • System Monitor v13.01

前情提要

【Day 23】为美好的 Windows 献上 ETW - Event Tracing for Windows 介绍了 Windows 的 ETW(Event Tracing for Windows),其中虽然没有实作,但是实际上有可以取得 Cmd 指令的 Provider。另外在【Day 26】我们与 1102 的距离 - Bypass Clear Log Event 介绍了 Event Log,使用日志也可以观察使用者输入的 Cmd 指令。

上述两篇讲的都是蓝队的应用,因此这一篇轮到红队反击。红队除了直接针对 Windows 的功能绕过之外,还可以透过混淆指令或程序的方式增加蓝队的防守难度。

混淆

对於红队来说,会希望蓝队分析的成本提高,让自己的指令或程序比较不容易被理解或是侦测。假设蓝队要辨别现在要执行的指令是不是恶意的,可能会透过指令的一些特徵确认,那红队就可以利用混淆的方式绕过那些特徵。

红队在成功入侵一台机器後,会尽量使自己做的事情不容易被蓝队发现。所以攻击者可以把指令混淆,让资安研究员无法轻易知道攻击者目前做了哪些坏事。如此一来,攻击者的入侵程度可能就会被错估,导致损失持续扩大。

APT 组织 FIN8 曾利用混淆的技巧在钓鱼文件上,透过混淆过的 Macro 来隐藏执行的指令。钓鱼文件的介绍可以参考之前的文章【Day 02】Word 很大,你要看一下 - Microsoft Office Phishing

混淆的目标可以是 Cmd 指令、Powershell 指令、Python、Javascript、C#、C/C++ 程序等等,这篇主要会说明 Cmd 指令的混淆原理与侦测方法。

侦测方式

首先要先介绍两种主要的侦测方法,分别是静态侦测与动态侦测,了解之後会更好理解混淆技巧的使用情境。

静态侦测

静态的侦测方式一般是指从档案、Registry 取得目标,可以直接读取内容做判断。

静态侦测的优点如下:

  • 效率较高
  • 只要有目标就可以侦测

缺点如下:

  • 比较容易绕过

例如现在看到一个 evil.cmd 档案,档案内容如下,里面有加入一个简单的插入符号混淆,在文章後面会介绍。静态侦测就是会拿到原本的档案内容。

::evil.cmd
cmd /c who^ami

动态侦测

相对於静态侦测,动态侦测可以避免掉部分的混淆,因为有些混淆会在执行前载入记忆体时被解析。可以使用 ETW 或 Event Log 取得指令。

  • 优点
    • 比较不容易绕过
  • 缺点
    • 效率较低
    • 需要满足特定的需求,例如执行

继续上述静态侦测的例子,虽然执行的指令是 who^ami,但是从 Sysmon 产生的 Log 来看却是没被混淆的指令,如下图。

Cmd 混淆技巧

在 FireEye 的 Dosfuscation 白皮书有讲解可能被利用的混淆方法,其中说明有哪些 APT 曾经使用了哪些技巧,在文末也有介绍可能的侦测方式。

环境变数(Environment Variable)

在 Cmd 中输入 set 会输出环境变数,输出大致如下,这里截取片段。

# set
ALLUSERSPROFILE=C:\ProgramData
ANSICON=212x32766 (212x49)
ANSICON_DEF=7

在 Cmd 指令中,我们可以透过两个 % 包住环境变数名称来代表它的值,以 ALLUSERSPROFILE 为例。

# echo %ALLUSERSPROFILE%
C:\ProgramData

我们可以利用环境变数的子字串凑出我们想要执行的指令,举例如下。数字 2 代表从第几个字元开始,数字 3 则代表子字串长度。

# echo %ALLUSERSPROFILE:~2,3%
\Pr

所以假设我们要执行 whoami 指令,我们可以透过把多个子字串拼接在一起来达成,举例如下。whoamiWOi 从环境变数 SystemRoot 拿;am 从环境变数 Tmp 拿;h 则直接使用字串。把所有字元拼在一起就可以执行 whoami 了。

# echo %SystemRoot%
C:\WINDOWS

# echo %Tmp%
C:\Users\user1\AppData\Local\Temp

# cmd /c "%SystemRoot:~3,1%h%SystemRoot:~7,1%%tmp:~-7,1%%tmp:~-2,1%%SystemRoot:~4,1%"
laptop-nqh6ma4o\zezec

不过这个方法只能绕过静态侦测,使用 Sysmon 观察还是会是原本的指令。

For Loop Value Extraction

这个混淆技巧主要是利用 Windows 内建指令的输出取得目标字串。与环境变数不同的是它可以使用在任何指令上,而不仅限於 setFor 可以搭配 Delims、Tokens 使用,以下举个例子。其中 Delims 是分割字元,下面例子是 c,所以会把 echo abcde 的输出 abcdec 切割;Tokens 则是 Index,从一开始数,下面例子是 2,所以会拿到 abcde 中的 de

# for /f "Delims=c Tokens=2" %a in ('echo abcde') do echo %a
# echo de
de

以这个逻辑来看,我们可以把要输入的指令转成这种格式。使用 Windows 内建指令可以避免产生多余的 Child Process,除了可以用 set 之外,还有 ftypeassocver 等等。以下举 PowerShell 为例,从 set 中先用 Findstr 找到目标的 PowerShell 字串,再用 Tokens 和 Delims 截取。

# set | findstr PSM
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules\


# cmd /c "for /f "Delims=s\ Tokens=4" %a in ('set^|findstr PSM') do %a"
# PowerShell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

这个技巧可以用来绕过静态与动态侦测,下图为 Sysmon 日志。

插入符号(Caret)

插入符号,又称脱字符号,指的是 ^,它有以下的特性。

:: a 会被执行
^a => a

:: 第 2 个 ^ 和 a 被执行
^^^a => ^a

:: 第 2、4 个 ^ 和 a 被执行
^^^^^a => ^^a

根据这个特性我们可以构造出指令,中间夹带着插入符号。举执行 powershell 为例。

# cmd /c p^owe^rsh^ell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

不过这个方法只能绕过静态侦测,下图为 Sysmon 日志。

双引号(Double Quotes)

双引号在指令中被当作是一个连接用的字元,所以在指令中可以正常的使用它,将双引号插入在任何位置。

# cmd /c p"owe"""rshe""ll
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

双引号比插入符号更常被一般的程序使用;而且不会有像是插入符号那样连续两个 ^ 被当作一个 ^ 的情形,所以可以存在在更深层的 Child Process;双引号的连接特性也适用於许多除了 Cmd 之外的程序,例如 PowerShell。最棒的是它可以躲过动态侦测,如下图 Sysmon 日志。基於以上原因,比起插入符号,双引号更常被用来做混淆。

参考资料


<<:  Day 30 我完成铁人了!

>>:  Day 27: 人工智慧在音乐领域的应用 (索尼-Flow Machine、谷歌-Magenta )

【Day13-计数】如何快速统计资料出现频率?——使用Counter或groupby快速计算元素出现个数

当拿到资料之後,我通常的第一步一定是先看一下这笔资料大致长什麽样子 这个时候有了能统计每个类别出现了...

React-视窗滚动改变DOM

一开始我想实现一个办法 就是在滑鼠滚动到指定位置时 我指定的区块会浮现出来 滑鼠往上滚时,区块会一起...

neat download manager 类似IDM 完全免费

IDM3.67简体破解版,最近打开就提示更新,更新后就不能用了! 然后就无意中发现了这款神器,功能上...

Day28. Blue Prism最安全的管家 -BP自动登入Gmail

有些人常常遇到紧张时刻密码就是打不好, 因此常常错失登入三次失败的机会, 被锁定帐密光是请IT协助就...

ASP.NET MVC 从入门到放弃(Day14)- Html Css 结构介绍

接下来讲讲 html + CSS + javascript + bootstrap基本介绍细节部分 ...