
Mallet은 임의의 프로토콜을 위한 가로채기 프록시입니다.
Mallet은 임의의 프로토콜에 대한 프록시를 생성하기 위한 도구로, 익숙한 인터셉팅 웹 프록시와 유사하지만 더 일반적입니다.
Netty 프레임워크를 기반으로 구축되었으며, Netty 파이프라인 개념에 크게 의존합니다. 이를 통해 핸들러 그래프를 그래픽으로 조립할 수 있습니다. (예시는 아래 스크린샷을 참조하세요.) Netty 세계에서 핸들러 인스턴스는 프레임 구분(즉, 메시지의 시작과 끝 위치), 프로토콜 디코딩 및 인코딩(바이트 스트림을 Java 객체로 변환하거나 다시 변환하거나, 바이트 스트림을 다른 바이트 스트림으로 변환 - 압축 및 해제 생각), 그리고 상위 수준 로직(실제로 객체를 조작하는 작업)을 제공합니다.
메시지를 실제로 조작하는 핸들러와 코덱을 신중하게 분리함으로써 Mallet은 기존의 방대한 코덱 라이브러리를 활용할 수 있으며, 많은 프로토콜을 다시 구현하지 않아도 됩니다. 퍼즐의 마지막 조각은 한 파이프라인에서 수신된 메시지를 다른 파이프라인으로 복사하여 해당 메시지를 최종 목적지로 프록시하는 핸들러에 의해 제공됩니다.
물론 메시지가 Mallet 내에 있는 동안 Java 또는 JSR-223 호환 스크립팅 언어로 작성된 사용자 정의 핸들러를 사용하거나, 제공된 편집기 중 하나를 사용하여 수동으로 쉽게 변조할 수 있습니다.
사용 가능한 코덱에 대한 아이디어는 Netty 소스 코드의 codec* 디렉토리에서 GitHub를 확인하거나, netty와 관심 있는 프로토콜을 검색하여 얻을 수 있습니다. 많은 흥미로운 프로토콜 구현이 핵심 Netty 프로젝트 외부에서 개발되었지만, Mallet과도 잘 작동해야 합니다.
Mallet은 HTTP 통신 기반이 아닌 네트워크 애플리케이션을 작업하는 사람들을 대상으로 합니다. 예를 들어 MQTT, COAP 등을 사용하는 사물 인터넷, ISO8583을 사용할 수 있는 ATM 및 POS 기기, 또는 다른 모든 프로토콜이 해당됩니다.
사실 Mallet은 HTTP 내에서 추가 프로토콜을 사용하는 HTTP 기반 애플리케이션에도 유용할 수 있습니다. 예를 들어, Burp, Zap 등의 기존 HTTP 프록시에서 잘 지원되지 않는 WebSocket을 통한 Google Protobuf, 또는 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 서버로 전달하도록 구축되었습니다.
피드백과 기여를 환영합니다. 적절한 경우 이슈를 생성하거나, Twitter @RoganDawes로 작성자에게 연락해 주세요.