内网防御规避(二)-命令行混淆

命令行通常是杀软检测比较严格的地方,比如一些被滥用的命令就会被杀软重点关注,比如:rundll32、powershell、certutil等等。当我们使用命令行混淆时,可以适当的规避某些杀软的检测规则,达到我们执行命令的目的。

0x00 前言

命令行通常是杀软检测比较严格的地方,比如一些被滥用的命令就会被杀软重点关注,比如:rundll32、powershell、certutil等等。当我们使用命令行混淆时,可以适当的规避某些杀软的检测规则,达到我们执行命令的目的。

0x01 环境变量

环境变量的基本用法是使用set对变量进行赋值,然后可以直接使用赋值后的变量进行直接调用。

查看环境变量

1
set

我们可以看到我们当前系统的环境变量。

设置环境变量

1
set a=powershell

该方法可以用与静态检测绕过,要对其进行日志监测还需要装sysmon。

0x02 双引号

双引号没有什么特殊的含义,它可以帮助文件或目录保持一个整体,而不会被中间的空格所切割。

一个简单的例子就是目录名中间有空格

利用方法

我们可以在敏感的文件名中插入双引号,从而规避杀软。

1
power"""""""""""""""""""""""""""""""""shell

0x03 转义符

转义符(^)也可以做为切割文件名的一个符号,但是该符号不能够连续输入。

转义符也可以作为一个换行

0x04 垃圾分隔符

先来了解一下管道,通过管道结合cmd我们可以执行前者。

1
echo calc | cmd

结合环境变量,再引入@符,可以发现仍然能够执行。

1
cmd /c "set x=c@alc & echo %x:@=% | cmd"

理解一下@符的作用,@符能够将值传递到前面的环境变量中,如:

1
cmd /c "set x=c@alc & echo %x:@=test% | cmd"

这就可以将test传到c@alc的@位置,输出将是ctestalc。

0x05 字符串提取

cmd中也可以通过环境变量的方式进行变量值的字符串提取。

如:set a=abcd,要想提取里面的某个字符串,可以通过:

1
%a:~0,1%

其中0表示从第几位开始提取,1表示提取几个字符串。

所以,我们可以这样去执行一个计算器。

1
set a=abcd & %a:~2,1%alc

0x06 循环语句查找

我们也可以通过for循环去查找我们所要的字符串执行,可以避免在命令行输入特殊的字符。

首先要说明for循环的几个参数及语句的意义。

1
2
3
1.for /f "条件" in "范围"
2.tokens表示第几列
3.delims表示切割符,可输入多个切割符

完整语句:
FOR /F “tokens=4 delims=\“ %g IN (“c:\windows\system32\powershell\”) do %g

从”c:\windows\system32\powershell”中以反斜杠为分隔符,提取第四列的字符串并执行。当然我们可以从文件名、目录名、文件中、环境变量中去读取数据,这样我们需要的字符串就都能够提取到。

也可以写一个字典,通过字典里面的字符串进行拼接传入环境变量,最终执行环境变量里面的参数。

0x07 逗号与分号

逗号与分号某些情况可以当作一个终止符号或者代替空格。

0x08 混合使用

以上的方法有许多都可以混合使用,比如转义符与双引号的方法

1
2
c^"^"^"^"^"^"^"^"md
ca^"^"^"^"^"^"^"^"^"^"^lc

我们再来利用,如果检测到了一个转义符一个双引号,那我们还可以绕过吗?

仍旧可以,我们要知道在语句中,我们的转义符可以输入两次,而不是命令行中的一次。

1
cmd /c "set x=c@alc & echo %x:@=^^"^^"^^"^^"%| cmd"

第一个转义符转义环境变量里的值,第二个转义符转义输出环境变量的值

0x09 后语

熟悉了命令行混淆后我们在后渗透当中,碰到EDR、某些杀软的时候可以采用混淆的方式执行命令,这将使我们的命令不容易被检测,由于混淆的多样性,检测规则不可能十全十美,我们可以通过平时的fuzz积累,在实战环境中便可以很好的达到我们的目的。

Author: rootrain
Link: https://rootrain.me/2020/02/29/内网防御规避(二)-命令行混淆/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.