正儿八经说技术——以Emotet为例深刻分析CMD号令混合技术

颁布功夫 2018-12-13
Emotet一款驰名的银行木马,,,,,初次出现于2014年年中。。。。。。。该木马重要通过垃圾邮件的方式传布习染指标用户,,,,,今年依然非� ;;;;;;;;钤�,,,,,并且不休变动传布花腔,,,,,选取越来越复杂的混合编码来躲避检测。。。。。。。
    
CMD和Powershell号令时时被用在恶意软件中执行恶意剧本文件,,,,,并通过剧本混合、加密或编码方式来绕过AV检测。。。。。。。本文列举两个典型的Emotet传布中使用的混合CMD号令,,,,,来深刻分析CMD.号令混合技术。。。。。。。

先看一个从DOC文档嵌入的VBA宏代码中提取的CMD号令,,,,,乍一看上去,,,,,像是无意思的一串字符,,,,,仔细分析起来必要先相识一下CMD号令的混合方式。。。。。。。

8827太阳集团(Macau)股份有限公司-Official website


 


 壹

CMD号令的混合方式


 
 插入特殊字符混合号令 
 
字符“^”是CMD号令中最常见的转义字符,,,,,该字符不影响号令的执行。。。。。。。由于在cmd环境中,,,,,有些字符具备特殊职能,,,,,如 >、>>暗示沉定向,,,,,| 暗示管路,,,,,&、&&、|| 暗示语句衔接。。。。。。。它们都有特定的职能,,,,,若是必要把它们作为字符输出的话,,,,,echo >、echo |之类的写法就会犯错——cmd诠释器会把它们作为拥有特殊职能的字符对待,,,,,而不会作为通常字符处置,,,,,这个时辰,,,,,就必要对这些特殊字符做转义处置:在每个特殊字符前加上转义字符^。。。。。。。

因而,,,,,要输出这些特殊字符,,,,,就必要用 echo ^>、echo ^|、echo ^|^|、echo ^^之类的体式来处置。。。。。。。另表,,,,,此转义字符还能够用作续行符号。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


逗号“,”和分号 “;”能够互换,,,,,能够取代号令中的合法空格。。。。。。。多个空格也不影响号令执行。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


成对的圆括号()也会呈此刻号令参数中,,,,,也不影响号令的执行。。。。。。。圆括号暗示嵌入子号令组,,,,,同样被cmd.exe参数处置器进行诠释。。。。。。。如:cmd.exe /c ( ( ((echo Command 1) ) )) &&( ( (((((echo Command 2))))) ) )
 
 利用CMD环境变量拼接号令 
 
Cmd.exe内部号令有: set、assoc ,,,,,ftype等。。。。。。。

Set号令用来显示、设置或删除cmd.exe环境变量。。。。。。。号令体式:
SET [variable=[string]]
  variable  指定环境变量名。。。。。。。
  string    指定要指派给变量的一系列字符串。。。。。。。

在号令行中输入 set,,,,,会列举出cmd.exe中所有的环境变量。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


assoc:文件名扩大关联号令,,,,,用于显示和设置文件名扩大关联,,,,,能够指定某种后缀名的文件依照特定的类型文件打开或执行。。。。。。。号令体式为:assoc [.ext[=[fileType]]] 

.ext是指:指定要关联的文件后缀名。。。。。。。点号(.)是不能省略的,,,,,若是省略了系统将显示该后缀名文件的关联信息。。。。。。。fileType是指:指定有关联的文件类型。。。。。。。若是只使用该参数,,,,,将显示该文件类型的信息。。。。。。。反之,,,,,该号令将列出系统注册的素有后缀名文件和有关的类型。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


