
Mallet — это перехватывающий прокси для произвольных протоколов.
Mallet — это инструмент для создания прокси для произвольных протоколов, по аналогии с привычными перехватывающими веб-прокси, но более общий.
Он построен на фреймворке Netty и во многом опирается на концепцию конвейеров Netty, что позволяет графически собирать графы обработчиков. (См. скриншоты ниже для примера.) В мире Netty экземпляры обработчиков обеспечивают разграничение фреймов (т.е. где начинается и заканчивается сообщение), декодирование и кодирование протоколов (преобразование потока байтов в Java-объекты и обратно, или преобразование потока байтов в другой поток байтов — подумайте о сжатии и распаковке), а также логику более высокого уровня (фактически выполнение действий с этими объектами).
Благодаря тщательному разделению Codecs и обработчиков, которые фактически манипулируют сообщениями, Mallet может использовать обширную библиотеку существующих Codecs и избежать повторной реализации многих протоколов. Последний элемент головоломки предоставляется обработчиком, который копирует сообщения, полученные на одном конвейере, в другой конвейер, проксируя эти сообщения к их конечному назначению.
Конечно, пока сообщения находятся внутри Mallet, их легко можно изменить, либо с помощью пользовательских обработчиков, написанных на Java или скриптовом языке, совместимом с JSR-223, либо вручную, используя один из предоставленных редакторов.
Вы можете получить представление о доступных кодексах, просмотрев исходный код Netty на GitHub в каталогах codec*. Или просто погуглив netty и интересующий вас протокол. Многие интересные реализации протоколов были разработаны за пределами основного проекта Netty, но должны хорошо работать с Mallet.
Mallet предназначен для людей, работающих с сетевыми приложениями, не основанными на HTTP-коммуникациях. Примеры могут включать Интернет вещей, который может использовать MQTT, COAP и т.д., банкоматы и POS-терминалы, которые могут использовать ISO8583, или, честно говоря, любой другой протокол.
На самом деле Mallet может быть полезен даже для приложений на основе HTTP, которые используют дополнительные протоколы внутри HTTP. Например, Google Protobuf поверх WebSockets, которые плохо поддерживаются существующими HTTP-прокси, такими как Burp, Zap и т.д., или gRPC поверх HTTP2.
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-клиента к Mallet на localhost:9998/tcp, при этом реальный сервер находится на localhost:9999/tcp. Только последний JSON-граф (json5.mxe) делает какие-либо предположения о структуре передаваемых JSON-сообщений, поэтому они должны быть применимы к любому приложению, которое отправляет JSON-сообщения.
Файл demo.mxe показывает сложный граф с двумя конвейерами: TCP и UDP. TCP-конвейер построен для поддержки HTTP и HTTPS на портах 80 и 443 соответственно, а также WebSockets, при этом ретранслируя любой другой трафик напрямую к месту назначения. UDP-конвейер построен для обработки DNS-запросов на localhost:1053/udp, замены запросов для google.com на запросы для www.sensepost.com и пересылки запросов на DNS-серверы Google.
Приветствуются отзывы и вклад. Пожалуйста, создавайте issues, где это уместно, или свяжитесь с автором в Twitter @RoganDawes.