Python抓包程序mitmproxy安装和使用过程图解


Posted in Python onMarch 02, 2020

一、介绍说明

mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,只不过它是一个控制台的形式操作。

mitmproxy还有两个关联组件。一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求。

mitmproxy的功能:

1、拦截HTTP和HTTPS请求和响应

2、保存HTTP会话并进行分析

3、模拟客户端发起请求,模拟服务器端返回响应

4、利用反向代理将流量转发给指定的服务器

5、支持Mac和linux上的透明代理

6、利用Python对HTTP请求与响应进行实时处理

mitmproxy运行与自己的PC上,在PC的8080端口运行,然后开启一个代理服务,这个服务实际上是一个HTTP/HTTPS的代理。

手机和PC在一个局域网内,设置代理是mitmproxy的代理地址,这样手机在访问互联网的时候流量数据包就会流经mitmproxy,mitmproxy再去转发这些数据包到真实的服务器,服务器返回数据包时再由mitmproxy转发回手机,这样mitmproxy就相当于起了中间人的作用,抓取到所有request和response,另外这个过程还可以对接mitmproxy,抓取到的request和response的具体内容都可以直接用python来处理,比如:得到response之后我们可以直接进行解析,然后存入数据库,这样就完成了数据的解析和存储过程。

二、安装以及配置

pip install mitmproxy

如果安装失败报错timeout,那就多试几遍或者加上参数--timeout秒数

pip --timeout 10000 install mitmproxy

注意 :在 Windows 上不支持 mitmproxy 的控制台接口,但是可以使用 mitmdump和mitmweb。

这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。

mitmproxy命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据。

mitmweb命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据。

mitmdump命令启动后,没有界面,程序默默运行,所以 mitmdump 无法提供过滤请求、查看数据的功能,只能结合自定义脚本,默默工作。

证书配置

运行mitmdump命令产生CA证书,并在用户目录下的.mitmproxy 目录里面找到CA证书,如下图所示。

Python抓包程序mitmproxy安装和使用过程图解

在windows平台下安装证书

点击mitmproxy-ca.p12,就会出现导入证书的引导页,如下图所示:

Python抓包程序mitmproxy安装和使用过程图解

然后直接点击下一步即可,如果不需要设置密码,继续点击下一步。

接下来需要选择证书的存储区域,如下图所示。

Python抓包程序mitmproxy安装和使用过程图解

这里点击第二个选项“将所有的证书都放入下列存储”,然后点击“浏览”按钮,选择证书存储位置为 受信任的根证书颁发机构”,接着点击“确定”按钮,然后点击“下一步”按钮。

最后,如果有安全警告弹出,直接点击“是”按钮即可。这样就完成了CA证书的配置了。

在Android平台下安装证书

在Android手机上,需要将mitmproxy-ca-cert.pem文件发送到手机上,接下来点击证书会出现一个提示窗口。

如果手机不能识别.pem文件,那就将.cer文件复制到手机,然后点击安装证书。

这时候输入证书名称,例如:mitmproxy,然后点击确定则完成了安装。

安卓手机还有一种方法安装证书

命令行输入ipconfig查看本机IP,并输入mitmweb启动mitmproxy

可以看到

Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8080

所以可以确定,我们代理IP端口号为8080,于是,在手机Wifi设置手动代理,输入本机IP和端口号8080。此时,打开mitmproxy界面并操作手机,可以看到手机请求信息:

Python抓包程序mitmproxy安装和使用过程图解

此时在手机端打开http://mitm.it/,可以进入到如下界面:(如果没有进入如下界面,请检查手机端代理IP和端口号是否输入正确!)

Python抓包程序mitmproxy安装和使用过程图解

选择第一个进行证书安装,有时网络不好,可能页面一直没有响应。我就遇到这样的问题,最后,多试几次,就可以进入证书安装界面。

成功安装证书后,Go to Settings > General > About > Certificate Trust Settings.
Under “Enable full trust for root certificates”, turn on trust for the mitmproxy certificate.

Python抓包程序mitmproxy安装和使用过程图解

三、mitmdump的使用

mitmdump是mitmproxy的命令行接口,同时还可以对接Python对请求进行处理,这是相对于fiddler和Charles这些工具更加方便的地方,有了它我们可以不用手动截获和分析HTTP请求和响应,只需要写好请求与响应的处理逻辑即可。它还可以实现数据的解析、存储等工作,这些过程都可以通过Python来实现。

1、我们可以使用命令启动mitmproxy,并把截获的数据保存到文件中

命令如下:

mitmdump -w outfile

其中outfile的名称任意,截获的数据都会被保存到此文件中。

还可以指定一个脚本来处理截获的数据,使用-s参数即可

mitmdump -s script.py

