mitmproxy를 개인 방화벽으로 사용

mitmproxy는 브라우저와 대상 웹사이트 간의 TLS 연결을 해독하여 중간에 사람처럼 행동하는 것을 목표로 하는 매우 다재다능하고 강력한 도구입니다.

자체 인증 기관을 정의하고 이 새로운 기관을 신뢰하도록 브라우저에 명시적으로 지시하기 때문에 이 연결이 TLS를 통해 이루어진 경우에도 mitmproxy가 브라우저와 원격 웹 사이트 간의 트래픽을 스누핑하도록 허용할 수 있습니다. 또한 강력한 애드온 시스템을 사용하여 데이터 스트림을 변조하고 예를 들어 리소스를 자동으로 저장하고 일부 다운로드를 거부하고 헤더를 수정하고 쿠키를 삭제하는 등의 작업을 수행할 수도 있습니다. 이러한 스크립트는 전용 mitmproxy Python API를 사용하는 간단한 Python 스크립트입니다. .

이것은 디지털 마케팅 서비스와 같은 성가신 모든 광고 리소스를 제거하기 위해 작은 개인 방화벽을 구현하는 간단한 방법을 개발하는 아이디어를 주었습니다. 3개의 mitmproxy 명령 중 하나를 사용하면 Chrome 개발자 메뉴를 사용할 수 있는 것처럼 웹사이트로 이동할 때 다운로드되는 리소스의 수를 알 수 있습니다.

시작되면 mitmproxy가 브라우저와 원격 사이트 간의 모든 https 트래픽을 보고 가로챌 수 있습니다. 따라서 다른 사람이 구성을 사용하지 못하도록 필요한 모든 보안 조치를 취해야 합니다.

그럼 조금 더 자세히 알아보도록 하겠습니다.

첫 번째 단계


  • 먼저 플랫폼에 대한 mitmproxy 실행 파일을 다운로드합니다. 저는 개인적으로 Linux를 사용하므로 아카이브를 다운로드하고 3개의 실행 파일을 전용 디렉토리에 추출했습니다. 이들 간의 차이점은 https://docs.mitmproxy.org/stable/
  • 로 이동하십시오.
  • 다음으로 잠시 동안 매개변수 없이 프록시를 시작합니다.
  • ./mitmdump
    기본적으로 8080 TCP 포트를 수신합니다.
  • Chrome 브라우저를 시작하고 mitmproxy를 사용하도록 지시합니다.
    google-chrome --proxy-server="http://127.0.0.1:8080"
  • http://mitm.it로 이동하여 지침을 따르십시오. Linux의 경우 방금 기타를 클릭했고 mitmproxy가 처음 실행될 때 생성된 CA 인증서가 다운로드되었습니다.
    mitmproxy-ca-cert.pem
  • 이제 chrome://settings/certificates를 입력하고 권한을 클릭하고 가져오기를 클릭하고 다운로드한 CA 파일을 선택합니다. 이제 CA 인증서가 설치되었습니다.
  • 동일한 명령줄 인수로 Chrome을 다시 시작하고 짜잔!

  • Note: I didn't try to install the CA file for other browsers, but it seems a little bit trickier.


    데이터 변조



    애드온은 https 트래픽을 가져오거나 수정하는 데 사용되는 간단한 Python 스크립트입니다. 애드온 샘플 목록은 다음 위치에 있습니다. https://docs.mitmproxy.org/stable/addons-examples/

    이 샘플 애드온은 URL 정규식 목록에 따라 리소스를 차단하는 데 사용됩니다. 다음과 같이 확실히 향상될 수 있습니다.

    """ 
    Block URLs matching a regex, by just returning an HTTP 404 code. As addons can be called with an argument,
    the file containing the URLs is hardcoded, but could be extracted from an environment variable for example.
    
    Unfortunately in Python, contrary to Rust, you can't define a regex set and try to match any regex for a string.
    
    """
    import re
    from mitmproxy import http
    from mitmproxy import ctx
    
    class BlockResource:
        def __init__(self):
            # define a new list for holding all compiled regexes. Compilation is done once when the addon
            # is loaded
            self.urls = []
    
            # read the configuration file having all string regexes
            for re_url in open('urls.txt'):
                self.urls.append(re.compile(re_url.strip()))
    
            # log how many URLS we have read
            ctx.log.info(f"{len(self.urls)} urls read")
    
        def response(self, flow):
            # test if the request URL is matching any of the regexes
            if any(re.search(url, flow.request.url) for url in self.urls):
                ctx.log.info(f"found match for {flow.request.url}")
                flow.response = http.HTTPResponse.make(404)
    
    addons = [
        BlockResource()
    ]
    

    urls.txt에 대한 샘플:

    scorecardresearch\.com
    geo\.yahoo\.com
    adversting\.
    ads\.
    \.taboola\.
    \.doubleclick\.
    \.xiti\.
    criteo
    \.pubmatic\.
    \.chartbeat\.net
    \.twimg\.com
    \.keywee\.co
    \.\w+adserver\.com
    outbrain
    \.bouncex\.
    

    이제 -s 매개변수를 사용하여 mitmproxy를 시작하십시오.

    ./mitmdump -s ./block-urls.py
    확실히 많은 URL 정규식의 경우 Python이 일치하는 정규식까지 모든 정규식을 일치시켜야 하기 때문에 이것이 차선책일 수 있습니다.

    이 멋진 코드 조각에 대해 mitmproxy 팀에 감사를 표합니다!

    도움이 되었기를 바랍니다!

    Photo by Blaz Erzetic on Unsplash

    좋은 웹페이지 즐겨찾기