
Malletは、任意のプロトコル用のインターセプティングプロキシです。
Malletは、任意のプロトコル用のプロキシを作成するツールです。おなじみのインターセプトWebプロキシと同様の考え方ですが、より汎用的です。
Nettyフレームワーク上に構築されており、Nettyのパイプライン概念に大きく依存しています。これにより、ハンドラーのグラフをグラフィカルに組み立てることができます。(例については、下のスクリーンショットを参照してください。)Nettyの世界では、ハンドラーインスタンスがフレームの区切り(メッセージの開始と終了)、プロトコルのデコードとエンコード(バイトストリームをJavaオブジェクトに変換したり、その逆を行ったり、バイトストリームを別のバイトストリームに変換する - 圧縮と解凍など)、およびより高度なロジック(実際にそれらのオブジェクトで何かを行う)を提供します。
Malletは、実際にメッセージを操作するハンドラーからコーデックを注意深く分離することで、既存の膨大なコーデックライブラリを活用し、多くのプロトコルの再実装を回避できます。最後のピースは、あるパイプラインで受信したメッセージを別のパイプラインにコピーし、それらのメッセージを最終的な宛先にプロキシするハンドラーによって提供されます。
もちろん、メッセージがMallet内にある間は、JavaまたはJSR-223準拠のスクリプト言語で書かれたカスタムハンドラーを使用して、または提供されているエディターのいずれかを使用して手動で、簡単に改ざんできます。
利用可能なコーデックの概要は、GitHubのNettyソース、codec*ディレクトリを参照することで得られます。または、nettyと興味のあるプロトコルをGoogle検索するだけでも構いません。多くの興味深いプロトコル実装がNettyコアプロジェクトの外部で開発されていますが、それらはMalletでも問題なく動作するはずです。
Malletは、HTTP通信に基づかないネットワークアプリケーションを扱う人々を対象としています。例としては、MQTT、COAPなどを使用する可能性のあるモノのインターネット、ISO8583を使用する可能性のあるATMやPOS端末、あるいは正直なところ、他の任意のプロトコルが考えられます。
実際、Malletは、HTTP内で追加のプロトコルを使用するHTTPベースのアプリケーションにも役立つ可能性があります。例えば、Burp、Zapなどの既存のHTTPプロキシでは十分にサポートされていないWebSocket上のGoogle Protobuf、またはHTTP2上のgRPCなどです。
Malletは必ずしもセキュリティレビューのためだけではありません。Netty Framework上に構築されているため、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の両方の2つのパイプラインを持つ複雑なグラフを示しています。TCPパイプラインは、ポート80と443でそれぞれHTTPとHTTPS、およびWebSocketをサポートし、その他のトラフィックは直接宛先に中継するように構築されています。UDPパイプラインは、localhost:1053/udpでDNSリクエストを処理し、google.comへのクエリをwww.sensepost.comへのクエリに置き換え、リクエストをGoogle DNSサーバーに転送するように構築されています。
フィードバックと貢献を歓迎します。適切な場合はIssueを作成するか、Twitter @RoganDawesで作者に連絡してください。