프리다 소개

프리다(Frida)는 동적 바이너리 조사(DBI, Dynamic Bynary Instrumentation)를 가능하게 해주는 프레임워크이다.


Windows, MacOSX, GNU/Linux, Android, iOS 등의 운영체제에 존재하는 바이너리 파일을 모니터링 하거나 코드 인젝션 등을 할 수 있는 기능을 제공한다.

 

또한, 파이썬 기반의 프레임워크로 자바 스크립트, C, Swift 등의 API를 지원하므로 자신이 만든 스크립트(자바 스크립트, 파이썬)에 해당 API를 넣어 바이너리를 조사할 수 있다.


공식 홈페이지


실습 환경

실습할 모바일 앱은 OWASP(Open Web Application Security Projec) 기관에서 배포한 UnCrackable 앱이다. 깃허브(Github) 사이트에서 레벨 1 앱을 다운로드 받아 안드로이드 에뮬레이터에 설치한다.


▶ UnCrackable Mobile Apps


구분 내용
에뮬레이터 Nox
모바일 앱 UnCrackable
공격 도구 Frida

취약점 분석

루팅 된 단말기에서 모바일 앱을 설치 후 실행하면 루팅 탐지 코드가 실행되어 알림 메시지가 출력된다. 또한, OK 버튼을 클릭하면 실행 중인 앱이 강제로 종료된다.


루팅 탐지


바이너리 파일은 디컴파일을 하여 소스코드를 살펴보면 onCreate() 함수 내의 루팅 탐지 메시지가 확인된다. 해당 메시지는 c 클래스의 다양한 함수를 호출하여 조건이 참(true)이면 루팅 탐지 메시지를 출력한다.


루팅 탐지 메시지


조건을 검사하는 c 클래스의 함수들을 보면 루팅 존재 유무를 확인한다. 다음 조건 중 하나라도 일치하면 true를 반환한다.


루팅 탐지 조건


일반적으로 잘 알려진 루팅 탐지 로직은 루팅 단말기에 존재하는 파일을 실행하거나 파일의 존재 유무를 검사한다.


하지만, 해당 문자열을 어셈블리 코드에서 변경하거나 단말기 내에서 변경하면 쉽게 우회가 가능하다.


루팅 탐지 조건
- 환경 변수(PATH)에 su 존재
- 단말기의 빌드 태그
- 루팅 관련 파일
/system/app/Superuser.apk
/system/xbin/daemonsu
/system/etc/init.d/99SuperSUDaemon
/system/bin/.ext/.su
/system/etc/.has_su_daemon
/system/etc/.installed_su_daemon
/dev/com.koushikdutta.superuser.daemon/

루팅 탐지 조건이 참일 경우 a() 함수에 루팅 탐지 메시지를 전달하고, 사용자가 OK 버튼을 누르면 exit() 함수가 호출되어 앱이 종료된다.


앱 종료


공격 코드 실행

OK 버튼을 누르면 exit() 함수가 호출되므로 해당 함수를 후킹하여 문자열만 출력하도록 변조하면 앱이 종료되지 않는다.


import frida, sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

PACKAGE_NAME = "owasp.mstg.uncrackable1"

jscode = """
setImmediate(function(){
    Java.perform(function(){
        console.log("[*] Hooking System.exit");
        var exitBypass = Java.use("java.lang.System");
        exitBypass.exit.implementation = function() {
            console.log("[*] System.exit Success");
        }
    })
});
"""

try:
    print('[*] By Daze !!!')
    print('')
    device = frida.get_usb_device(timeout=5)
    pid = device.spawn([PACKAGE_NAME])  
    print("App is starting ... pid : {}".format(pid))
    process = device.attach(pid)
    device.resume(pid)
    script = process.create_script(jscode)
    script.on('message',on_message)
    print('[*] Running Hook')
    script.load()
    sys.stdin.read()
except Exception as e:
    print(e)

콘솔 창에서 후킹 스크립트를 실행하면 자동으로 앱이 실행되면서 루팅 탐지 메시지가 출력된다. 이후 OK 버튼을 누르면 후킹 성공 메시지가 출력되고, 앱이 종료되지 않는다.


후킹 스크립트 실행


루팅 탐지 우회


대응 방안

루팅을 탐지하는 과정을 최초 실행 뿐만 아니라 중요한 정보를 전송하거나 중요한 거래 등을 이용할 때도 루팅된 단말기인지 재확인할 수 있는 절차를 적용해야 한다.


▶ iOS 탈옥 탐지 우회 (Frida, Ghidra)

▶ iOS 바이너리 패칭 (앱 위변조)

▶ 안드로이드 암호화 구현 취약점 (Android AES 복호화)

▶ 안드로이드 매개변수 조작 취약점 (Android Parameter Manipulation)

▶ 안드로이드 디컴파일 방법 및 jadx 사용법

▶ 안드로이드 인시큐어뱅크 앱 설치 (Android InsecureBankv2)

▶ Android Drozer 설치 및 사용법

▶ 안드로이드 환경구축 ( 취약점 분석)

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유