很装b那种cmd命令_CMD命令混淆分析
0x00 简介
混淆技术,已经有很长的历史了:包括恶意有效载荷的加密和字符串的混淆,到JavaScript混淆。命令行混淆不是一个新问题 - 只是混淆的目标(Windows命令处理器 cmd.exe)相对较新。命令行解释器是一个单独的软件程序,它可以在用户和操作系统之间提供直接的通讯。非图形命令行解释器用户界面提供运行基于字符的应用程序和实用程序的环境。命令行解释器通过使用类似于 MS-DOS 命令解释程序 Command.com 的各个字符来执行程序并在屏幕上显示其输出。Windows 服务器操作系统命令行解释器使用命令解释程序 Cmd.exe(该程序加载应用程序并指示应用程序之间的信息流动)将用户输入转换为操作系统可理解的形式。
Cmd中有许多的特殊字符,都具备特殊的功能,“^”是常见的转义字符,我们把插入到命令当中,不影响命令执行,它们都有特定的功能,如果需要把它们作为字符输出的话,echo >、echo |之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^。因此,要输出这些特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^之类的格式来处理。另外,此转义字符还可以用作续行符号。
@ 命令行回显屏蔽符 % 批处理变量引导符 > 重定向符 >> 重定向符 < 、>&、 | 命令管道符 ^ 转义字符 & 组合命令 && 组合命令 || 组合命令 "" 字符串界定符 & [...] Command1 &Command2 用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。&&[...] Command1 &&Command2 只有在符号 && 前面的命令成功时,才运行该符号后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令运行成功时才运行第二个命令。|| [...] Command1 || Command2 只有在符号 || 前面的命令失败时,才运行符号 || 后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令未能运行成功(接收到大于零的错误代码)时才运行第二个命令。( ) [...] ( Command1 & Command2) 用来分组或嵌套多个命令。; 或者 , Command1 Parameter1;Parameter2 用来分隔命令参数。 
混淆的维度
混淆的强度
0x01 利用特殊字符进行混淆

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

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

当然也可以用&&进行命令组合



%comspec% 是一个指向当前命令行外壳的环境变量。通过使用 %comspec%,您不必担心命令行外壳是 cmd.exe 还是 command.exe;%comspec% 会自动选择正确的一个。


添加空格

添加逗号和分号
,;,%coMSPec:~ -0, +27%,; ,;, ;/b, ;;; ,/c, ,,, ;start; , ; ;/b ; , /min ,;net user 
添加括号
,;,%coMSPec:~ -0, +27%,; ,;, ;/b, ;;; ,/c, ,,, ;start; , ; ;/b ; , /min ,;netstat -ano |; ,;( (,;,((findstr LISTENING)),;,) ) 
添加多个转义字符
,;,%coMSPec:~ -0, +27%,; ,;, ;^^^^/^^^^b^^^^, ;;; ,^^^^/^c, ,,, ;^^st^^art^^; , ; ;/^^^^b ; , ^^^^/^^^^min ,;net^^^^stat ^^^^ ^^^^-a^^^^no ^^^^ ^|; ,;( ^ (,;^,(^(fi^^^^ndstr LIST^^^^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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
