Post

휴대폰의 네트워크 요청 추적하기: mitmproxy로 분석하기

휴대폰에서 나가는 http, https 요청을 모니터링 해보고 싶다


PC에서는 어떤 웹사이트에서 어떤 네트워크 요청이 있고 어떤 쿠키를 사용했고 이런 정보들을 f12 를 누르고 개발자 도구를 열면 아주 쉽게 알 수가 있는데 그걸 모바일에서도 해보고 싶었다! 그래서 한번 찾아봤고 역시나 방법은 있었다!

원래는 이렇게 바로 요청을 했다면

graph LR
    폰 --> 외부사이트

그 사이에 mitmproxy 라는 프로그램을 설치한 나의 노트북을! 프록시 서버로 사용하는 것이다

graph LR
    폰 --> PC --> 외부사이트

그리고 PC 에서 http 요청들을 확인하는 것이다!

mitmproxy 로 한번 네트워크 모니터링을 해보자!


  1. PC 에서! (window) 우선 mitmproxy 를 다운 받아준다! https://mitmproxy.org 에서 다운 받을 수 있다. 다운 받고 실행해주면 mitmproxy 가 설치가 된다. 그 다음 cmd 를 열어
    1
    
    mitmweb
    

명령어를 입력 해주면 http://127.0.0.1:8081 에서 이제 네트워크를 모니터링 할 수 있게 된다! PC에서의 준비는 끝난다 이제 폰을 PC 의 프록시를 바라보도록 해줘야한다.

  1. 폰에서 우선 PC가 연결되어있는 네트워크 (wifi) 와 같은 것을 연결을 한다. 그 다음 연결한 네트워크의 설정에 들어간다. 더보기를 누르면 프록시를 설정할수 있다! 여기에 프록시 호스트 이름에는 PC의 IP주소를 (ipconfig 로 확인) 포트에는 8080을 적어주고 저장한다!

하지만 아직 끝나지 않았다! mitmproxy 는 https 연결까지 보여주기 때문에 certificate file 설치가 필요하다! http://mitm.it에 접속해서 인증서를 다운 받고! 또 설치 해준다! 앗 혹시 이때 이 사이트에 들어가지지 않으면 아직 제대로 프록시 설정이 되지 않은것이니 다시 PC설정부터 차근 차근 따라하면 된다! 이제 휴대폰도 모든 설정이 끝났다!

  1. 네이버에 들어가보자 네이버에 들어가면 아까 http://127.0.0.1:8081 사이트에 요청들이 잡히기 시작한다! 이제 이걸로 재미있는 걸 할 수 있을거 같다!

사내 버스 API 파헤쳐보기


사내 버스 API를 한번 확인해보고 싶어졌다! 사내 버스 APP 이 바로 DB와 TCP연결을 한다면 잡히지 않았을텐데 다행이 백엔드 서버로 http 요청을 보내고 있었고 궁금했던 http 요청들을 확인 할 수가 있었다!

  1. Auth Check 는 쿠키로 하고 있었다. JSESSIONxxxxxx 라는 쿠키 값과 TSxxxxxxxx 라는 쿠키값으로 Auth Check 를 하고 있었고 이 2개의 값만 가지고 있다면 버스 API 사용에 문제가 없었다.

  2. 지도에서 정류장 찾기 /mobile/Busaction.do 라는 주소로 get 요청을 보내고 있고 method, START_TIME, END_TIME, 그리고 polygonstring 이라는 query parameter 를 받고있었다! method 는 StationMapSearch 라고 지정이 되어 있었고 polygonString 은 5개의 값이 comma로 이루어져 있었는데 이는 지도의 위도와 경도로 이루어져 있었다. 각각 북서쪽, 북동쪽, 남동쪽, 남서쪽 그리고 다시 북서쪽의 좌표였다! 그러면 response 로는 정류장들의 list (정류장의 ID 도 있고 이름도 있고 그렇다!) 가 주르륵 나온다! 더 자세한건 패스!

  3. 정류장에 어떤 차가 오는지 찾기 아까와 동일한 주소로 get 요청을 보내고 있었고 받는 parameter 도 거의 동일 했다! 대신 method 가 이번에는 RouteSearch 로 바뀌었다. 요청을 보내면 어떤 버스가 멈추는지 나오게 된다 해당 노선의 ID, 멈추는 정류장 이름들 언제 출발하는지대 한 정보들까지 싹 response 에 담아 준다.

  4. 노선을 확인하기 노선을 확인 할때는 2가지를 사용한다.

첫번째는 역시 주소는 같고 method가 RouteList 가 된다. 그리고 노선의 ID 를 queryparameter 로 준다. 그러면 그 노선이 지나가는 정류장의 위도 경도 이름이 들어있는 정보가 나오게 된다.

두번째도 역시 주소는 같지만 method 가 RouteCarLocation이고 노선의 ID 가 역시 query parameter 로 들어간다. 네트워크를 모니터링하니까 5초에 이 API를 호출하는데 이는 해당 노선을 운행중인 버스의 실시간 정보를 보여준다! 버스의 위치, 운행중인지, 등등의 정보가 있다!

재미있는데 이래도 되는건가 싶다


내가 만든 서비스가 아닌데 이렇게 API를 파헤쳐 보니 재미있긴 하지만 뭔가 이래도 되는가 싶고… 그렇다 하지만 다른 사람들이 어떻게 API를 설계했는지 확인해보는 의미 있는 시간이었던거 같다!

This post is licensed under CC BY 4.0 by the author.