0%

cmd命令混淆

现在杀软大都是底层防御,直接混淆cmd没啥用,这里的话主要是学一下思路

CMD命令符号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@:隐藏命令的回显。
~:变量扩展或者扩展环境变量指定位置的字符串。
%:引用环境变量或者单个%表示引用命令行参数。
^:取消转义字符。
&:命令连接字符。
: 管道符,将上一个命令的输出,作为下一个命令的输入。
:: 标签符,接受goto命令所指向的标签。
”“:界定符,使用带有空格的路径时用”“将路径括起来。
/: 其后的字符是命令的功能开关。
>: 命令重定向符,输入在前,输出在后,覆盖之前的内容。
>>: 命令重定向符。输入在前,输出在后,不覆盖之前的内容。
<:将后面文件的内容输出到前面。
= :赋值符号,用于变量赋值。
\ :当前路径所在的根路径。
&& :连接两个命令,&&前的命令成功时,才执行&&后的命令。
:连接两个命令, 前的命令失败时,才执行 后的命令。
$:findstr命令中表示一行的结束。
``:for/f中表示它们所包含的内容当作命令行执行并分析它的输出。
!: 延迟变量,使用!!将变量名扩起来表示对变量值的引用。


大小写/特殊字符混淆

cmd中大小写不敏感 可以大小写执行命令

截图

特殊字符混淆

0x01 ^

^是cmd中常见的转义字符 不会影响命令的正常执行。

截图

0x02 ""拼接

截图

0x03 , ;替换空格

截图

但是这个插入net user不会成功

0x04 ()

截图



利用环境变量混淆

0x01

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

截图

cmd /c "string" 表示执行字符串string执行的命令 然后终止 可以通过 cmd /? 查看cmd下的详细命令)

1
2
C:\Users\TEST>cmd /c "set var1=ser&&set var2=ne&&set var3=t u&&call  %var2%%var3
%%var1%"
截图


记一个小坑

记一个小坑 set t="am" && who%t%i 多次执行只成功一次 不知道为什么..后续再运行 命令都失败了 直接echo %t% 得到为 "am" 截图

尝试了下 发现这里可以不用去加双引号空格这类的 不然会被分隔开 但是第一次能执行也不知道是为啥,但是后面使用call 便可以执行环境变量的命令

0x02 cmd /V:ON 启用延迟环境变量拓展

当启用 /V:ON 后 使用 %var%!var!来扩展变量,!var!可以用来代替%var%

1
2
3
4
cmd /c "set var1=ser&&set var2=ne&&set var3=t u&&call  %var2%%var3
%%var1%"
cmd /V:ON /c "set var1=ser&&set var2=ne&&set var3=t u&&call !var2
!!var3!!var1!
截图

0x03 通过截取环境变量

通过set 查看当前的环境变量

%comspec% 值的结果为 C:\Windows\system32\cmd.exe

可以通过截取后面部分去调用cmd 格式为%VarName:~offset[,length]% 然后就可以根据环境变量去拼接出想要执行的命令


使用for循环拼接命令

cmd中除了set命令歪 还有 ftype、assoc等命令

assoc 文件名拓展关联命令

assoc /?

1
2
3
4
5
6
7
8
9
10
显示或修改文件扩展名关联

ASSOC [.ext[=[fileType]]]

.ext 指定跟文件类型关联的文件扩展名
fileType 指定跟文件扩展名关联的文件类型

键入 ASSOC 而不带参数,显示当前文件关联。如果只用文件扩展
名调用 ASSOC,则显示那个文件扩展名的当前文件关联。如果不为
文件类型指定任何参数,命令会删除文件扩展名的关联。

ftype /?

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

截图


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

截图

for 循环在混淆时是一种较为复杂的方式通常会使用 /F 和 /L 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FOR /L %variable IN (start,step,end) DO command [command-parameters]

该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列12345,(5,-1,1)将产生序列(54321)

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]

delims=xxx 用xxx进行分割字符串
delims=f= 用f与= 进行分割字符串
tokens=x,y,m-n
tokens=2 选择分割后的第二段
usebackq

for /f " delims=f= tokens=2" %f IN ( 'assoc .cmd' ) do %f
assoc .cmd 返回结果为 .cmd=cmdfile
delims=f= 会使用f和=进行分割 分成3部分 .cmd cmd file
tokens=2 会选择第二部分 即cmd
所以该命令执行后会去调用cmd


FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会枚举当前环境中的环境变量名称



利用混淆工具

https://github.com/danielbohannon/Invoke-DOSfuscation

需要powershell管理员权限下去运行

1
2
3
Set-ExecutionPolicy Unrestricted
Import-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation
  • 使用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

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------