Android nougat 이상 emulator에서 mitmproxy 사용하기
Published in
5 min readAug 31, 2019
Android Oreo (8.1/api level 27) Google play service 없는 emulator 기준으로 확인하였습니다.
Android nougat (api level 24) 이상에서는 보안 정책 변경으로 인해 사용자 인증서를 설치하더라도 앱에서 이를 명시적으로 허용하지 않으면 이를 이용할 수 없다.
mitmproxy 는 proxy 설정을 통해 http 및 https 트래픽을 볼 수 있는 프로그램으로 http/https 네트워크 패킷을 확인하기 편리한 프로그램이다.
- mitmproxy를 통해 https 패킷을 확인하기 위해서는 사용자 인증서를 반드시 설치해야한다.
- Android nougat 이상에서는 보안 정책 변경으로 인해 사용자 인증서를 설치하더라도 명시적으로 허용하지 않은 앱 (아마도 대부분)의 패킷을 확인할 수 없다.
- 따라서 사용자 인증서를 시스템 인증서로 교체하면 대부분의 앱(Certificate pinning 처리를 하지 않은 경우)의 패킷을 mitmproxy를 통해 확인할 수 있다.
- mitmproxy를 설치하고 실행한다.
- Avd 를 생성한다. 이 때 google play service 를 사용할 수 있는 avd 는 root 권한을 얻을 수 없어 system 파티션을 수정할 수 없기 때문에 google play service 없는 avd를 생성한다.
- mitmproxy에서 설정했던 대로 Proxy 설정을 한다.
- Avd에서 http://mitm.it 에 접속해서 mitmproxy 인증서를 설치한다. 이때 Credential use 는 Vpn and apps 로 설치한다.
- Avd 의 Settings > Security & location > Advances > Encryption & Credentials > User credentials 메뉴에서 mitmproxy 사용자 인증서를 확인할 수 있다.
- avd 를 종료한다.
- system 인증서를 설치하기 위해서는 system 파티션을 수정해야 하기 때문에 avd 를 -writable-system 옵션 추가하여 실행한다.
아래 명령어로 avd 목록을 확인하고
emulator -list-avds
- writable-system 옵션을 추가하여 실행한다. Pixel_API_27 는 각자 생성한 avd에 따라 다르다.
emulator -avd Pixel_API_27 -writable-system
- system 파티션을 수정하기 위해 avd 를 remount 한다
adb root
adb remount
- 사용자 인증서를 저장하는 위치는 /data/misc/user/0/cacerts-added 이며 시스템 인증서 위치는 /system/etc/security/cacerts/ 이다. 따라서 /data/misc/user/0/cacerts-added 에 저장되어 있는 인증서를 /system/etc/security/cacerts/ 에 복사하면 된다.
adb shell ls /data/misc/user/0/cacerts-added
위 명령으로 인증서 파일을 확인하고
adb shell mv /data/misc/user/0/cacerts-added/c8750f0d.0 /system/etc/security/cacerts/
명령 등으로 mitmproxy 사용자 인증서를 시스템 인증서 directory로 복사한다. c8750f0d.0 는 사용자 인증서에 따라 다르다.
- Avd 를 재부팅한다.
- Avd 의 Settings > Security & location > Advances > Encryption & Credentials > Trusted credentials 메뉴에서 mitmproxy 사용자 인증서를 확인할 수 있다.
위 과정을 거쳐 mitmproxy 프로그램을 통해 많은 앱들의 https 패킷을 확인할 수 있다.
sytem 파티션을 수정한 avd 의 경우 -writable-system 옵션 없이 실행하면 수정 내용이 원래대로 복원된다.
따라서 수정 내용을 유지하고 싶은 경우 -writable-system 옵션을 매번 사용하여 avd를 실행해야 한다.