핸드폰 개발자를 위한mitmproxy 입문

11547 단어 mitmproxyAndroidiOS

개시하다


모바일 애플리케이션을 개발할 때 애플리케이션과 서버 간의 통신을 확인하고 싶을 때가 있다.예를 들어 예상과 일치하는 HTTP 요청을 보냈는지 조사하거나 서버의 응답이 틀렸는지 확인해야 한다.
이럴 때는 디버거로 하나씩 멈출 수 있지만 프록시 서버를 끼우면 간단하게 통신을 훑어볼 수 있다.그리고 응답을 왜곡하고 고의로 부정확한 응답을 해서 응용 프로그램의 붕괴 여부를 테스트할 수 있으며 특정한 요청만 차단하면 서버 고장을 시뮬레이션할 수 있다.

Mitmproxy 소개


mitmproxy는 man in the-middle형 프록시 서버의 도구입니다.대화형 CUI가 있는 OS X, Windows, Linux에서 실행됩니다.SSL 지원이 특징입니다.
공식 홈페이지: http://mitmproxy.org/doc/mitmproxy.html

설치하다.


다음은mitmproxy의 가져오는 방법에 대해 설명합니다.

기계적 준비


우선mitmproxy를 손 옆에 있는 기계로 가져옵니다.pip로 설치가 가장 간단하죠.pip에 관해서는 여기.를 참조하십시오.
pip install mitmproxy
를 참고하십시오.
또한 OSX를 사용하는 경우설치 가이드도 있습니다. XCode가 필요합니다.

모바일 터미널 준비


그리고 모바일 터미널을 설정하여 핸드폰에서 이동하는mitmproxy를 프록시 서버로 사용합니다.

iOS


