现在杀软大都是底层防御,直接混淆cmd没啥用,这里的话主要是学一下思路
CMD命令符号
1 | @:隐藏命令的回显。 |
大小写/特殊字符混淆
cmd中大小写不敏感 可以大小写执行命令

特殊字符混淆
0x01 ^
^
是cmd中常见的转义字符 不会影响命令的正常执行。

0x02 ""拼接

0x03 , ;替换空格

但是这个插入net user
不会成功
0x04 ()

利用环境变量混淆
0x01
在cmd下使用set
可以列举出cmd中的所有环境变量
一般使用set a=who
这种的都是临时变量 重启后便不会存在
一般使用call命令来调用拓展变量

(cmd /c "string" 表示执行字符串string执行的命令 然后终止
可以通过 cmd /?
查看cmd下的详细命令)
1 | C:\Users\TEST>cmd /c "set var1=ser&&set var2=ne&&set var3=t u&&call %var2%%var3 |

记一个小坑
记一个小坑 set t="am" && who%t%i
多次执行只成功一次 不知道为什么..后续再运行 命令都失败了
直接echo %t%
得到为 "am"
尝试了下 发现这里可以不用去加双引号空格这类的 不然会被分隔开
但是第一次能执行也不知道是为啥,但是后面使用call
便可以执行环境变量的命令
0x02 cmd /V:ON 启用延迟环境变量拓展
当启用 /V:ON
后 使用 %var%
或
!var!
来扩展变量,!var!
可以用来代替%var%
1 | cmd /c "set var1=ser&&set var2=ne&&set var3=t u&&call %var2%%var3 |

