广告位联系
返回顶部
分享到

Python抓包程序mitmproxy安装和使用

java 来源:互联网搜集 作者:秩名 发布时间:2020-03-02 16:56:00 人浏览
摘要

一、介绍说明 mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,只不过它是一个控制台的形式操作。 mitmproxy还有两个关联组件。一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处

一、介绍说明

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证书,如下图所示。

在windows平台下安装证书

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

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

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

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

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

在Android平台下安装证书

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

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

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

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

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

可以看到

?
1
2
Web server listening at http://127.0.0.1:8081/
Proxy server listening at <a href="http://*:8080" rel="external nofollow">http://*:8080</a>

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

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

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

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

三、mitmdump的使用

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

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

命令如下:

mitmdump -w outfile

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

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

mitmdump -s script.py

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

?
1
2
3
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提供了专门的日志输出功能,可以设定不同级别以不同颜色输出结果,我们可以把脚本修改成以下内容:

?
1
2
3
4
5
6
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其他常用的一些功能,如下:

?
1
2
3
4
5
6
7
8
9
10
11
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修改了,如下:‘

?
1
2
3
def request(flow):
url ='https://httpbin.org/get'
flow.request.url = url

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

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

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

4、响应的使用

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

?
1
2
3
4
5
6
7
8
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()方法获取每个请求的响应内容,然后再进行响应的信息提取和存储,我们就可以完成数据爬取啦!


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.cnblogs.com/pfeiliu/p/12306037.html
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计