java版mitmproxy,mitmproxt

Wesley13
• 阅读 818

mitmproxy作为一款出色中间人攻击工具,它在渗透、爬虫、ajax-hook、抓包等场景中表现的相当稳定和出色。但由于原生项目是python的缘故,使得跨语言使用mitmproxy显的非常吃力。经常借助于中间件或单独开发http服务来于mitmproxy进行通信。为此mitmproxy-java基于mitmproxy-hub实现了java版mitmproxy客户端。你可以像使用原生mitmproxy一样使用它。

原理介绍

mitmproxy-hub定义了其他任何语言可以生成的proto3序列化代码,借助于grpc高效的跨进程通信。使得其他语言可以对mitmproxy内部的流量进行无死角的监控。

java版mitmproxy,mitmproxt

为什么不直接使用browsermob-proxy、LittleProxy等java原生语言开发的mitm代理?

browsermob-proxy/LittleProxy对于高并发场景下的表现十分不稳定,而且在大文件传输上经常有内存溢出现象。主要是因为两个项目的作者均已在3年前就已经停止更新。本人猜想也许是看到mitmproxy太过于强大,没有继续发展下去的希望。就像google headless一出来phantomjs作者就停止更新一样。而mitmproxy在开源社区一直是高活跃项目,bug等问题修复及时。借用grpc远程控制mitmproxy是一种站在巨人的肩膀上的方法。

推荐环境

Mitmproxy: 5.3.0
Python:    3.6.8
OpenSSL:   OpenSSL 1.1.1h  22 Sep 2020
Platform:  Darwin-20.1.0-x86_64-i386-64bit

启动mitmproxy-hub

git clone https://github.com/CreditTone/mitmproxy-hub.git
cd mitmproxy-hub
python3 server.py //server on port 60051

maven集成mitmproxy-java

<dependency> <groupId>com.deep007</groupId> <artifactId>mitmproxy-java</artifactId> <version>1.0</version> </dependency>

启动一个remote mitmproxy

public static void main(String[] args) throws InterruptedException { //在远程机器上的8866端口上启动一个mitmproxy RemoteMitmproxy remoteMitmproxy = new RemoteMitmproxy("127.0.0.1", 60051, "127.0.0.1", 8866); remoteMitmproxy.start(); Thread.sleep(1000 * 60 * 5); remoteMitmproxy.stop(); }

监控网络流量

public static void main(String[] args) throws InterruptedException { RemoteMitmproxy remoteMitmproxy = new RemoteMitmproxy("127.0.0.1", 60051, "127.0.0.1", 8866); remoteMitmproxy.addFlowFilter(new FlowFilter() {

        @Override
        public void filterRequest(FlowRequest flowRequest) {
            System.out.println(flowRequest.getUrl());
        }
        
        @Override
        public void filterResponse(FlowResponse flowResponse) {
            FlowRequest flowRequest \= flowResponse.getRequest();
            System.out.println(flowRequest.getUrl() + " response length:" +flowResponse.getContent().length);
        }
        
    });
    remoteMitmproxy.start();
    Thread.sleep(1000 \* 60 \* 5);
    remoteMitmproxy.stop();

}

篡改网络响应

public static void main(String[] args) throws InterruptedException { RemoteMitmproxy remoteMitmproxy = new RemoteMitmproxy("127.0.0.1", 60051, "127.0.0.1", 8866); remoteMitmproxy.addFlowFilter(new FlowFilter() {

        @Override
        public void filterRequest(FlowRequest flowRequest) {
        }
        
        @Override
        public void filterResponse(FlowResponse flowResponse) {
            FlowRequest flowRequest \= flowResponse.getRequest();
            if (flowRequest.getUrl().startsWith("https://www.baidu.com")) {
                flowResponse.setContentAsString("就不让你访问百度,哈哈!");
            }
        }
        
    });
    remoteMitmproxy.start();
    Thread.sleep(1000 \* 60 \* 5);
    remoteMitmproxy.stop();

}

劫持cookie

public static void main(String[] args) throws InterruptedException { RemoteMitmproxy remoteMitmproxy = new RemoteMitmproxy("127.0.0.1", 60051, "127.0.0.1", 8866); CookieCollectFilter cookieCollectFilter = new CookieCollectFilter(); remoteMitmproxy.addFlowFilter(cookieCollectFilter); remoteMitmproxy.start(); Thread.sleep(1000 * 60 * 5); remoteMitmproxy.stop(); for (Cookie cookie : cookieCollectFilter.catchCookies) { System.out.println(cookie.getDomain() + ">>>"+ cookie.getName()+"="+cookie.getValue() +" path:"+cookie.getPath()); } }

有问题请留言谢谢!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
2年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Wesley13 Wesley13
2年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
2年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这