0x03 通过截取环境变量
通过set
查看当前的环境变量
%comspec%
值的结果为
C:\Windows\system32\cmd.exe
可以通过截取后面部分去调用cmd
格式为%VarName:~offset[,length]%
然后就可以根据环境变量去拼接出想要执行的命令
使用for循环拼接命令
cmd中除了set命令歪 还有 ftype、assoc等命令
assoc
文件名拓展关联命令
assoc /?
1 | 显示或修改文件扩展名关联 |
ftype /?
ftype:显示或修改用在文件扩展名关联中的文件类型,指定一种类型的文件默认用哪个程序运行或打开。命令格式为ftype [fileType[=[openCommandString]]

for /?
使用方法挺详细的 就是感觉有点不好理解...

for 循环在混淆时是一种较为复杂的方式通常会使用 /F 和 /L 参数
1 | FOR /L %variable IN (start,step,end) DO command [command-parameters] |
利用混淆工具
https://github.com/danielbohannon/Invoke-DOSfuscation
需要powershell管理员权限下去运行
1 | Set-ExecutionPolicy Unrestricted |
- 使用
tutorial
查看基本使用方法

- Set command [需要混淆的命令] //设置需要混淆的命令

- Set FINALBINARY [命令运行的环境] //设置命令运行的环境

- payload //加载混淆模块

show //查看当前命令设置的参数详情
test //测试混淆后的命令
cmd命令去混淆
思路
- 替换掉 ^ 转义字符
- 通过 = 和 % 的规则去查找混淆的变量
- 通过 set 查找混淆变量
- 通过 %:~m,n% 查找混淆变量
- 统一小写常用命令和程序名称
mmts
这里使用mmts简单试一下 项目地址 https://github.com/a232319779/mmts
先通过反混淆工具生成一条命令 保存为1.txt
1 | cmd /C"set zUG=\System32\ ^^^| findstr calc\.exe&&set cF=:&&set szG=Windows&&set QK=\&&set HhO=dir&&set u6= C&&call set uQ=%HhO%%u6%%cF%%QK%%szG%%zUG%&&cmd /C %uQ%" |
然后再mmts下 mmts-decmd 1.txt

再去生成一个复杂点的混淆 whoami && net user
1 | f^o^R ; , ; , ; , , /^F ; ; ; ; " tokens= +2 delims=H0lFu" ; , ; , ; ; %^V ; ; , , , ^In , ; ; ; ( , , , , ; ; , ' , ; , , ; , ; ^^f^^t^^Y^^P^^E ; ; ; ; ^| ; , ; ; ^^f^^iN^^D ; ; , ; ; , , "Cm" ; , , , ; , ' , ; , ; ) ; , ; ; , ^D^o ; ; , %^V, ; ; ; ; , , ; 9k467c^/^v^@^E^O^f^ ^ ^ ; ; ; ; kwp3a/^r " ; ; , , , ( , , , , , ( , (^S^e^t ^ ^ ^*^_;=^~^R^-^j^z^ri^2^S^U^&e_^y^6^a^>^s^aY^6vh^u^Z^d^L^+N^ ^#^k^6`Ut^p ^4^c^H^e^,^jo^Y}n^-^`^5^9^_^ ^1^Z^)^, ^&^]^2^;^e^t^^?^eO^&^#^&^,^K^Y^BN^^3%^D^I^w^ 1^l^H^3P^i~^f^b%;^m^(^f^o^@^)a^g^{^c^s^K^o^_C^{^E^`^h^p^F^@^BAwp^Qd^B^?^ ^x^qs^zl^ ^Vq^>^Y^j^|^f^{^5S^Z^^O^)^6^?^\^ ^6^<%^v^2\a^?^j^z^G^2^&^W^S^9^a^3^`^*^>v^w^mj~#^t^(^ea^T^h^_^6^t^aB^)^A^X^s^j^b^D^(^W^y^\^Al^:{^s^C^b^\5^@^\^M^C^XN^?^s^J^M^P^[^x^w^S^4^UCy^o^I^9^{^2^S^d^T^w^_^`^Xn^u^J^|r3^i~^x^{^L^&^w^[^r^vW^,^\^7^b^;^e^R^:^#^`=E^;^C^9^g^O^o~^ ^Z^v^>^ ^A^r^Y^'^m^$^[^iZ^=^Bt^*^d) ; ; ; ; ) ; ; ; ; ; )& ; , ; , , , ; ^f^o^R ; ; ; ; ; /^L , , ; %^j ; , , ^In ; , ; , (^ ^ ^ ^ ^2^9^3^ ^ ^ ^,^ ^ ^ ^;^ ^ ^ ^ , ^ ^ ^ ^;^ ^ ^,^ ^ ^ ^ ^ ; ^ ^ ^ ^ ^ ^,^ ^ ^ ^-^6 ^ ^ ^ ^ ^,^ ^+5^ ^ ^ ^ ^ ^ ) , ; ; ; , ; ; ^D^o ; , , ; ; , , ( , ( , ; , ; , ; , ; , ( , ( , ; , ; , ; , ; , ; , ; , ; , ( , , , , , , , ( ; , ; , ; ; ^S^Et `^{^'=!`^{^'!!^*^_;:~ %^j, 1!) , ; , ; , ; , ; , ) , , , ) , , , , , , , ) , ; , ; , ; , ; , ; , ; , ; , ) , , , , , )&& ; ; ; , ; ^i^F , , , ; %^j ; ; ; , ^E^q^u , ; ; , ^5 , , ; ( , , , ( , , , ( , ; , ; , ; , ; , ; , ( , ; , ; , ; , ; , (^e^C^h^O ; , ; ; !`^{^':^*^`^{'!^=! | , , , ; ^F^O^r ; , , ; /^f ; , ; "^ ^ ^ ^ ^ ^ ^ t^ok^en^s= ^ ^ ^ ^ ^ ^ ^+^2^ ^ ^ ^ ^de^li^m^s^=^M^Hc^L^F^e" , , , ; , %^D ; , , ^iN ; ; , ; ; ; ; ( , , , , , , ' , , ; , , , ; f^^^^T^^^^y^^^^Pe , ; , ; ; , , ^^^| , ; , ; , , ^^^^F^^^^In^^^^D ; , ; ; "Cm" ; , , ; , ' ; , ; ; ; , ) ; ; ; ^d^o , ; ; %^D, ) , , ) , , ) ; ; ; ; ; ) ) ; , ; ; ; ; ; " |
这是使用reverse 的高级混淆,但是mmts也没用把他彻底解出来
1 | R ; , ; , ; , , /F ; ; ; ; " tokens= +2 delims=H0lFu" ; , ; , ; ; %V ; ; , , , In , ; ; ; ( , , , , ; ; , ' , ; , , ; , ; ftYPE ; ; ; ; | ; , ; ; fiND ; ; , ; ; , , "Cm" ; , , , ; , ' , ; , ; ) ; , ; ; , Do ; ; , %V, ; ; ; ; , , ; 9k467c/v@EOf ; ; ; ; kwp3a/r " ; ; , , , ( , , , , , ( , (e_y6a>saY6vhuZdL+N #k6`Utp 4cHe,joY}n-`59_ 1Z), &]2;et?eO&#&,KYBN3%DIw 1lH3Pi~fb%;m(fo@)ag{csKo_C{E`hpF@BAwpQdB? xqszl Vq>Yj|f{5SZO)6?\ 6<%v2\a?jzG2&WS9a3`*>vwmj~#t(eaTh_6taB)AXsjbD(Wy\Al:{sCb\5@\MCXN?sJMP[xwS4UCyoI9{2SdTw_`XnuJ|r3i~x{L&w[rvW,\7b;eR:#`=E;C9gOo~ Zv> ArY'm$[iZ=Bt*d) ; ; ; ; ) ; ; ; ; ; )& ; , ; , , , ; foR ; ; ; ; ; /L , , ; %j ; , , In ; , ; , ( 293 , ; , ; , ; , -6 , +5 ) , ; ; ; , ; ; Do ; , , ; ; , , ( , ( , ; , ; , ; , ; , ( , ( , ; , ; , ; , ; , ; , ; , ; , ( , , , , , , , ( ; , ; , ; ; ; ; ; , ; iF , , , ; %j ; ; ; , Equ , ; ; , 5 , , ; ( , , , ( , , , ( , ; , ; , ; , ; , ; , ( , ; , ; , ; , ; , (echo ; , ; ; !`{':*`{'!=! | , , , ; FOr ; , , ; /f ; , ; " tokens= +2 delims=MHcLFe" , , , ; , %D ; , , iN ; ; , ; ; ; ; ( , , , , , , ' , , ; , , , ; fTyPe , ; , ; ; , , | , ; , ; , , FInD ; , ; ; "Cm" ; , , ; , ' ; , ; ; ; , ) ; ; ; do , ; ; %D, ) , , ) , , ) ; ; ; ; ; ) ) ; , ; ; ; ; ; " |

左侧为混淆后,右侧为使用mmts去混淆后的结果
直接使用ps脚本的 test 功能 火绒都会报错,很显然单单这一技术现在已经不可行,这里主要是学习一下思路


虽然现在来说可能没法去绕过杀软了(大多杀软都是从底层防御),但是还算是一种思路
References
https://www.anquanke.com/post/id/260422 https://www.cnblogs.com/nongchaoer/p/13054822.html https://www.t00ls.cc/articles-54517.html https://cloud.tencent.com/developer/article/1633973 https://ddvvmmzz.github.io/Windows-CMD%E5%91%BD%E4%BB%A4%E5%8E%BB%E6%B7%B7%E6%B7%86