0x00介绍
混淆技术有很长的历史。 包括恶意有效载荷加密、字符串混淆和JavaScript混淆。 命令行混淆不是一个新问题。 只是混淆对象Windows命令处理器cmd.exe )相对较新。 命令行解释器是一个独立的软件程序,提供用户与操作系统之间的直接通信。 除了图形命令行解释器以外,其他用户界面提供了执行基于字符的APP应用程序和实用程序的环境。 命令行解释器使用每个字符如MS-DOS命令解释器Command.com)运行程序,并在屏幕上显示其输出。 windows server OS命令行解释器使用命令解释器Cmd.exe加载APP应用程序,并指示APP应用程序之间的信息流,将用户输入转换为操作系统可以理解的格式。
Cmd有很多特殊字符,具有特殊功能。 “^”是常见的转义字符,将插入到命令中,而不影响命令的执行。 它们具有特定功能,如果需要以字符形式输出,则echo、echo |等书写方式会使——cmd解释器将它们视为具有特殊功能的字符,而不作为普通字符进行处理。 因此,要输出这些特殊字符,必须使用类似echo ^、echo ^|、echo ^|和echo ^^的格式进行处理。 此外,该转义字符也可以用作后续符号。
@命令行回显掩码%批处理变量读取器重定向、|命令管道^转义字符组合命令||组合命令”字符串修饰符[.] Command1Command2是Cmd.exe运行第一个命令,然后运行第二个命令。 [ . ]只有在command1command 2元件之前的命令成功时,才执行元件之后的命令。 Cmd.exe运行第一个命令,并且仅在第一个命令成功运行时运行第二个命令。 ||[.] Command1||Command2符号||只有在前一个命令失败时,才运行符号||后一个命令。 Cmd.exe运行第一个命令,并且只有在第一个命令无法成功运行接收到大于零的错误代码)时,才运行第二个命令。 ) )…) command1command2)用于对多个命令进行分组或嵌套。 或命令1参数1; Parameter2用于分隔命令参数。
容易混淆的维度
容易混淆的强度
0x01用特殊字符容易混淆
逗号“,”和分号“; ”可以交换。 可以代替命令中的合法空间。 多个空间也不影响命令的执行。
配对括号)既出现在命令参数中,也不影响命令的执行。 括号表示嵌入子命令组,也由cmd.exe参数处理器解释。
当然也可以进行指令组合
%comspec%是指向当前命令行shell的环境变量。 使用%comspec%无需担心命令行shell是cmd.exe还是command.exe % comspec %将自动选择正确的一个。
添加空间
添加逗号和分号
、% comspec :~~ 0,27 %; /b,/c、 开始; /b;/min, 网络用户
添加括号
、% comspec :~~ 0,27 %; /b,/c、 开始; /b;/min, netstat -ano |; )、);) findstr LISTENING ) );)
添加多个转义字符
、% comspec :~~ 0,27 %; ^^^//^^b^^;^^^^/^c、 ^^st^^art^^; /^^^^b;^^^^/^^^^min、 net^^^^stat^^^^-a^^^^no^^|; ^ )、 ^,^^ ) fi^^^NDStrlist^^^Ening ) ^ ); ^,) ^ )
基于0x02环境变量的混淆
cmd.exe环境变量分为系统的现有环境变量和自定义变量。 环境变量值中的字符或字符串可以被用于连接到黑客所需的cmd命令,从而避免静态检测
set唯一只能存在一个。 在编程语言中,set通常用于处理重复的字符串和数字,但在命令行中添加环境变量。 例: set path=%path% ); D\node ),添加环境变量在DOS下会变快
熟的启动程序, 不过使用 set 添加环境变量指在当前 DOS 窗口下有效, 关闭当前 DOS 窗口添加的环境变量也就不存在了。
作用:显示、设置或删除 cmd.exe 环境变量
格式:
SET [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串
要求:SET命令不允许变量名含有等号。
查看所有环境变量:
查看指定环境变量名称:
添加环境变量
清空环境变量
我们可以自定义一个或者多个环境变量,利用环境变量值中的字符,提取并拼接出命令
也可以定义多个环境变量进行拼接命令串
大多数对powershell使用简单连接的公共示例都依赖于执行子cmd.exe进程来扩展主进程中设置的自定义环境变量。但是,call命令将提供更安静的变量扩展方法,因为它不需要执行子进程。
cmd /c “set com3= /ano&&set com2=stat&&set com1=net&&call %com1%%com2%%com3%”
cmd /c “set com3= &&set com2=user&&set com1=net &&call %com1%%com2%%com3%”
cmd /c “set com3= &&set com2=user&&set com1=net &&call set final=%com1%%com2%%com3%&&call %final%”
随机大小写和空格
CMd /C “ sEt coM3= /ano&& SEt cOm2=stat&& seT CoM1=net&& caLl SeT fiNAl=%COm1%%cOm2%%coM3%&& cAlL %FinAl% “
添加逗号和分号
;,,CMd,; ,/C “, ;, ;sEt coM3= &&,,,SEt cOm2=user&&;;;seT CoM1=net &&, ;caLl,;,SeT fiNAl=%COm1%%cOm2%%coM3%&&; , ,cAlL, ;, ;%FinAl% “
添加括号
;,,C^Md^,; ,^/^C^ ^ “, ;, ;s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&;;;s^eT^ ^ C^oM1^=^n^^et) ) &&, ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; , ,c^AlL^, ;,^ ;%Fi^nAl^%) ) “
将配对双引号添加到输入命令以混淆其最终命令行参数
;,,C^Md^,; ,^/^C^ ^ “, ;, ;s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&;;;s^eT^ ^ C^oM1^=^n^^e””t) ) &&, ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; , ,c^AlL^, ;,^ ;%Fi^nAl^%) ) “
用相邻的双引号替换不相邻的双引号
;,,C^Md^,; ,^/^C^ ^ “, ;, ;s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&;;;s^eT^ ^ C^oM1^=^n^^””e””t) ) &&, ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; , ,c^AlL^, ;,^ ;%Fi^nAl^%) ) “
使用cmd.exe的/ V:ON参数启用延迟环境变量扩展
;,,C^Md^,; /V:ON,^/^C^ ^ “, ;, ;s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&;;;s^eT^ ^ C^oM1^=^n^^””e””t) ) &&set quotes=””&&, ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; , ,c^AlL^, ;,^ ;%Fi^nAl^%) ) “
使用包含相邻引号的变量的子字符串执行相邻双引号的字符串替换
;,,C^Md^,; /V:ON,^/^C^ ^ “, ;, ;s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&;;;s^eT^ ^ C^oM1^=^n^^””e””t) ) &&set quotes=””&&, ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; , ,c^AlL^, ;,^ ;%Fi^nAl^:””=!quotes:~0,1!%) ) “
编码混淆可以支持将随机生成的垃圾字符添加到唯一环境变量中并更新for循环中的索引值以使得在视觉上重新组装原始命令更加困难。除了在循环索引值之间以任何正数量显式签名非负整数和可互换空格,逗号和分号分隔符字符之外,所有先前的插入混淆字符都可以添加到FORcoded命令中
,;c^Md;/^V^:O^N;,;/^C “sE^T ^ unIQ^uE=OnBeFt^UsS C/AaToE ))&&,; fo^R;,;%^a,;; i^N;,,; ,+1; 3 5 7 +5 1^3 +5,,9 11 +1^3 +1;;+15 ^+13^37;,),;,;d^O,,;;s^Et fI^Nal=!finAl!!uni^Que:~ %^a,1!))&&;i^F,%^a=^=+13^37,Ca^lL;%fIn^Al:~-12%))”
cmd /V:ON /C “set reverse=ona/ tatsten&& FOR /L %A IN 11 -1 0) DO set final=!final!!reverse:~%A,1!&&IF %A==0 CALL %final:~-12%”
0x03 参考
https://www.fireeye.com/blog/threat-research/2018/11/obfuscated-command-line-detection-using-machine-learning.html
https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/dosfuscation-report.pdf
https://update.venuseye.com.cn/reports/1548417941041/%E4%BB%A5Emotet%E4%B8%BA%E4%BE%8B%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90CMD%E5%91%BD%E4%BB%A4%E6%B7%B7%E6%B7%86%E6%8A%80%E6%9C%AF20181212.html