iOS의 경우'설정'→'Wi-Fi', 현재 연결된 네트워크 클릭→'HTTP 에이전트'를 통해 프록시 설정을 할 수 있다.설정 항목에 다음 내용을 입력하십시오.또한 포트 번호는 기본적으로 8080으로 프록시 서버를 시작할 때 다른 번호를 지정할 수 있습니다.
  • 서버: 자체 시스템의 IP 주소
  • 포트 번호: 8080
  • 인증: 종료

  • Android


    안드로이드의 경우 '설정' → '와이파이' 를 누르고 현재 연결된 네트워크를 길게 누르고 '네트워크 변경' 을 누르면 열린 대화상자의 '자세한 옵션 보이기' 콤보 상자에서 선택하면 프록시가 설정한 입력 표시줄을 표시합니다.설정 항목은 iOS와 동일하므로 생략합니다.

    인증서 설치


    그럼 우선 mdotmproxy를 시작해 보세요.기본적으로 포트 번호 8080으로 시작해서 mitmproxy -p 8081처럼 -p 옵션을 지정하면 추가 번호를 지정할 수 있습니다.
    % mitmproxy
    
    이때 모바일 터미널로 네트워크를 연결하려면 상기 에이전트를 통과해야 한다.그러나 대부분의 응용 프로그램에서 통신 오류가 발생한다.이것은 터미널에 인증서를 설정하지 않았기 때문에 발생한 것이다.따라서 모바일 터미널에 있는 브라우저http://mitm.it의 방문 주소를 엽니다.이렇게 하면 아래 화면이 표시됩니다.

    여기서 안드로이드는 안드로이드를, iOS는 iOS 아이콘을 눌러 인증서를 설치할 수 있다.

    기본용법


    그럼 방금 시작한 MITmproxy 화면을 보세요.모바일 터미널로 무엇을 하면 HTTP 통신의 일람표를 출력할 수 있습니다.예를 들어, PlayNewsstand를 시작할 때 다음과 같은 항목이 있습니다.또한 Shift + F를 입력할 때following 모드에서 최신 요청을 자동으로 표시합니다.
    또한 E키를 누르면 화면이 2단으로 바뀌고 이벤트 로그가 표시됩니다.

    하나의 통신 내용을 보려면 Shift + F를 한 번 더 입력하고 following 모드를 해제한 후 J 키와 K 키로 커서를 위아래로 이동할 통신을 선택하십시오.커뮤니케이션Enter 키를 눌러 컨텐트를 봅니다.
    요청과 응답은 TAB 키로 전환할 수 있습니다.또한 방금 전의 통신 목록을 되돌리려면 Q키를 누르십시오.

    거르다


    이처럼 모바일 단말기의 모든 통신을 볼 수 있지만 통상 양이 너무 많아 목적 통신을 찾기 어렵다.mitmproxy에 L 키를 입력하면 필터를 할 수 있습니다.정규 표현식 모드와 일치하는 URL을 사용하여 필터링하거나 머리글 및 메서드로 필터링할 수 있습니다.
    아래의 예에서 play.googleapis의 모델로 선별하였다.

    수용자


    또 특정한 통신을 멈추고 내용을 고칠 수도 있다.mitmproxy에 I 키를 입력한 다음 받아들일 통신과 일치하는 모드를 입력하십시오.사용할 수 있는 모드는 필터와 같습니다.
    이 상태에서 통신을 하면 다음과 같이 캡처된 통신이 주황색으로 표시됩니다.

    수신한 통신을 다시 쓰려면 수신 상태Enter에서 키로 통신을 표시하고 E 키를 입력하십시오.

    이 상태에서 통신을 고친 후 Q키로 아까 화면으로 돌아가 A키를 눌러 통신한다.
    팟캐스트와 응답할 때 두 번 다시 쓸 수 있습니다.처음 A버튼을 누르면 요청을 받을 수 있고, 회신 후 수락할 수 있다.그리고 응답을 편집한 후 A 키를 입력하면 변경된 응답이 터미널로 전송됩니다.


    여러 개의 통신을 동시에 받으면 모두 통과하려면 Shift + A를 입력하십시오.

    고급 사용 방법


    mitmproxy는 더 높은 사용 방법이 있습니다.클라이언트 재작성과 스크립트 재작성을 소개합니다.

    클라이언트 재방송


    클라이언트 재방송은 통신을 한 번 재생하는 기능이다.이 때 요청한 내용을 다시 쓸 수 있습니다.
    mitmproxy 공식 사이트에서 애플 게임 센터의 게임에서 높은 점수를 왜곡하는 방법(일시적으로 모든 순위2,147,483,6472^31 - 1을 예로 들었다.
    재방송을 진행하려면 재생하고 싶은 통신 지점으로 커서를 가져가서R키를 누르세요.미리 편집하고 싶으면 Enter 키로 통신을 표시한 다음 E 키로 편집한다.편집이 끝난 후 Q키로 지우고 아까처럼 R키를 눌러주세요.
    재방송을 실행하면 통신 시작에 다음과 같은 재방송 표시가 있다.

    선별하다


    통신을 왜곡하는 간단한 방법은 캡처 기능을 사용하는 방법이지만 요청과 응답을 하나하나 수동으로 변경하는 것은 번거롭고 편집 기간에도 통신이 시간을 초과할 수 있다.이럴 때는 선별 기능을 사용할 수 있다.
    예를 들어 어떤 뉴스 응용 프로그램이 보도 목록을 업데이트할 때 REST API/api/v1/list.json?type=reload를 이용했다.이 응용프로그램의 통신을 변경하고 싶으면 서버의 응답 내용을 기계적으로 바꾸세요.이 경우 다음 스크립트는 test_mitmproxy.py의 이름으로 저장되고 -s 옵션으로mitmproxy를 시작합니다.
    # -*- coding: utf-8 -*-
    def response(context, flow):
        path = flow.request.path
        query = flow.request.get_query()
        if path.endswith("/api/v1/list.json") and query.in_any('type', 'reload'):
            flow.response.replace("艦これ", "hogehoge")
    
    mitmproxy -s test_mitmproxy.py
    
    이 상태에서 프로그램을 시작하면 해당하는 API 호출 (예를 들어 보도 목록 재부팅) 과 응답 중인 '함정 이' 는 모두 'hogehoge' 로 바뀌어야 한다.
    또한 스크립트에서 매개 변수를 얻을 수 있습니다.예를 들어 다음 스크립트는 무작위로 통신을 끊어서 위선적이고 불안정한 통신 환경을 재현할 수 있다.
    # -*- coding: utf-8 -*-
    import random
    
    def start(ctx, argv):
        if len(argv) != 3:
            raise ValueError('Usage: -s "pseudo_unstable_network.py hostname percentage(0-10)"')
        # You may want to use Python's argparse for more sophisticated argument parsing.
        ctx.arg1, ctx.arg2 = argv[1], argv[2]
    
    def request(context, flow):
        host = flow.request.host
        if host.endswith(context.arg1) and random.randint(0, 10) <= int(context.arg2):
            context.log("Kill the request for %s. Host: %s" % (flow.request.get_url(), host))
            flow.kill(context._master)
    
    이 스크립트를 지정하려면 다음 매개 변수를 사용합니다.이 예에서 80%의 확률로 api.example.com와의 통신을 끊는다.
    mitmproxy -s "pseudo_unstable_network.py api.example.com 8"
    

    끝말


    어때?mitimproxy를 사용하면 이렇게 간단하게 통신 내용을 훑어보거나 고칠 수 있습니다.
    여러분도mitmproxy를 이용해서 편안한 모바일 앱 개발 생활을 하세요.

    좋은 웹페이지 즐겨찾기