
🤖 Android APK 파일을 HTTPS 검사에 자동으로 준비하는 CLI 애플리케이션
Android APK 파일을 HTTPS 검사에 자동으로 준비하는 CLI 애플리케이션
프록시를 사용하여 모바일 앱의 HTTPS 트래픽을 검사하는 것은 앱이 어떻게 작동하는지 알아내는 가장 쉬운 방법일 것입니다. 그러나 Android 7에서 도입된 네트워크 보안 구성과 앱 개발자들이 인증서 고정을 사용하여 MITM 공격을 방지하려고 하면서, 앱이 HTTPS 프록시와 작동하도록 만드는 것이 꽤 번거로워졌습니다.
apk-mitm은 전체 프로세스를 자동화합니다. 여러분이 해야 할 일은 APK 파일을 제공하는 것뿐이며, apk-mitm은 다음을 수행합니다:
또한 apk-mitm을 사용하여 Android App Bundle을 사용하는 앱 패치를 할 수 있으며, 휴대폰을 루팅할 필요가 없습니다.
인증서 고정과 같은 보안 기능을 우회하기 위해 앱의 정상적인 동작을 수정하려면 앱을 실행하기 전에 소스 코드를 수정하거나, 앱이 실행되는 동안 "훅킹"하여 함수 호출을 가로채야 합니다.
apk-mitm은 현재 전자의 접근 방식을 취하고 있습니다. 즉, Apktool을 사용하여 앱을 먼저 "디스어셈블"하고, 여러 파일을 변경한 다음, (다시 Apktool을 사용하여) 다시 조립합니다.
이 접근 방식은 루팅된 장치가 필요하지 않다는 장점이 있지만 여러 가지 단점도 있습니다. 가장 큰 문제는 앱이 실제로 디스어셈블되도록 의도되지 않았다는 점입니다. Apktool은 어쨌든 그것을 달성하려고 시도하지만, 특히 크고 복잡한 앱의 경우 종종 문제가 발생합니다.
이 접근 방식의 또 다른 문제점은 네이티브 바이너리 내에서 수행되는 검사(Flutter와 같은 프레임워크의 경우)와 같은 일부 인증서 고정 방법을 우회하기가 매우 어렵거나 불가능하다는 것입니다. 이러한 이유로 까다로운 앱의 경우 다른 접근 방식을 시도해 보는 것이 유용할 수 있습니다.
특히, mitmproxy의 android-unpinner 프로젝트와 HTTP Toolkit의 기본 frida-interception-and-unpinning 스크립트를 강조하고 싶습니다. 이들의 접근 방식은 Frida를 사용하여 런타임에 패치를 적용하는데, 이는 훨씬 더 강력하지만 루팅된 장치가 없으면 사용할 수 없거나 사용하기가 더 어렵다는 것을 의미합니다.
최신 버전의 Node.js (14+)와 Java (8+)가 있다면, 다음 명령을 실행하여 apk-mitm을 설치할 수 있습니다:
npm install -g apk-mitm
설치가 완료되면 다음 명령을 실행하여 앱을 패치할 수 있습니다:
apk-mitm <path-to-apk>
example.apk라는 APK 파일을 패치하는 예시는 다음과 같습니다:
$ apk-mitm example.apk
✔ Decoding APK file
✔ Modifying app manifest
✔ Replacing network security config
✔ Disabling certificate pinning
✔ Encoding patched APK file
✔ Signing patched APK file
Done! Patched APK: ./example-patched.apk
이제 example-patched.apk 파일을 Android 기기에 설치하고 Charles 또는 mitmproxy와 같은 프록시를 사용하여 앱의 트래픽을 볼 수 있습니다.
또한 apk-mitm에 *.xapk 파일(예: APKPure에서) 또는 *.apks 파일(직접 SAI를 사용하여 내보낼 수 있음)을 제공하여 Android App Bundle을 사용하는 앱을 패치할 수 있습니다. Linux에서 이 작업을 수행하는 경우 zip과 unzip이 모두 설치되어 있는지 확인하세요.
때로는 앱이 작동하도록 수동 변경이 필요할 수 있습니다. 이러한 경우 --wait 옵션이 필요합니다. 이 옵션을 활성화하면 apk-mitm이 앱을 다시 인코딩하기 전에 대기하여 임시 디렉토리의 파일을 변경할 수 있게 됩니다.
APK에 다양한 변경을 실험하고 싶다면 --wait를 사용하는 것이 매번 처음부터 시작해야 하므로 가장 편리한 옵션이 아닐 수 있습니다. 이 경우 APKLab을 살펴보는 것이 좋습니다. APKLab은 VS Code를 기반으로 구축된 Android 역공학 워크벤치로, apk-mitm 지원이 포함되어 있어 훨씬 더 빠르게 반복 작업을 수행할 수 있습니다.
일부 기기(Android TV 등)에서는 시스템의 루트 인증서에 새 인증서를 추가하지 못할 수 있습니다. 이러한 경우에도 프록시의 인증서를 앱의 네트워크 보안 구성에 직접 추가할 수 있으며, 이는 모든 기기에서 작동합니다. 이를 수행하려면 apk-mitm을 실행할 때 --certificate 플래그를 프록시에서 사용하는 인증서(.pem 또는 .der 파일)의 경로로 설정하세요.
앱이 Google Maps를 사용하고 패치 후 지도가 깨진다면, 앱의 API 키가 아마 개발자의 인증서로 제한되어 있을 것입니다. 제한이 없는 자체 API 키를 생성하고, --wait 옵션과 함께 apk-mitm을 실행하여 앱의 AndroidManifest.xml 파일에서 com.google.android.geo.API_KEY 값을 교체해야 합니다.
디코딩 또는 인코딩 중에 apk-mitm이 충돌하는 경우 문제는 아마 Apktool과 관련되어 있을 수 있습니다. GitHub의 이슈에서 가능한 해결 방법을 찾아보세요. 문제의 영향을 받지 않는 Apktool 버전을 발견한 경우, --apktool 옵션을 통해 해당 JAR 파일의 경로를 지정하여 apk-mitm이 이를 사용하도록 지시할 수 있습니다.
MIT © Niklas Higi