
Mallet è un proxy di intercettazione per protocolli arbitrari.
Mallet è uno strumento per creare proxy per protocolli arbitrari, simile ai familiari proxy web di intercettazione, ma più generico.
È costruito sul framework Netty e si basa fortemente sul concetto di pipeline di Netty, che permette l'assemblaggio grafico di grafi di handler. (Vedi Screenshot più avanti per un esempio.) Nel mondo Netty, le istanze di handler forniscono delimitazione dei frame (cioè dove inizia e finisce un messaggio), decodifica e codifica del protocollo (convertire un flusso di byte in oggetti Java e viceversa, o convertire un flusso di byte in un flusso di byte diverso - pensa a compressione e decompressione), e logica di livello superiore (effettivamente fare qualcosa con quegli oggetti).
Seguendo la attenta separazione dei Codec dagli Handler che effettivamente manipolano i messaggi, Mallet può beneficiare della vasta libreria di Codec esistenti, evitando la reimplementazione di molti protocolli. L'ultimo pezzo del puzzle è fornito da un Handler che copia i messaggi ricevuti su una pipeline a un'altra pipeline, inoltrando quei messaggi alla loro destinazione finale.
Naturalmente, mentre i messaggi sono all'interno di Mallet, possono essere facilmente manomessi, sia con Handler personalizzati scritti in Java o un linguaggio di scripting conforme a JSR-223, sia manualmente, utilizzando uno degli editor forniti.
Puoi farti un'idea dei codec disponibili guardando il sorgente Netty su GitHub, nelle directory codec*. O semplicemente cercando su google netty e il protocollo che ti interessa. Molte implementazioni interessanti di protocolli sono state sviluppate al di fuori del progetto Netty principale, ma dovrebbero comunque funzionare bene con Mallet.
Mallet è pensato per persone che lavorano con applicazioni di rete che non si basano su comunicazioni HTTP. Esempi potrebbero essere l'Internet delle Cose, che potrebbe usare MQTT, COAP, ecc., sportelli bancomat e dispositivi POS che potrebbero usare ISO8583, o, onestamente, qualsiasi altro protocollo.
In effetti, Mallet può essere utile anche per applicazioni basate su HTTP, che utilizzano protocolli aggiuntivi all'interno di HTTP. Ad esempio, Google Protobuf su WebSocket, che non sono ben supportati dai proxy HTTP esistenti come Burp, Zap, ecc., o gRPC su HTTP2.
Mallet non è necessariamente solo per revisioni di sicurezza. Poiché Mallet è costruito sopra il Netty Framework, una volta che la tua pipeline è stata prototipata usando Mallet, puoi migrare il tuo codice in una semplice applicazione Netty con pochissimo sforzo.
Questo è un esempio di un semplice proxy SOCKS, che può essere usato come primo passo per capire il traffico di rete che stai vedendo.

Una volta che hai un'idea di come appare effettivamente il traffico, puoi iniziare ad aggiungere classi ChannelHandler appropriate lungo la pipeline.
Mallet utilizza Maven, quindi compilare il codice è una questione di
mvn package
Per eseguirlo:
cd target/
java -jar mallet-1.0-SNAPSHOT-spring-boot.jar
Ci sono alcuni grafi campione forniti nella directory examples/. I grafi JSON si aspettano che un client JSON si connetta a Mallet su localhost:9998/tcp, con il server reale su localhost:9999/tcp. Solo l'ultimo grafo JSON (json5.mxe) fa supposizioni sulla struttura dei messaggi JSON scambiati, quindi dovrebbero essere applicabili a qualsiasi app che invii messaggi JSON.
Il demo.mxe mostra un grafo complesso, con due pipeline, sia TCP che UDP. La pipeline TCP è costruita per supportare HTTP e HTTPS rispettivamente sulle porte 80 e 443, oltre a WebSocket, mentre inoltra qualsiasi altro traffico direttamente alla sua destinazione. La pipeline UDP è costruita per elaborare richieste DNS su localhost:1053/udp, sostituire le query per google.com con query per www.sensepost.com e inoltrare le richieste ai server DNS di Google.
Feedback e contributi sono benvenuti. Per favore, crea issue dove appropriato, o contatta l'autore su Twitter @RoganDawes.