VenusEye首页 > 资讯列表 > 以Emotet为例深入分析CMD命令混淆技术

以Emotet为例深入分析CMD命令混淆技术2018.12.12    金睛安全研究团队

 

    Emotet一款著名的银行木马,首次出现于2014年年中。该木马主要通过垃圾邮件的方式传播感染目标用户,今年仍然非常活跃,并且不断变化传播花样,采用越来越复杂的混淆编码来躲避检测。

    CMDPowershell命令常常被用在恶意软件中执行恶意脚本文件,并通过脚本混淆、加密或编码方式来绕过AV检测。本文列举两个典型的Emotet传播中使用的混淆CMD命令,来深入分析CMD.命令混淆技术。

先看一个从DOC文档嵌入的VBA宏代码中提取的CMD命令,乍一看上去,像是无意义的一串字符,仔细分析起来需要先了解一下CMD命令的混淆方式。

 

一、 CMD命令的混淆方式

 

1、 插入特殊字符混淆命令

 

字符“^”是CMD命令中最常见的转义字符,该字符不影响命令的执行。因为在cmd环境中,有些字符具备特殊功能,如 >>>表示重定向,| 表示管道,&&&|| 表示语句连接。它们都有特定的功能,如果需要把它们作为字符输出的话,echo >echo |之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^

因此,要输出这些特殊字符,就需要用 echo ^>echo ^|echo ^|^|echo ^^之类的格式来处理。另外,此转义字符还可以用作续行符号。

逗号“,”和分号 “;”可以互换,可以取代命令中的合法空格。多个空格也不影响命令执行。

成对的圆括号()也会出现在命令参数中,也不影响命令的执行。圆括号表示嵌入子命令组,同样被cmd.exe参数处理器进行解释。如:cmd.exe /c ( ( ((echo Command 1) ) )) &&( ( (((((echo Command 2))))) ) )

 

2、 利用CMD环境变量拼接命令

 

Cmd.exe内部命令有: setassoc ftype等。

Set命令用来显示、设置或删除cmd.exe环境变量。命令格式:

SET [variable=[string]]

  variable  指定环境变量名。

  string    指定要指派给变量的一系列字符串。

在命令行中输入 set,会列举出cmd.exe中所有的环境变量。

assoc:文件名扩展关联命令,用于显示和设置文件名扩展关联,可以指定某种后缀名的文件按照特定的类型文件打开或执行。命令格式为:assoc [.ext[=[fileType]]]

.ext是指:指定要关联的文件后缀名。点号(.)是不能省略的,如果省略了系统将显示该后缀名文件的关联信息。fileType是指:指定相关联的文件类型。如果只使用该参数,将显示该文件类型的信息。反之,该命令将列出系统注册的素有后缀名文件和相关的类型。