这里指定了当前处理脚本为script.py,它需要放置在当前命令执行的目录下。
我们可以在脚本里写入如下的代码:

def request(flow) : 
   flow.request.headers['User-Agent'] = 'MitmProxy' 
   print(flow.request.headers)

我们定义了 一个request ()方法,参数为 flow ,它其实是一个 HTTP Flow 对象,通过 request 属性即可获取到当前请求对象 。然后打印输出了请求的请求头,将请求头的 User-Agent 改成了MitmProxy。运行之后在手机端访问 http: //httpbin.org get 。

手机端返回结果的 Headers 实际上就是请求的 Headers, User-Agent 被修改成了 mitmproxy ,PC控制台输出了修改后Headers 内容,其 User-Agent 的内容正是 mitmproxy。所以,通过这上面三行代码我们就可以完成对请求的改写。

print()方法输出结果可以呈现在 PC 端控制台上,可以方便地进行调试。

2、日志的输出

mitmdump提供了专门的日志输出功能,可以设定不同级别以不同颜色输出结果,我们可以把脚本修改成以下内容:

from mitmproxy import ctx 
def request(flow): 
   flow .request . headers['User-Agent'] ='mitmProxy'
   ctx.log.info(str(flow.request.headers)) 
   ctx.log.warn(str(flow.request.headers)) 
   ctx.log.error(str(flow.request.headers))

在这里调用了ctx模块,它有一个log功能,调用不同的输出方法就可以输出不同颜色的结果,以方便我们做调试。例如:info()方法输出的内容是白色的,warn()方法输出的内容是黄色的,error()方法输出的内容是红色的。

不同的颜色对应不同级别的输出,我们可以将不同的结果合理划分级别输出,以更直观方便地查看调试信息。

3、request的使用

我们在上面也实现了request()方法并且对Headers进行了修改。下面我们介绍下request其他常用的一些功能,如下:

from mitmproxy import ctx 
def request(flow):
request = flow.request 
info = ctx.log.info 
info(request.url) 
info(str(request.headers)) 
info(str(request.cookies)) 
info(request.host) 
info(request.method) 
info(str(request.port)) 
info(request.scheme)

在手机上打开百度,就可以看到pc端控制台输出了一系列的请求,在这里我们找到第一个请求。控制台打印输出了request的一些常见的属性,如URL、headers、cookies、host、method、scheme即请求链接、请求头、请求cookies、请求host、请求方法、请求端口、请求协议这些内容。

同时我们还可以对任意属性进行修改,就像最初修改headers一样,直接赋值即可,例如把请求的URL修改了,如下:‘

def request(flow): 
url ='https://httpbin.org/get' 
flow.request.url = url

我们只需要用简单的脚本就可以成功把请求修改为其他的站点,通过这种方式修改和伪造请求就变得很容易。

通过这个例子我们也可以知道,有时候URL虽然是正确的,但是内容并非是正确的,我们需要进一步提高自己的安全防范意识。

所以我们能很容易地获取和修改request的任意内容,比如:可以用修改cookies、添加代理的方式来规避反爬。

4、响应的使用

对于爬虫来说,我们会更加关心响应的内容,因为response body才是爬取的结果。对于响应来说,mitmdump也提供了对应的处理接口,就是response()方法。

from mitmproxy import ctx 
def response(flow): 
response = flow.response 
info = ctx.log.info
inf(str(response.status_code))
info(str(response.headers)) 
info(str(response.cookies)) 
info(str(response .text))

在这里打印输出了响应的状态码status_code、响应头headers、cookies、响应体text这几个属性,其中最重要的是text属性也就是网页的源代码。

通过response()方法获取每个请求的响应内容,然后再进行响应的信息提取和存储,我们就可以完成数据爬取啦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
下载糗事百科的内容_python版
Dec 07 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
全面理解Python中self的用法
Jun 04 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
opencv python 图像去噪的实现方法
Aug 31 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
flask框架中的cookie和session使用
Jan 31 Python
Python数据类型最全知识总结
May 31 Python
python实现简单的聊天小程序
Jul 07 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 #Python
python3实现往mysql中插入datetime类型的数据
Mar 02 #Python
python3将变量写入SQL语句的实现方式
Mar 02 #Python
Python *args和**kwargs用法实例解析
Mar 02 #Python
Python通过2种方法输出带颜色字体
Mar 02 #Python
Python实现屏幕录制功能的代码
Mar 02 #Python
python实现录屏功能(亲测好用)
Mar 02 #Python
You might like
我的论坛源代码(一)
2006/10/09 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
[JS]点出统计器
2020/10/11 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
python读取Excel表格文件的方法
2019/09/02 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
出纳岗位职责范本
2013/12/01 职场文书
大学生自荐书范文
2015/03/05 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python
pycharm无法安装cv2模块问题
2022/05/20 Python