正儿八经说手艺——以Emotet为例深入剖析CMD下令混淆手艺

宣布时间 2018-12-13
Emotet一款著名的银行木马 ,首次泛起于2014年年中。该木马主要通过垃圾邮件的方法撒播熏染目的用户 ,今年仍然非�;钤� ,并且一直转变撒播名堂 ,接纳越来越重大的混淆编码来逃避检测。
    
CMD和Powershell下令经常被用在恶意软件中执行恶意剧本文件 ,并通过剧本混淆、加密或编码方法来绕过AV检测。本文枚举两个典范的Emotet撒播中使用的混淆CMD下令 ,来深入剖析CMD.下令混淆手艺。

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

尊龙凯时 - 人生就是搏!


 


 壹

CMD下令的混淆方法


 
 插入特殊字符混淆下令 
 
字符“^”是CMD下令中最常见的转义字符 ,该字符不影响下令的执行。由于在cmd情形中 ,有些字符具备特殊功效 ,如 >、>>体现重定向 ,| 体现管道 ,&、&&、|| 体现语句毗连。它们都有特定的功效 ,若是需要把它们作为字符输出的话 ,echo >、echo |之类的写法就会蜕化——cmd诠释器会把它们作为具有特殊功效的字符看待 ,而不会作为通俗字符处置惩罚 ,这个时间 ,就需要对这些特殊字符做转义处置惩罚:在每个特殊字符前加上转义字符^。

因此 ,要输出这些特殊字符 ,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^之类的名堂来处置惩罚。另外 ,此转义字符还可以用作续行符号。
 
尊龙凯时 - 人生就是搏!


逗号“,”和分号 “;”可以交流 ,可以取代下令中的正当空格。多个空格也不影响下令执行。
 
尊龙凯时 - 人生就是搏!


成对的圆括号()也会泛起在下令参数中 ,也不影响下令的执行。圆括号体现嵌入子下令组 ,同样被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中所有的情形变量。
 
尊龙凯时 - 人生就是搏!


assoc:文件名扩展关联下令 ,用于显示和设置文件名扩展关联 ,可以指定某种后缀名的文件凭证特定的类型文件翻开或执行。下令名堂为:assoc [.ext[=[fileType]]] 

.ext是指:指定要关联的文件后缀名。点号(.)是不可省略的 ,若是省略了系统将显示该后缀名文件的关联信息。fileType是指:指定相关联的文件类型。若是只使用该参数 ,将显示该文件类型的信息。反之 ,该下令将列出系统注册的素有后缀名文件和相关的类型。
 
尊龙凯时 - 人生就是搏!


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

尊龙凯时 - 人生就是搏!


cmd.exe的情形变量分为系统已有的情形变量和自界说变量。使用情形变量的值中的字符或字符串 ,可以拼接成黑客需要的cmd下令 ,同时可以逃避静态检测。如系统已有的情形变量%comspec%变量的值默以为:“C:\WINDOWS\system32\cmd.exe” ,set下令可以被编码为: %comspec:~11,1%%comspec:~-1%%comspec:~-13,1%。
 
尊龙凯时 - 人生就是搏!


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

尊龙凯时 - 人生就是搏!


%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:参数延迟变量扩展方法。
 
尊龙凯时 - 人生就是搏!

 
 使用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 将通过对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窗口。
 
尊龙凯时 - 人生就是搏!


/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是以行为单位来处置惩罚文本文件的 ,若是我们想把每一行再剖析成更小的内容 ,就使用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。
 
尊龙凯时 - 人生就是搏!

 贰
现实样天职析
 
我们选取新近的Emotet样本下载使用的CMD下令混淆 ,来使用前面的知识来解混淆。
 
 使用自界讨情形变量和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

 使用cmd系统情形变量和For循环混淆 

尊龙凯时 - 人生就是搏!


先将混淆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忽略。
 
尊龙凯时 - 人生就是搏!


接着自界说了一个情形变量@ ,即是一个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循环重组出的下令最先执行。
 
尊龙凯时 - 人生就是搏!


我们编写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