ftype:显示或修改用在文件扩展名关联中的文件类型,指定一种类型的文件默认用哪个程序运行或打开。命令格式为:ftype [fileType[=[openCommandString]]

cmd.exe的环境变量分为系统已有的环境变量和自定义变量。利用环境变量的值中的字符或字符串,可以拼接成黑客需要的cmd命令,同时可以逃避静态检测。如系统已有的环境变量%comspec%变量的值默认为:C:\WINDOWS\system32\cmd.exeset命令可以被编码为: %comspec:~11,1%%comspec:~-1%%comspec:~-13,1%

%VarName:~offset[,length]% 主要用于获取环境变量VarName的变量值,偏移offset字节之后长度为length个字节。[,length]可省略。

变量值    C:\WINDOWS\system32\cmd.exe

偏移下标:  0           11 -13         -1

%comspec:~11,1%表示取comspec变量值中的字符,默认下标从0开始,从下标11开始,取一个字符,即为”s”offset也支持负数,表示反向遍历字符串的下标。%comspec:~-1%即为“e“,%comspec:~-13,1%即为”t“。如此编码set命令,可以逃脱静态检测”set“命令字符串的检测机制。

通常我们也可以自定义一个或者多个环境变量,利用环境变量值中的字符,提取并拼接出最终想要的cmd命令。如:

Cmd /C set envar=net user && call echo %envar%“ 可以拼接出cmd命令:net user

也可以定义多个环境变量进行拼接命令串,提高静态分析的复杂度:

cmd /c “ set envar1=ser&& set envar2=ne&& set envar3=t u&&call echo %envar2%%envar3%%envar1%”

cmd命令的“/C”参数,Cmd /C “string”表示:执行字符串string指定的命令,然后终止。

而启用延迟的环境变量扩展,经常使用 cmd.exe /V:ON参数

/V:ON参数启用时,可以不使用call命令来扩展变量,使用 %var% !var! 来扩展变量,!var!可以用来代替%var%,也就是可以使用感叹号字符来替代运行时的环境变量值。后面介绍For循环时会需要开启/V:参数延迟变量扩展方式。

 

3、 利用For循环拼接命令

 

For循环经常被用来混淆处理cmd命令,使得cmd命令看起来复杂且难以检测。最常用的For循环参数有 /L,/F参数。

FOR 参数 %变量名 IN (相关文件或命令) DO 执行的命令

FOR %variable IN (set) DO command [command-parameters]

%variable 指定一个单一字母可替换的参数。 这个变量名可以是小写a-z或者大写A-Z,区分大小写,FOR会把每个读取到的值赋给该变量。在批处理文件中,引用变量要用%%variable,我们这里主要介绍在cmd窗口中,引用变量用%variable即可。
(set)     
指定一个或一组文件。可以使用通配符。 相关的文件或命令。
command   
指定对每个文件执行的命令。 
command-parameters 
            
为特定命令指定参数或命令行开关。

/L 参数: 迭代数值范围

for /L %variable in (start,step,end) do command [command-parameters]

该命令表示以增量形式从开始到结束的一个数字序列。使用迭代变量设置起始值(start),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (end)/L 将通过对startend进行比较来执行迭代变量。如果start小于end,就会执行该命令,否则命令解释程序退出此循环。还可以使用负的 step以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。命令cmd /C “for /L %i in (1,1,5) do start cmd”,会执行打开5cmd窗口。

/F参数: 是最强大的命令,用来处理文件和一些命令的输出结果。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

(file-set) 为文件名,for会依次将file-set中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白行。

("string")代表字符串,('command')代表命令。

假如文件aa.txt中有如下内容:

1行第1列 第1行第2
2行第1列 第2行第2

要想读出aa.txt中的内容,可以用for /F %i in (aa.txt) do echo %i ,如果去掉/F参数则只会输出aa.txt,并不会读取其中的内容。

先从括号执行,因为含有参数/F,所以for会先打开aa.txt,然后读出aa.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素。由上图可见,并没有输出第二列的内容,原因是如果没有指定“delims=符号列表”这个开关,那么for /F语句会默认以空格键或Tab键作为分隔符。For /F是以行为单位来处理文本文件的,如果我们想把每一行再分解成更小的内容,就使用delimstokens选项。delims用来告诉for每一行用什么作为分隔符,默认分隔符是空格和Tab键。for /F “delims= “ %i in (aa.txt) do echo %i ,delims设置为空格,是将每个元素以空格分割,默认只取分割之后的第一个元素。如果我们想得到第二列数据,就要用到tokens=2,来指定通过delims将每一行分成更小的元素时,要取出哪一个或哪几个元素:for /F “tokens=2 delims= “ %i in (aa.txt) do echo %i

 

二、实际样本分析

 

我们选取新近的Emotet样本下载利用的CMD命令混淆,来利用前面的知识来解混淆。

 

1、 利用自定义环境变量和For循环混淆

 

该样本中利用了cmd.exe 的启用延迟环境变量/V:ON参数,/C参数,利用set命令自定义一个环境变量kpx=lHUwrRfzapaiNzCqHfu:Doc(4YQ0S.1,xk}$) s6dK=mn5/+ygbW-TeP\v2tj{78Mh@;BO'FZ,通过&&拼接命令,然后是个for循环: for %G in (数列)do set     1q=!1q!!kpx:~  %G,    1!&& if %G==  81  call  %1q:~    -377%。我们着重分析下for命令。因为前面使用了延迟环境变量,所以可以使用!1q!!kpx:~  %G,    1!的方式来扩展变量,在运行时代替环境变量值。for的循环变量是%G%G in (数列值)!kpx:~ %G, 1!表示取环境变量kpx中下标为%G的一个字符,我们可以用如下python编码实现该功能。数列中的空格可以忽略,数列中的数值正好是377个,kpx字符串的长度是72个字符,下标为81已经不存在,所以当下标%G==81时,运行时环境变量1q=!1q!powershell ……, call %1q:~-377%,所以1q变量的-377下标正好是for循环遍历出的powershell……命令,前面的1q=!1q!是初始化变量1q,需要被去掉以免影响正常命令的执行,所以取1q变量的-377下标正好绕过前面的!1q!

输出:

下载Emotet的链接为:

http://catbayouthaction.com/jKS86a

http://spsystems24.ru/O

http://xn--80abdh8aeoadtg.xn--p1ai/multimedia/hD4lyk7

http://borsehung.pro/pfWq

http://inpart-auto.ru/x2bu

 

2、 利用cmd系统环境变量和For循环混淆

 

先将混淆cmd命令中的转义字符“^”全部去掉,再将除了变量@之外的逗号“,”、分号“;”、多余空格删除。注意保留变量@中的逗号和分号,否则影响输出结果。

  可见利用了cmd的系统环境变量%comspec%,即是cmd.exe的执行路径。利用For循环的F参数,在命令'aSsoC .cmd'中以字符vf=为分隔符,取第二列即是“cmd”。

fOr  /f  " delims=vf=  tokens=2"  %f  IN  ( 'aSsoC  .cmd' ) dO  %f  。其他无意义的字符串会被cmd忽略。

接着自定义了一个环境变量@,等于一个1460长度的字符串。然后利用For循环的/L参数,遍历变量@FOr /L %s In (1459,-4,+3 ) do (( ( (( seT \=!\!!@ :~ %s, 1!))))& iF %s eQU 3 (((CaLl %\ :~ -365% ),自定义了环境变量“\”,利用环境变量扩展符号!,!@ :~ %s, 1!表示循环变量%s1459开始,步长为-4,到3结束,循环提取变量@中的一个字符,长度为365个字符,即从For循环重组出的命令开始执行。

我们编写python脚本实现For循环功能:

最终解密出可读的内嵌powershell命令:

下载Emotet的链接为:

http://reitmaier.de/01cedmfXo

http://phoxart.com/sWP0E9

http://panbras.com.br/FHhUYIQ

http://osmanager.com.br/t3HnvWx9x

http://oldwillysforum.com/ChleCkW

 

三、总结

 

CMD的命令混淆千变万化,唯一的目的就是逃避沙箱的静态或动态检测,增加分析难度。万变不离其宗,只要掌握了cmd命令的基本语法规则并熟练使用,目前恶意样本的各种cmd混淆命令都可以迎刃而解,进而实现对该类样本的识别检测和防范。

 

参考:https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/dosfuscation-report.pdf

 

 

关于金睛安全研究团队

金睛安全研究团队是启明星辰集团检测产品本部专业从事威胁分析的团队。主要职责是对现有产品搜集上报的安全事件、样本数据进行挖掘、分析,并向用户提供专业分析报告。该组织会依据数据产生的威胁情报,对其中采用的各种攻防技术做深入的跟踪和分析,并且给出专业的分析结果、提出专业建议,为用户决策提供帮助。

 

 

关于启明星辰威胁情报中心(Venuseye

 

ve-logo的.png

 

启明星辰威胁情报中心(VenusEye)是由启明星辰集团倾力打造的集威胁情报收集、分析、处理、发布和应用为一体的威胁情报服务平台,综合运用沙箱集群、同源性分析、大数据、知识图谱、人工智能等先进技术,生产和提供高质量的威胁情报信息,在威胁情报领域深耕细作,潜修践行是国内为数不多的威胁情报领域领导者之一。

 

Copyright © 1996-2018 启明星辰 All rights reserved.