mitmproxy – 简洁多样的反向代理服务器

介绍

  • mitmproxy是一个以控制台界面形式的交互式的(HTTP和HTTPS)的中间人代理。
  • mitmdump是mitmproxy的命令行版本。可以认为是http的tcpdump
  • mitmweb是一个基于web界面的mitmproxy。
  • 文档,教程和发行包可以在mitmproxy网站上找到:mitmproxy.org

特征

  • 拦截HTTP和HTTPS请求和响应,并在运行中修改它们
  • 保存完整的HTTP会话以供以后重播和分析
  • 重放客户端上的HTTP对话
  • 重播以前记录的服务器的HTTP响应
  • 反向代理模式将流量转发到指定的服务器
  • 使用Python对HTTP流量进行脚本化更改
  • 用于拦截的SSL / TLS证书即时生成
  • 还有更多…

四大模式

  • Regular (the default)
    • 你需要自己设置监听端口从而让流量经过,且有些流量不会通过
  • Transparent 透明模式
    • 无需客户端自己设置,自动下到网络层抓取流量
    • 多用于无法改变客户端行为时
  • Reverse Proxy 反向代理
    • 使用反向代理模式,可以使用mitmproxy来像普通的HTTP服务器一样工作
    • 假设你有一个ssl支持的项目. 只需要这样设置 mitmdump -p 443 -R http://localhost:80/ Mitmproxy 会自动检测tls流量并且动态拦截。,有更好的工具可以实现 但是 mitmproxy 是建立ssl服务器的一种非常快速和简单的选择
  • Upstream Proxy 上游代理
    • 如果要通过在不同的代理设备前添加mitmproxy来链接代理,则可以使用mitmproxy的上游模式。在上游模式下,所有请求将无条件传输到您选择的上游代理。

脚本化定制

简单的实现抓取流量并丢弃的操作

from mitmproxy import http
from mitmproxy.script import concurrent
import time
import logging

class Logger:   # 一个日志对象
    def __init__(self):
        self.logger = logging.getLogger('mylogger')
        self.logger.setLevel(logging.DEBUG)

        self.fn = logging.FileHandler('text.txt')
        self.fn.setLevel(logging.DEBUG)

        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 日志输出格式
        self.fn.setFormatter(formatter)

        self.logger.addHandler(self.fn)

    def getlog(self, text):
        self.logger.info(text)

logger = Logger()


@concurrent   # 并发形式
def request(flow):# request是提供给我们的方法,这里flow 代表每一个http数据包的对象的集合

    request_ob = flow.request   # 这里返回的是 HTTPRequest 这个对象

    result = 0
    main_url = request_ob.path
    #检测

    if result == 0:
        full_text = '[+] url:' + request_ob.url +\
                    '  [+] header:' + str(request_ob.headers) +\
                    '  [+] body:' + str(request_ob.content)
        logger.getlog(full_text)
        flow.kill()
利用机器学习学习好的模型,来判断XSS
from mitmproxy import http
from mitmproxy.script import concurrent
import re
from sklearn.externals import joblib


# 下面的函数都是转化XSS-payload为特征的函数

def get_len(url):
    return len(url)

def get_url_count(url):
    if re.search('(http://)|(https://)', url, re.IGNORECASE):
        return 1
    else:
        return 0

def get_evil_char(url):
    return len(re.findall("[<>,\'\"/]", url, re.IGNORECASE))

def get_evil_word(url):
    return len(re.findall("(alert)|(script=)(%3c)|(%3e)|(%20)|(onerror)|(onload)|(eval)|(src=)|"
                          "(prompt)|(union)|(and)", url, re.IGNORECASE))

def get_last_char(url):
    if re.search('/$', url, re.IGNORECASE):
        return 1
    else:
        return 0

def deal(url):   # 将payload 转化为向量
    feature = []
    f1 = get_len(url)
    f2 = get_url_count(url)
    f3 = get_evil_char(url)
    f4 = get_evil_word(url)
    feature.append([f1, f2, f3, f4])
    return feature

clf = joblib.load('xss_model.m')  # 导入之前训练好的模型


@concurrent
def request(flow):
  request = flow.request
  main_url = request.path
  y_pred = clf.predict(deal(main_url))  
  if y_pred == 1:    # 如果为XSS,直接修改请问路径
    request.path = '/danger'

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据