Skip to the content.

SSL PINNING

최근 대부분의 앱에서 프록시 툴(burp, fiddler)을 이용하여 동적진단이 어려워졌습니다..

이유는 SSL PINNING에 있습니다. 최근 구글, 트위터, 금융앱 등에서 SSL PINNING은 이용하고 있는데,

앱은 디바이스의 신뢰할 수 있는 저장소를 무시하고 자체적으로 앱 내부에 저장된 인증서로 서명된 호스트에 SSL 연결을 맺고있습니다. 따라서 우리는 디바이스에 버프인증서와 같은 프록시 툴 인증서로 SSL 연결을 맺기 어려워졌습니다.

하지만 위의 과정은 클라이언트 측 (앱)에서 이루어지는 것이기 때문에 frida 혹은 별도 툴로 우회할 수 있는데, 이번엔 루팅되지 않는 안드로이드 환경에서 SSL PINNING 우회할 수 있는 두 가지 기술에 대해 알아보겠습니다.

1. Xposed Framework

Xposed Framework는 프레임워크로 해당 프레임워크를 설치한 후 여러가지 모듈들을 작동시킬 수 있습니다.

사실 Xposed Frimework를 설치하기 위해선 Xposed Installer에서 리커버리 모드에 진입하여 friamework를 설치해야하기 때문에 루팅이 된 단말에서 설치하려 동작시킬 수 있지만, 녹스에뮬레이터 환경에선 루팅을 활성/비활성 할 수 있는 기능이 있기 때문에 루팅을 활성화 한 후 프레임워크 및 이용하고자 하는 모듈을 설치하고 루팅을 비활성화 한 후 우회 기능을 동작시킬 수 있습니다.

먼저 Xposed Framework를 설치하기위해 우리는 아래 2 가지 항목을 다운로드받아야합니다.

  1. Xposed Installer apk (https://forum.xda-developers.com/showthread.php?t=3034811)
  2. JustTrustMe apk (실제 pinning우회 기능을 하는 모듈)(https://github.com/Fuzion24/JustTrustMe/releases/tag/v.2)
    (참고로 롤리팝(5.X)버전으로 테스트를 진행했으며, 최근엔 누가(7.X)버전에서도 안정화 되었다고 하니 각 환경에 맞게 진행하면 될 것 같습니다.)

그리고 adb install XposedInstaller_3.1.5.apk 명령어 혹은 에뮬레이터에 apk를 마우스로 끌어다 놓으면 xposed installer가 설치됩니다.

Xposed Framework 설치

설치된 xposed installer을 실행 시키면 아래와 같은 화면이 출력됩니다.

XPOSED 프레임워크 설치 및 없데이트 메뉴를 눌러 Install 한 후 단말기를 재시작합니다.

xposed installer 를 실행시키면 정상적으로 프레임워크가 설치되었음을 확인할 수 있습니다.

JustTrustMe 설치

그리고 adb install XposedInstaller_3.1.5.apk 명령어 혹은 에뮬레이터에 apk를 마우스로 끌어다 놓으면 JustTrustme가 설치됩니다.

설치된 후 xposed installer에서 위의 모듈을 활성화 시켜줘야 하는데 Modules메뉴에서 활성화 시켜주시면 됩니다.

그리고 녹스 에뮬레이터에서 루팅을 비활성화 한 후 앱을 실행시키면 아래와 같이 SSL Pinning가 우회 되는 것을 확인할 수 있습니다.

2. frida-gadget

위와 같이 xposed를 사용해서 sslpinning를 하여 동적진단을 모든앱에서 가능하다면 정말 좋겠지만. 솔루션에서 xposed를 악성앱으로 탐지하여 실행이 되지 않는 경우가 있습니다. 여러가지 삽집을 통해 확인 한 xposed 외에 다른 방법으로는 frida-gadget를 사용하는 방법이 있습니다.

frida를 사용하기 위해선 루팅이된 환경에서 frida-server 단말에서 실행시키고 클라이언트에서 frida 명령어를 통해 단말과 attach 시킨 후 hooking을 할 수 있었습니다. 결론적으로 단말에서 frida-server을 실행시키는 것이 frida를 사용할 수 있는 가장 중요한 점이었고 그것을 위해서는 단말이 루팅이 된 상태여야만 했습니다. 그러나 대부분의 앱들에서 루팅을 차단하고 있었고 frida를 사용하기가 어려웠는데..

그러던 중 frida-gadget이라는 툴을 찾았습니다.

frida-gadget은 frida와는 frida-server을 실행시키는 방법이 달랐는데, 앱의 lib폴더에 frida-server파일을 넣고 바이너리코드에 frida-server를 실행시키는 구조입니다. 결론적으로 앱을 실행 시켰을 때 앱이 실행되면서 자동으로 lib내의 frida-server를 실행시킵니다. 그런 후 클라이언트에서 frida 명령어를 통해 단말과 attach 한 후 hooking코드를 실행시키면 됩니다.

과정은 아래와 같습니다.

  1. 앱 추출
  2. 디컴파일
  3. 메인 액티비티 smali코드에 아래코드 삽입하고 frida-gadget 라이브러리 삽입

const-string v0, "frida-gadget"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V 
  1. 앱 컴파일 후 설치
  2. 앱 실행 하면서 frida -U gadget -l hook.js

메인액티비티 찾는법


adb shell "dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'"

상기 명령어를 입력하면 현재 뷰에 대한 경로(main activity) 확인으로 가능하다.

물론 앱에서 무결성 체크를 하면 위의 방법도 안됩니다.. ㅎㅎ

위의 과정은 별도로 게시할 예정입니다.