LittleProxy-mitm не будет правильно передавать HTTPS

Я пытаюсь выполнить man-in-the-middle напасть на HTTPS соединение путем ретрансляции всего трафика и выбора определенного трафика для изменения. Я смотрел в LittleProxy-mitm так же как LittleProxy и эти проекты выглядят очень перспективными. Я следовал за readme, чтобы написать свой код, но соединение не работает, пока оно проходит через этот прокси. Мой полный код следующий:

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import io.netty.util.AttributeKey;
import org.littleshoot.proxy.HttpFilters;
import org.littleshoot.proxy.HttpFiltersAdapter;
import org.littleshoot.proxy.HttpFiltersSourceAdapter;
import org.littleshoot.proxy.impl.DefaultHttpProxyServer;
import org.littleshoot.proxy.mitm.CertificateSniffingMitmManager;
import org.littleshoot.proxy.mitm.RootCertificateException;

import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;

public class Main
{
    private static final AttributeKey<String> CONNECTED_URL = AttributeKey.valueOf("connected_url");

    public static void main(String[] arguments) throws RootCertificateException
    {
        System.out.println("Starting HTTP proxy server...");

        DefaultHttpProxyServer.bootstrap()
                .withPort(9090)
                .withManInTheMiddle(new CertificateSniffingMitmManager())
                .withFiltersSource(new HttpFiltersSourceAdapter()
                {
                    @Override
                    public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx)
                    {
                        String uri = originalRequest.getUri();
                        if (originalRequest.getMethod() == HttpMethod.CONNECT)
                        {
                            if (ctx != null)
                            {
                                String prefix = "https://" + uri.replaceFirst(":443$", "");
                                ctx.channel().attr(CONNECTED_URL).set(prefix);
                            }
                            return new HttpFiltersAdapter(originalRequest, ctx);
                        }
                        String connectedUrl = ctx.channel().attr(CONNECTED_URL).get();
                        if (connectedUrl == null)
                        {
                            return new MyHttpFilters(uri);
                        }
                        return new MyHttpFilters(connectedUrl + uri);
                    }
                })
                .start();
        System.out.println("HTTP proxy server started...");
    }

    private static void printHeaders(DefaultHttpRequest httpObject)
    {
        final HttpHeaders headers = httpObject.headers();
        final List<Map.Entry<String, String>> entries = headers.entries();

        for (Map.Entry<String, String> entry : entries)
        {
            final String value = entry.getValue();
            System.out.println(entry.getKey() + " -> " + value);
        }

        System.out.println();
    }

    public static class MyHttpFilters implements HttpFilters
    {
        private final String uri;

        MyHttpFilters(String uri)
        {
            this.uri = uri;
        }

        @Override
        public HttpResponse clientToProxyRequest(HttpObject httpObject)
        {
            ((DefaultHttpRequest) httpObject).setUri(uri);
            printHeaders((DefaultHttpRequest) httpObject);
            return (HttpResponse) httpObject;
        }

        @Override
        public HttpResponse proxyToServerRequest(HttpObject httpObject)
        {
            ((DefaultHttpRequest) httpObject).setUri(uri);
            printHeaders((DefaultHttpRequest) httpObject);
            return (HttpResponse) httpObject;
        }

        @Override
        public void proxyToServerRequestSending()
        {

        }

        @Override
        public void proxyToServerRequestSent()
        {

        }

        @Override
        public HttpObject serverToProxyResponse(HttpObject httpObject)
        {
            return null;
        }

        @Override
        public void serverToProxyResponseTimedOut()
        {

        }

        @Override
        public void serverToProxyResponseReceiving()
        {

        }

        @Override
        public void serverToProxyResponseReceived()
        {

        }

        @Override
        public HttpObject proxyToClientResponse(HttpObject httpObject)
        {
            return null;
        }

        @Override
        public void proxyToServerConnectionQueued()
        {

        }

        @Override
        public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHostAndPort)
        {
            return null;
        }

        @Override
        public void proxyToServerResolutionFailed(String hostAndPort)
        {

        }

        @Override
        public void proxyToServerResolutionSucceeded(String serverHostAndPort, InetSocketAddress resolvedRemoteAddress)
        {

        }

        @Override
        public void proxyToServerConnectionStarted()
        {

        }

        @Override
        public void proxyToServerConnectionSSLHandshakeStarted()
        {

        }

        @Override
        public void proxyToServerConnectionFailed()
        {

        }

        @Override
        public void proxyToServerConnectionSucceeded(ChannelHandlerContext serverCtx)
        {

        }
    }
}

