개발 노트/개발 삽질

Android에서 Http 트래픽 관찰하기 - 1

j4ko 2023. 1. 12. 22:31
728x90
반응형

목차

    개요

    크롤링이라는 단어를 별로 좋아하진 않습니다만 크롤링이 이제 단순히 웹의 정보를 긁어오는 분야만은 아닌 듯합니다. 조금 더 거시적인 관점에서 크롤링은 “정보 수집 기술” 정도로 바라봐도 괜찮다는 생각이 듭니다.

    현대적인 웹 사이트는 동적으로 페이지가 변경될 뿐만 아니라 어떤 사이트는 Network 탭을 통해 볼 수 있는 API 정보도 나타나지 않는 경우가 있습니다. 또한 모바일 앱으로만 제공되는 서비스도 존재하기에 크롤링의 난이도가 점점 올라가고 있습니다.

     

    웹의 경우엔 크롤링을 어떻게 하는지 조금만 검색해도 그 방법이 나오지만 모바일 앱은 그렇지 않습니다.

    이 글은 Android에서 발생하는 HTTP Request을 로컬 PC에서 관찰하는 방법을 소개하는 글입니다.

     

    로컬 PC에서 Http Request을 관찰하는 방법이 있다는 건 그걸 코드 상으로 다룰 수 있다는 의미를 내포하기도 합니다(모든 경우 그렇진 않지만)

    Man in the Middle 

    Man in the Middle은 MITM 이라고도 읽고 중간자 공격이라고도 불립니다. 간단히 설명드리자면 네트워크 통신 사이에 끼어들어 통신 내용을 도청하거나 조작하는 공격 기법입니다.

     

    이 글에서 소개하고자 하는 방식은 MITM을 지원하는 도구를 이용해 안드로이드 앱과 PC 간 MITM을 걸어 안드로이드 앱에서 발생하는 HTTP 패킷을 PC에서 어떻게 관찰할 수 있는지를 설명합니다.

    이 기술을 이용해 통신을 조작하여 도청하거나 조작하는 등의 행위는 삼가시길 바랍니다.


    과정은 다음 단계로 진행됩니다.

    1. Man in the Middle Proxy Tool Installation
    2. Android App에서 Proxy 설정하기
    3. local pc와 android에서. cert 파일 설치하기

    Man in the Middle - Tool Installation

    Man in the Middle Proxy를 이용하려면 필요한 도구가 있습니다. “mitmproxy”라고 불리는 것인데 mac에서는 다음과 같이 설치합니다.

    ╰─$ brew install mitmproxy
    Running `brew update --auto-update`...
    ==> Auto-updated Homebrew!
    Updated 2 taps (homebrew/core and homebrew/cask).
    ==> New Formulae
    bzip3                                                                                      kwctl                                                                                      openvino
    ==> New Casks
    forkgram-telegram                                                                          ideamaker                                                                                  superlist
    
    You have 19 outdated formulae and 1 outdated cask installed.
    You can upgrade them with brew upgrade
    or list them with brew outdated.
    
    Warning: mitmproxy 9.0.1 is already installed and up-to-date.
    To reinstall 9.0.1, run:
      brew reinstall mitmproxy
    

    이를 이용해 MitmProxy 서버를 띄우는 건 다음과 같은 명령어를 이용합니다.

    mitmweb --listen-port 9901
    

    mitmproxy 설치했으면 프락시 설정을 잡아줘야 합니다. mac에서는 “네트워크 환경설정 > Wi-Fi > 고급 > 프락시 > 보안 웹 프락시(HTTPS)” 를 통해 접근하여 아래 이미지처럼 설정합시다.

     

    Android App과 M1 Mac에서 Proxy 설정하기

    이후 Android 핸드폰에서 proxy 주소로 접근할 수 있게 세팅이 필요합니다.

    본인이 사용하는 핸드폰에서 위와 같이 Proxy 설정 단계까지 진입한 후 호스트 이름과 포트를 mitmproxy가 설치된 PC로 변경하면 됩니다.

     

    Man in the Middle - Certification Registration

    위 단계까지 진행했으면 신경 써줘야 하는 부분이 있습니다. HTTPS에 관한 처리입니다.

     

    많은 웹 사이트는 HTTP 보다는 HTTPS로 접근하게 됩니다. HTTPS를 이용하여 접근한 경우 보안에 관련된 요소가 적용되니 mitmproxy를 설치하고 난 후 다음과 같이 인증서를 PC에 등록해줘야 합니다.

    sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem

    mitmproxy-ca-cert.pem 파일은 mitmproxy를 설치하면서 자동으로 생성됩니다. 그러니 위 명령어를 실행시키면 되고 이는 mitmproxy 문서에도 나와있습니다.


    pc에 인증서를 설치했으면 본인이 사용하는 핸드폰에서 cert을 설치해야 되니 proxy가 연결이 완료된 상태에서 핸드폰 주소 창에 mtim.it을 입력해 환경에 맞는 인증서 파일을 다운로드해 실행해서 설치합시다.


    표현해 보자면…

    1,2,3 단계를 진행하면 위와 같은 형태의 구성이 나옵니다.

     

    아직 문제가 남았습니다..

    위 과정까지 진행했으면 이제 핸드폰과 PC를 usb로 연결하여 핸드폰으로 브라우저나 앱을 이용하게 되면 패킷이 발생하는 걸 확인할 수 있습니다.
    그런데 삽질 중에 다음과 같은 사실들이 존재했습니다.

    1. mitmproxy를 차단하는 android app들이 있네?
    2. 구글링을 해보니 SSL Pinning을 이용하면 된다고만..
    3. adb로 핸드폰에 몇 가지 설정이 필요하네… 어? 루팅이 필요네
    4. 내가 쓰는 핸드폰인데 루팅 하기 좀 걱정스러운데
    5. 그럼 Nox를 이용하자
    6. M1 Mac에서는 Nox가 안되네..
    7. 윈도에 있는 Nox 쓰지 뭐..
    8. 어 윈도에서 실행되는 Nox를 m1 mac에서 어떻게 연결하지?

    아직 이 포스팅 쓰는 시점으로 위 1~8단계 항목은 해결한 상황입니다. 글이 너무 길어지는 걸 싫어하니 이번 포스팅은 이쯤에서 마무리하고 다음 포스팅에 위 내용을 다룰 예정입니다.

    728x90
    반응형