universal-flutter-ssl-pinning
PyGhidra를 사용하여 libflutter.so를 리버스 엔지니어링하여 SSL 인증서 검증 함수를 찾은 다음, Frida와 Renef 모두에서 사용할 수 있는 우회 스크립트를 생성합니다.
작동 방식
- PyGhidra가
libflutter.so를 헤드리스 모드로 로드하고 정의된 모든 문자열에서 ssl_client를 스캔합니다.
- 해당 문자열의 교차 참조를 확인하여 이를 포함하는 함수를 찾습니다.
- 각 함수를 디컴파일하여 정확한 매개변수 개수를 얻습니다.
- 3개의 매개변수를 가진 함수가 선택됩니다 — 이것이
ssl_crypto_x509_session_verify_cert_chain입니다.
- 해당 함수의 RVA가 다음 스크립트에 포함됩니다:
- Frida 스크립트(
flutter_ssl_pinning.js) — 런타임에 반환 값을 ptr(1)(SSL_VERIFY_OK)로 패치합니다.
- Renef 스크립트(
flutter_ssl_pinning.lua) — Memory.patch를 사용하여 함수 진입점을 MOV X0, #1 ; RET(ARM64)로 덮어씁니다.
요구 사항
- Ghidra —
brew install ghidra
- pyghidra —
pip install pyghidra
- Frida —
pip install frida-tools 또는 Renef — renef.io
환경 변수 GHIDRA_INSTALL_DIR을 설정하거나 --ghidra-install-dir을 전달하세요.
사용법
# libflutter.so 분석 및 두 스크립트 생성
python3 flutter_ssl_pinning.py libflutter.so
# Frida로 실행
frida -U -f com.example.app -l flutter_ssl_pinning.js
# Renef로 실행
renef -s com.example.app -l flutter_ssl_pinning.lua
옵션
출력 파일
| 파일 | 도구 | 메커니즘 |
|---|
flutter_ssl_pinning.js | Frida | Interceptor.attach + retval.replace(ptr(1)) |
flutter_ssl_pinning.lua |
생성된 출력 예제는 example/ 디렉터리를 참조하세요.
테스트 환경
| 대상 | 상태 |
|---|
| Google Flutter (arm64-v8a) |
Google Flutter와 Shorebird 모두 동일한 libflutter.so SSL 엔진을 사용합니다.
동일한 Flutter 엔진 버전의 경우 빌드 유형에 관계없이 자동으로 발견된 RVA가 동일합니다.
빠른 트래픽 캡처 (프록시 없음)
프록시 기반 MITM을 위한 핀닝 우회 외에도, 자체 포함된 flutter_http_monitor.py를 사용하여 Frida 내에서 직접 복호화된 HTTP 트래픽을 캡처할 수 있습니다.
이 스크립트는 libflutter.so(모든 Flutter 버전, arm64)에서 BoringSSL의 SSL_write/SSL_read를 자동으로 찾아 평문 요청과 응답을 출력하는 Frida 스크립트를 생성합니다 — 재조립, 청크 해제, gzip 해제, JSON 예쁘게 출력 포함.
pip install capstone pyelftools
# 바이너리 스캔 및 모니터 생성 (또는 .apk 전달 가능)
python3 flutter_http_monitor.py path/to/libflutter.so -o monitor.js
# 앱에 대해 실행
frida -U -f com.target.app -l monitor.js
선택 사항으로, Frida REPL에서 addScope('api.example.com')를 사용하여 특정 호스트만 모니터링할 수 있습니다 (Burp 스타일 스코프). 단일 파일 — 추가로 배포할 것이 없습니다.
면책 조항
이 도구는 허가된 보안 연구 및 침투 테스트만을 위한 것입니다.
소유하지 않거나 명시적인 서면 허가를 받지 않은 앱에 대해 사용하지 마십시오.