ftype:显示或批改用在文件扩大名关联中的文件类型,,,,,指定一种类型的文件默认用哪个法式运行或打开。。。。。。。号令体式为:ftype [fileType[=[openCommandString]]

8827太阳集团(Macau)股份有限公司-Official website


cmd.exe的环境变量分为系统已有的环境变量和自界说变量。。。。。。。利用环境变量的值中的字符或字符串,,,,,能够拼接成黑客必要的cmd号令,,,,,同时能够逃避静态检测。。。。。。。如系统已有的环境变量%comspec%变量的值默以为:“C:\WINDOWS\system32\cmd.exe”,,,,,set号令能够被编码为: %comspec:~11,1%%comspec:~-1%%comspec:~-13,1%。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


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

8827太阳集团(Macau)股份有限公司-Official website


%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
 
8827太阳集团(Macau)股份有限公司-Official website


也能够界说多个环境变量进行拼接号令串,,,,,提高静态分析的复杂度:
cmd /c “ set envar1=ser&& set envar2=ne&& set envar3=t u&&call echo %envar2%%envar3%%envar1%”
 
8827太阳集团(Macau)股份有限公司-Official website


cmd号令的“/C”参数,,,,,Cmd /C “string”暗示:执行字符串string指定的号令,,,,,而后终止。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


而启用延长的环境变量扩大,,,,,时时使用 cmd.exe的 /V:ON参数,,,,,
/V:ON参数启用时,,,,,能够不使用call号令来扩大变量,,,,,使用 %var% 或 !var! 来扩大变量,,,,,!var!能够用来包办%var%,,,,,也就是能够使用感叹号字符来代替运行时的环境变量值。。。。。。。后面介绍For循环时会必要开启/V:参数延长变量扩大方式。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website

 
 利用For循环拼接号令 
 
For循环时时被用来混合处置cmd号令,,,,,使得cmd号令看起来复杂且难以检测。。。。。。。最常用的For循环参数有 /L,/F参数。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


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

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

%variable 指定一个单一字母可代替的参数。。。。。。。 这个变量名可所以幼写a-z或者大写A-Z,分辨大幼写,FOR会把每个读取到的值赋给该变量。。。。。。。在批处置文件中,,,,,引用变量要用%%variable,,,,,我们这里重要介绍在cmd窗口中,,,,,引用变量用%variable即可。。。。。。。
(set)      指定一个或一组文件。。。。。。�?????D芄皇褂猛ㄅ浞�。。。。。。。 有关的文件或号令。。。。。。。
command    指定对每个文件执行的号令。。。。。。。 
command-parameters 
             为特定数令指定参数或号令行开关。。。。。。。
/L 参数: 迭代数值领域
for /L %variable in (start,step,end) do command [command-parameters]

该号令暗示以增量大局从起头到实现的一个数字序列。。。。。。。使用迭代变量设置肇始值(start),,,,,而后逐步执行一组领域的值,,,,,直到该值超过所设置的终止值 (end)。。。。。。。/L 将通过对start与end进行比力来执行迭代变量。。。。。。。若是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”,会执行打开5个cmd窗口。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


/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,,,,,并不会读取其中的内容。。。。。。。

8827太阳集团(Macau)股份有限公司-Official website



先从括号执行,,,,,由于含有参数/F,所以for会先打开aa.txt,,,,,而后读出aa.txt里面的所有内容,,,,,把它作为一个集中,,,,,并且以每一行作为一个元素。。。。。。。由上图可见,,,,,并没有输出第二列的内容,,,,,原因是若是没有指定“delims=符号列表」剽个开关,,,,,那么for /F语句会默认以空格键或Tab键作为分隔符。。。。。。。For /F是以行为单元来处置文本文件的,,,,,若是我们想把每一行再分化成更幼的内容,,,,,就使用delims和tokens选项。。。。。。。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。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website

 贰
现实样本分析
 
我们拔取新近的Emotet样本下载利用的CMD号令混合,,,,,来利用前面的知识来解混合。。。。。。。
 
 利用自界说环境变量和For循环混合 
 
8827太阳集团(Macau)股份有限公司-Official website


该样本中利用了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!。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


输出:

8827太阳集团(Macau)股份有限公司-Official website


下载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

 利用cmd系统环境变量和For循环混合 

8827太阳集团(Macau)股份有限公司-Official website


先将混合cmd号令中的转义字符“^”全数去掉,,,,,再将除了变量@之表的逗号“,”、分号“;”、有余空格删除。。。。。。。把稳保留变量@中的逗号和分号,,,,,不然影响输出了局。。。。。。。

 可见利用了cmd的系统环境变量%comspec%,,,,,即是cmd.exe的执行蹊径。。。。。。。利用For循环的F参数,,,,,在号令'aSsoC .cmd'中以字符v、f、=为分隔符,,,,,取第二列即是“cmd”。。。。。。。
fOr  /f  " delims=vf=  tokens=2"  %f  IN  ( 'aSsoC  .cmd' ) dO  %f  。。。。。。。其他无意思的字符串会被cmd忽略。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


接着自界说了一个环境变量@,,,,,蹬宗一个1460长度的字符串。。。。。。。而后利用For循环的/L参数,,,,,遍历变量@:FOr /L %s In (1459,-4,+3 ) do (( ( (( seT \=!\!!@ :~ %s, 1!))))& iF %s eQU 3 (((CaLl %\ :~ -365% ),,,,,自界说了环境变量“\”,,,,,利用环境变量扩大符号!,,,,,!@ :~ %s, 1!暗示循环变量%s从1459起头,,,,,步长为-4,,,,,到3实现,,,,,循环提取变量@中的一个字符,,,,,长度为365个字符,,,,,即从For循环沉组出的号令起头执行。。。。。。。
 
8827太阳集团(Macau)股份有限公司-Official website


我们编写python剧本实现For循环职能:

8827太阳集团(Macau)股份有限公司-Official website


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

8827太阳集团(Macau)股份有限公司-Official website

8827太阳集团(Macau)股份有限公司-Official website



下载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