
모바일 애플리케이션을 런타임에 재작성하여 모든 HTTPS 트래픽을 직접 MitM하는 Frida 스크립트
HTTP Toolkit의 일부: HTTP(S)를 구축, 테스트 및 디버깅하기 위한 강력한 도구
이 저장소에는 모바일 기기에서 완전 자동화된 HTTPS MitM 가로채기에 필요한 모든 작업을 수행하도록 설계된 Frida 스크립트가 포함되어 있습니다.
이 스크립트 세트는 Android 및 iOS에서 HTTP(S) 트래픽의 MitM 가로채기를 위해 모두 함께 사용하여, 가로채기 처리, 인증서 신뢰 관리, 인증서 고정 및 투명성 검사 비활성화를 수행할 수 있습니다. 또는 특정 기능만 후킹하도록 개별적으로 사용하거나 수정할 수도 있습니다.
스크립트는 다음을 자동으로 처리할 수 있습니다:
-----BEGIN CERTIFICATE-----로 시작해야 합니다. 텍스트 편집기로 열어 이 내용을 확인하고 추출할 수 있습니다.config.js를 열고 다음 세부 정보를 추가하세요:
CERT_PEM: PEM 형식의 CA 인증서.PROXY_PORT: 프록시의 포트PROXY_HOST: 기기 관점에서 본 프록시 주소 (또는 adb reverse tcp:$PORT tcp:$PORT를 사용하여 ADB를 통해 포트를 전달하고 호스트로 127.0.0.1 사용)frida-server를 다운로드하고, 압축을 풀고, adb push로 기기에 넣은 후 다음 4개 명령으로 실행하세요: adb shell, su, , .-----BEGIN CERTIFICATE-----로 시작해야 합니다. 텍스트 편집기로 열어 이 내용을 확인하고 추출할 수 있습니다.config.js를 열고 다음 세부 정보를 추가하세요:
CERT_PEM: PEM 형식의 CA 인증서.PROXY_PORT: 프록시의 포트PROXY_HOST: 기기 관점에서 본 프록시 주소https://build.frida.re를 패키지 소스로 사용하여 설치할 수 있습니다.frida-ps -Uai를 실행하여 제대로 작동하는지 확인하세요.frida-ps -Uai를 통해 관심 있는 앱의 ID를 찾으세요 (빠른 테스트를 위해 github.com/httptoolkit/ios-ssl-pinning-demo를 사용해 보세요 - ID는 com.httptoolkit.ios-pinning-demo입니다)config.js부터 시작)를 주입한 상태로 관심 있는 앱을 실행하세요. 사용할 스크립트는 자유지만, iOS에서는 다음 명령이 좋은 출발점입니다:
위 명령은 관련 스크립트를 모두 사용하지만, 일반적으로 원하는 하위 집합을 사용할 수 있습니다. 다만 거의 모든 경우 첫 번째 스크립트로 config.js를 포함해야 합니다 (이 스크립트는 다른 스크립트에서 사용하는 일부 변수를 정의합니다).
예를 들어 Android에서 프록시 및 인증서 구성을 다른 곳에서 처리하고 난독화 폴백 없이 인증서 고정 해제만 수행하려면 다음을 실행할 수 있습니다:
frida -U \
-l ./config.js \
-l ./android/android-certificate-unpinning.js
-f $PACKAGE_ID
각 스크립트는 상단의 큰 주석 섹션에서 수행하는 작업과 작동 방식을 자세히 설명합니다. 스크립트는 다음과 같습니다:
config.js
이 스크립트는 다른 스크립트에서 사용하는 변수를 정의합니다:
CERT_PEM - 신뢰할 추가 CA 인증서 (PEM 형식)PROXY_HOST - 사용할 프록시 서버의 IP 주소(IPv4) (인증서 고정 해제만 수행하는 경우 필요 없음)PROXY_PORT - 사용할 프록시 서버의 포트 (인증서 고정 해제만 수행하는 경우 필요 없음)DEBUG_MODE - 기본값은 false이며, true로 변경하면 디버깅 및 문제 역공학에 유용한 많은 추가 출력이 활성화됩니다.BLOCK_HTTP3 - 기본값은 true이며, 포트 443으로 가는 모든 UDP 연결을 끊어 HTTP/3을 차단합니다.이 스크립트는 다른 스크립트보다 먼저 명령줄에 나열되어야 합니다.
native-connect-hook.js
모든 네트워크 트래픽을 직접 캡처하여 모든 연결을 구성된 프록시 호스트 및 포트로 라우팅합니다.
이는 모든 네트워크 연결에 적용되는 저수준 훅입니다. 이를 통해 프록시 설정을 무시하거나 다른 원시 소켓 연결을 만드는 연결까지도 모든 연결이 대상 프록시 서버로 강제 리디렉션되며, 활성화된 경우 HTTP/3 연결도 차단합니다.
이 훅은 libc에 적용되며 Android, Linux, iOS 및 기타 여러 관련 환경에서 작동합니다.
native-tls-hook.js
BoringSSL 기반 라이브러리의 모든 TLS 검증을 수정하여 구성된 CA 인증서를 신뢰하도록 합니다.
이 스크립트는 NLnet이 유럽 위원회의 Next Generation Internet 프로그램의 재정적 지원을 받아 설립한 NGI Zero Entrust Fund를 통해 자금을 지원받는 더 넓은 HTTP Toolkit 프로젝트의 일부입니다. NLnet 프로젝트 페이지에서 자세히 알아보세요.
chmod +x /.../frida-server/.../frida-serveradb devices 사용) 확인하세요. Frida는 루팅된 기기에서 위 예의 su가 제공하는 것처럼 기기에서 root로만 실행됩니다. su 또는 유사한 명령 실행 후 root인지 확인하려면 셸에서 whoami를 실행했을 때 root가 출력되는지 확인하세요.tech.httptoolkit.pinning_demo입니다)config.js부터 시작)를 주입한 상태로 관심 있는 앱을 실행하세요. 사용할 스크립트는 자유지만, Android에서는 다음 명령이 좋은 출발점입니다:
frida -U \
-l ./config.js \
-l ./native-connect-hook.js \
-l ./native-tls-hook.js \
-l ./android/android-proxy-override.js \
-l ./android/android-system-certificate-injection.js \
-l ./android/android-certificate-unpinning.js \
-l ./android/android-certificate-unpinning-fallback.js \
-l ./android/android-disable-root-detection.js \
-f $PACKAGE_ID
frida -U \
-l ./config.js \
-l ./ios/ios-connect-hook.js \
-l ./ios/ios-disable-detection.js \
-l ./native-tls-hook.js \
-l ./native-connect-hook.js \
-f $APP_ID
특히 iOS의 내장 BoringSSL API를 후킹하는데, 이는 iOS가 TLS 인증서 검증을 처리하는 일반적인 방식입니다 (따라서 거의 모든 iOS HTTPS 가로채기에 충분합니다). 하지만 iOS와 Android 모두에서 다른 몇몇 경우에도 사용됩니다.
이 훅은 모든 인증서에 대해 사용자의 CA를 신뢰하고, 사용자의 CA에 대한 모든 인증서 고정, 인증서 투명성 및 기타 제한을 비활성화합니다. 다른 많은 Frida 훅과 달리 이 훅은 TLS 검증을 완전히 비활성화하지는 않습니다(이는 매우 안전하지 않음). 대신 검증을 재정의하여 사용자의 특정 CA 인증서를 사용하는 모든 연결이 신뢰되도록 보장하면서, 제3자가 가로챌 수 있도록 검증을 완화하지 않습니다.
android/
android-proxy-override.js
대상 앱의 Android 프록시 설정을 재정의하여, 규칙을 따르는 모든 트래픽이 프록시 서버를 통해 리디렉션되고 가로채지도록 보장합니다.
android-system-certificate-injection.js
네이티브 Android API를 수정하여 모든 신뢰 저장소가 기본적으로 추가 CA 인증서를 신뢰하도록 하여 암호화된 TLS 트래픽을 캡처할 수 있게 합니다.
android-certificate-unpinning.js
인증서 고정(시스템에서 신뢰하는 모든 인증서가 아닌 소수의 인식된 인증서만 허용) 및 인증서 투명성(사용된 모든 인증서가 공개 인증서 로그에 등록되었는지 검증)을 포함하여, 추가 인증서 제한을 위한 많은 알려진 일반 기법을 수정하거나 비활성화합니다.
android-certificate-unpinning-fallback.js
처리되지 않은 인증서 검증 실패를 감지하고, 알 수 없는 미인식 사례를 자동 생성된 폴백 패치로 처리하려고 시도합니다. 이는 더 실험적이며 다소 예측 불가능할 수 있지만 난독화된 사례에 매우 유용하며, 일반적으로 (초기 실패 한 번 후) 고정 문제를 해결하거나 최소한 Frida 로그 출력에서 추가 역공학을 위한 코드를 강조 표시합니다. 이 스크립트는 android-certificate-unpinning.js와 일부 로직을 공유하므로 단독으로 사용할 수 없습니다. 이 스크립트를 사용하려면 비폴백 고정 해제 스크립트도 포함해야 합니다.
android-disable-root-detection.js
네이티브 및 Java 레이어에서 일반적인 루트 탐지 검사를 비활성화하여 루팅된 Android 기기의 탐지를 방지합니다.
이 스크립트는 알려진 루트 표시기(su, Magisk 및 관련 앱 등)에 대한 파일 시스템 접근, 셸 명령 및 패키지 조회를 가로채고, 주요 시스템 속성(ro.secure, ro.debuggable 등)을 위장하여 프로덕션 환경을 시뮬레이션합니다.
파일 존재 확인 및 셸 명령 실행과 같은 의심스러운 동작을 차단하여, 표준 및 고급 루트 검사를 모두 사용하는 앱에서 탐지를 회피하는 데 도움을 줍니다.
android-disable-flutter-certificate-pinning.js
Flutter 기반 애플리케이션(일반적으로 시스템 인증서 구성을 무시함)이 명시적 인증서 고정의 대부분의 경우에도 CA 인증서를 신뢰하도록 보장합니다. 이 스크립트는 현재 실험적입니다.
ios/
ios-connect-hook.js
모든 iOS 네트워크 트래픽을 직접 캡처하여 모든 연결을 구성된 프록시 호스트 및 포트로 라우팅합니다.
이는 모든 네트워크 연결에 적용되는 저수준 훅입니다. 이를 통해 프록시 설정을 무시하거나 다른 원시 소켓 연결을 만드는 연결까지도 모든 연결이 대상 프록시 서버로 강제 리디렉션됩니다.
ios-disable-detection.js
JailMonkey 탈옥 탐지를 비활성화합니다.
utilities/test-ip-connectivity.js
일반적으로 가로채기 자체의 일부로 사용하지는 않겠지만, 구성 설정 과정에서 매우 유용할 수 있습니다.
이 스크립트를 사용하면 가능한 IP 주소 목록과 대상 포트를 구성하고, 프로세스가 각 주소를 테스트하여 처음으로 연결 가능한 주소에 대해 Frida 클라이언트로 메시지를 보낼 수 있습니다. 대상 기기(휴대폰)에서 프록시 서버(컴퓨터)에 도달하기 위해 어떤 IP 주소를 사용하는 것이 가장 좋은지 모르는 경우 자동화된 구성 프로세스에 유용할 수 있습니다.