介绍
- 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'