
Mallet ist ein Abfangproxy für beliebige Protokolle.
Mallet ist ein Tool zur Erstellung von Proxys für beliebige Protokolle, ähnlich wie die bekannten abfangenden Web-Proxys, nur allgemeiner.
Es basiert auf dem Netty-Framework und nutzt stark das Netty-Pipeline-Konzept, das die grafische Zusammenstellung von Handler-Graphen ermöglicht. (Siehe Screenshots unten für ein Beispiel.) In der Netty-Welt übernehmen Handler-Instanzen die Rahmenabgrenzung (d.h. wo eine Nachricht beginnt und endet), die Protokoll-Decodierung und -Encodierung (Umwandlung eines Bytestroms in Java-Objekte und zurück oder Umwandlung eines Bytestroms in einen anderen Bytestrom - denken Sie an Komprimierung und Dekomprimierung) sowie höhere Logik (tatsächlich etwas mit diesen Objekten tun).
Durch die sorgfältige Trennung von Codecs und Handlern, die die Nachrichten tatsächlich manipulieren, kann Mallet von der großen Bibliothek vorhandener Codecs profitieren und die Neuimplementierung vieler Protokolle vermeiden. Das letzte Puzzlestück wird von einem Handler bereitgestellt, der auf einer Pipeline empfangene Nachrichten in eine andere Pipeline kopiert und diese Nachrichten an ihr endgültiges Ziel weiterleitet.
Natürlich können die Nachrichten, solange sie sich in Mallet befinden, leicht manipuliert werden, entweder mit benutzerdefinierten Handlern, die in Java oder einer JSR-223-konformen Skriptsprache geschrieben sind, oder manuell mit einem der bereitgestellten Editoren.
Sie können sich einen Überblick über die verfügbaren Codecs verschaffen, indem Sie sich den Netty-Quellcode auf GitHub in den Verzeichnissen codec* ansehen. Oder indem Sie einfach nach netty und dem gewünschten Protokoll googeln. Viele interessante Protokollimplementierungen wurden außerhalb des Kern-Netty-Projekts entwickelt, sollten aber dennoch gut mit Mallet funktionieren.
Mallet richtet sich an Personen, die mit vernetzten Anwendungen arbeiten, die nicht auf HTTP-Kommunikation basieren. Beispiele könnten das Internet der Dinge sein, das MQTT, COAP usw. verwenden könnte, Geldautomaten und Point-of-Sale-Geräte, die ISO8583 verwenden könnten, oder, um ehrlich zu sein, jedes andere Protokoll.
Tatsächlich kann Mallet sogar für HTTP-basierte Anwendungen nützlich sein, die zusätzliche Protokolle innerhalb von HTTP verwenden. Zum Beispiel Google Protobuf über WebSockets, die von bestehenden HTTP-Proxys wie Burp, Zap usw. nicht gut unterstützt werden, oder gRPC über HTTP2.
Mallet ist nicht unbedingt nur für Sicherheitsüberprüfungen gedacht. Da Mallet auf dem Netty Framework aufbaut, können Sie Ihren Code, nachdem Sie Ihre Pipeline mit Mallet prototypisiert haben, mit sehr geringem Aufwand in eine reine Netty-Anwendung migrieren.
Dies ist ein Beispiel für einen einfachen SOCKS-Proxy, der als erster Schritt zum Verständnis des Netzwerkverkehrs verwendet werden kann.

Sobald Sie eine Vorstellung davon haben, wie der Verkehr tatsächlich aussieht, können Sie beginnen, entsprechende ChannelHandler-Klassen entlang der Pipeline hinzuzufügen.
Mallet verwendet Maven, daher ist das Kompilieren des Codes eine Sache von
mvn package
Um es auszuführen:
cd target/
java -jar mallet-1.0-SNAPSHOT-spring-boot.jar
Es gibt einige Beispielgraphen im Verzeichnis examples/. Die JSON-Graphen erwarten, dass ein JSON-Client eine Verbindung zu Mallet auf localhost:9998/tcp herstellt, wobei der eigentliche Server auf localhost:9999/tcp läuft. Nur der letzte JSON-Graph (json5.mxe) trifft Annahmen über die Struktur der übertragenen JSON-Nachrichten, daher sollten sie auf jede App anwendbar sein, die JSON-Nachrichten sendet.
Die Datei demo.mxe zeigt einen komplexen Graphen mit zwei Pipelines, sowohl TCP als auch UDP. Die TCP-Pipeline ist so aufgebaut, dass sie HTTP und HTTPS auf den Ports 80 bzw. 443 sowie WebSockets unterstützt, während andere Datenverkehr direkt an sein Ziel weitergeleitet wird. Die UDP-Pipeline ist so aufgebaut, dass sie DNS-Anfragen auf localhost:1053/udp verarbeitet, Anfragen für google.com durch Anfragen für www.sensepost.com ersetzt und die Anfragen an Google-DNS-Server weiterleitet.
Feedback und Beiträge sind willkommen. Bitte erstellen Sie bei Bedarf Issues oder kontaktieren Sie den Autor auf Twitter @RoganDawes.