正儿八经说手艺——以Emotet为例深入剖析CMD下令混淆手艺
宣布时间 2018-12-13CMD和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,并不会读取其中的内容。
我们选取新近的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/01cedmfXohttp://phoxart.com/sWP0E9
http://panbras.com.br/FHhUYIQ
http://osmanager.com.br/t3HnvWx9x
http://oldwillysforum.com/ChleCkW
参考:
https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/dosfuscation-report.pdf


京公网安备11010802024551号