Заголовки запросов печатаются, но связь по-прежнему нарушена. Что я делаю неправильно? Если я бегу HTTP Версия с фильтрами, как описано здесь, соединение работает нормально. К сожалению, с HTTP версия все HTTPS трафик игнорируется.

0 ответов

** Я изменил пару строк в вашем коде, просто запустите его. Он должен работать. Убедитесь, что вы изменили сетевые настройки браузера, чтобы использовать прокси **

package com.example.ProxyTest.mitm;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import io.netty.util.AttributeKey;
import org.littleshoot.proxy.HttpFilters;
import org.littleshoot.proxy.HttpFiltersAdapter;
import org.littleshoot.proxy.HttpFiltersSourceAdapter;
import org.littleshoot.proxy.impl.DefaultHttpProxyServer;
import org.littleshoot.proxy.mitm.CertificateSniffingMitmManager;
import org.littleshoot.proxy.mitm.RootCertificateException;

import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;

public class mitmExample1

{
    private static final AttributeKey<String> CONNECTED_URL = AttributeKey.valueOf("connected_url");

    public static void main(String[] arguments) throws RootCertificateException
    {
        System.out.println("Starting HTTP proxy server...");

        DefaultHttpProxyServer.bootstrap()
                .withPort(9090)
                .withManInTheMiddle(new CertificateSniffingMitmManager())
                .withFiltersSource(new HttpFiltersSourceAdapter()
                {
                    @Override
                    public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx)
                    {
                        String uri = originalRequest.getUri();
                        if (originalRequest.getMethod() == HttpMethod.CONNECT)
                        {
                            if (ctx != null)
                            {
                                String prefix = "https://" + uri.replaceFirst(":443$", "");
                                ctx.channel().attr(CONNECTED_URL).set(prefix);
                            }
                            return new HttpFiltersAdapter(originalRequest, ctx);
                        }
                        String connectedUrl = ctx.channel().attr(CONNECTED_URL).get();
                        if (connectedUrl == null)
                        {
                            return new MyHttpFilters(uri);
                        }
                        return new MyHttpFilters(connectedUrl + uri);
                    }
                })
                .start();
        System.out.println("HTTP proxy server started...");
    }

    private static void printHeaders(DefaultHttpRequest httpObject)
    {
        final HttpHeaders headers = httpObject.headers();
        final List<Map.Entry<String, String>> entries = headers.entries();

        for (Map.Entry<String, String> entry : entries)
        {
            final String value = entry.getValue();
            System.out.println(entry.getKey() + " -> " + value);
        }

        System.out.println();
    }

    public static class MyHttpFilters implements HttpFilters
    {
        private final String uri;

        MyHttpFilters(String uri)
        {
            this.uri = uri;
        }

        @Override
        public HttpResponse clientToProxyRequest(HttpObject httpObject)
        {
           return null;
        }
//
        @Override
        public HttpResponse proxyToServerRequest(HttpObject httpObject)
        {
            return null;
        }

        @Override
        public void proxyToServerRequestSending()
        {

        }

        @Override
        public void proxyToServerRequestSent()
        {

        }

        @Override
        public HttpObject serverToProxyResponse(HttpObject httpObject)
        {
            return httpObject;
        }

        @Override
        public void serverToProxyResponseTimedOut()
        {

        }

        @Override
        public void serverToProxyResponseReceiving()
        {

        }

        @Override
        public void serverToProxyResponseReceived()
        {

        }

        @Override
        public HttpObject proxyToClientResponse(HttpObject httpObject)
        {
            return httpObject;
        }

        @Override
        public void proxyToServerConnectionQueued()
        {

        }

        @Override
        public InetSocketAddress proxyToServerResolutionStarted(String resolvingServerHostAndPort)
        {
            return null;
        }

        @Override
        public void proxyToServerResolutionFailed(String hostAndPort)
        {

        }

        @Override
        public void proxyToServerResolutionSucceeded(String serverHostAndPort, InetSocketAddress resolvedRemoteAddress)
        {

        }

        @Override
        public void proxyToServerConnectionStarted()
        {

        }

        @Override
        public void proxyToServerConnectionSSLHandshakeStarted()
        {

        }

        @Override
        public void proxyToServerConnectionFailed()
        {

        }

        @Override
        public void proxyToServerConnectionSucceeded(ChannelHandlerContext serverCtx)
        {

        }
    }
}
Другие вопросы по тегам