Mallet 是一个用于创建任意协议代理的工具,其思路类似于常见的拦截式 Web 代理,但更加通用。
它基于 Netty 框架构建,并严重依赖 Netty 的管道概念,该概念允许以图形方式组装处理器图。(示例见下方截图。)在 Netty 世界中,处理器实例提供帧定界(即消息的起始和结束位置)、协议解码与编码(将字节流转换为 Java 对象,反之亦然,或将字节流转换为不同的字节流——例如压缩与解压缩),以及更高级别的逻辑(实际对这些对象进行操作)。
通过将编解码器(Codecs)与实际操作消息的处理器(Handlers)仔细分离,Mallet 可以受益于现有的大量编解码器库,避免重复实现许多协议。这个谜题的最后一块由一个处理器提供,它将一个管道上接收的消息复制到另一个管道,将这些消息代理到最终目的地。
当然,当消息在 Mallet 内部时,可以轻松篡改它们,无论是使用用 Java 或符合 JSR-223 的脚本语言编写的自定义处理器,还是使用提供的编辑器手动操作。
您可以通过查看 GitHub 上的 Netty 源代码,在 codec* 目录下了解可用的编解码器。或者只需在搜索引擎中搜索 netty 和您感兴趣的协议。许多有趣的协议实现已在核心 Netty 项目之外开发,但仍应与 Mallet 良好配合。
Mallet 面向那些处理非基于 HTTP 通信的网络应用程序的人员。例如物联网(可能使用 MQTT、COAP 等)、ATM 和销售点设备(可能使用 ISO8583),或者坦率地说,任何其他协议。
事实上,Mallet 甚至可能对基于 HTTP 的应用程序有用,这些应用程序在 HTTP 内部使用其他协议。例如,通过 WebSocket 传输的 Google Protobuf(现有的 HTTP 代理如 Burp、Zap 等对此支持不佳),或基于 HTTP2 的 gRPC。
Mallet 不一定仅用于安全审查。由于 Mallet 构建在 Netty 框架 之上,一旦您使用 Mallet 原型化了管道,您可以非常轻松地将代码迁移到普通的 Netty 应用程序中。
这是一个简单 SOCKS 代理的示例,可用作理解您看到的网络流量的第一步。

一旦您对流量实际形态有了概念,就可以开始在管道中添加适当的 ChannelHandler 类。
Mallet 使用 Maven,因此编译代码只需:
mvn package
运行:
cd target/
java -jar mallet-1.0-SNAPSHOT-spring-boot.jar
examples/ 目录中提供了几个示例图表。JSON 图表期望一个 JSON 客户端连接到 localhost:9998/tcp 上的 Mallet,真实服务器位于 localhost:9999/tcp。只有最后一个 JSON 图表 (json5.mxe) 对传递的 JSON 消息结构做了假设,因此它们应适用于任何发送 JSON 消息的应用程序。
demo.mxe 显示了一个复杂图表,包含两条管道,分别用于 TCP 和 UDP。TCP 管道构建为支持 80 和 443 端口上的 HTTP 和 HTTPS,以及 WebSocket,同时将其他所有流量直接中继到其目的地。UDP 管道构建为处理 localhost:1053/udp 上的 DNS 请求,将针对 google.com 的查询替换为针对 www.sensepost.com 的查询,并将请求转发到 Google DNS 服务器。
欢迎反馈和贡献。请在适当的地方创建 Issue,或通过 Twitter @RoganDawes 联系作者。