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继承和抽象类的实现方法
Jan 14 Python
Python 探针的实现原理
Apr 23 Python
Python第三方库的安装方法总结
Jun 06 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
Django model class Meta原理解析
Nov 14 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
python playwrigh框架入门安装使用
Jul 23 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
php检测图片木马多进制编程实践
2013/04/11 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python获取央视节目单的实现代码
2015/07/25 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
django celery redis使用具体实践
2019/04/08 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
广告语设计及教案
2014/03/21 职场文书
校园环保建议书
2014/05/14 职场文书
护士求职信
2014/07/05 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
布达拉宫导游词
2015/02/02 职场文书
2015年护士节活动总结
2015/02/10 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
春节随笔
2015/08/15 职场文书
计算机实训心得体会
2016/01/14 职场文书