【免杀】PowerShell免杀(一)

最近在看免杀

0x00 代码块

可以使用PowerShell的一个语言特性做通用免杀,那就是代码块(即ScriptBlock)。

代码块是一段可以被执行的PowerShell代码,通常是把代码块直接放在闭合的大括号中,类似函数function,带上代码块更加灵活,可以作为函数参数传递,也可以动态生成和调用。若想在PowerShell中动态创建代码块,首先得知道如何将一段字符串换成代码块对象。

1
$scriptblock = [SriptBlock]::Create('notepad')

先是字符串,然后转换成代码块对象,当然这个字符串也可以是变量。

调用方法:

1
2
3
4
5
Invoke-Command $scriptblock
或者可以直接
Invoke-Command -ScriptBlock ([ScriptBlock]::Create('notepad'))
代码块操作操作符(&)
&$scriptblock

0x01 加解密

先对家吗进行加密,再加密执行

说到加密,最先想到的就是base64的编码加密了,既然容易想到,那就容易被杀。实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$str = "RcoIl"
# $str = [System.IO.File]::ReadAllText("C:\Users\allen\Desktop\payload.ps1");
$bytes = [System.Text.Encoding]::Ascii.GetBytes($str) # 编码方式变一下也无所谓
$encode = [Convert]::ToBase64String($bytes) # 加密
$encode.Substring(0)

$decode =[Convert]::FromBase64String($encode); #解密
$byte = [System.Text.Encoding]::Ascii.GetString($decode)
$byte.Substring(0)

运行结果:
PS C:\Users\allen\Desktop> .\demo.ps1
UmNvSWw=
RcoIl

加上异或

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$str = "RcoIl"
$bytes = [System.Text.Encoding]::Ascii.GetBytes($str)
for($i=0; $i -lt $bytes.count; $i++) {
$bytes[$i] = $bytes[$i] -bxor 0x98 # 异或
}
$encode = [Convert]::ToBase64String($bytes) # 加密
$encode.Substring(0)

$decode =[Convert]::FromBase64String($encode); #解密
for($i=0; $i -lt $decode.count; $i++) {
$decode[$i] = $decode[$i] -bxor 0x98 # 异或
}
$byte = [System.Text.Encoding]::Ascii.GetString($decode)
$byte.Substring(0)

运行结果:
PS C:\Users\allen\Desktop> .\demo.ps1
ypj7mPeY0Zj0mA==
RcoIl

0x02 免杀效果

payload选择的是Cobalt Strike 3.8生成的payload.ps1
编译生成exe.

当然,在实际测试过程中并没有那么完美,至少没能绕过avp的行为查杀。

【参考】

https://www.peew.pw/blog/2017/12/4/writing-net-executables-for-penteters-part-2

!坚持技术分享,您的支持将鼓励我继续创作!