안드로이드 모의해킹을 위한 Frida 에 대한 공부
1. Frida 란?
Frida 란?
- 프로세스를 모니터/ 디버깅하는 데 사용하는 툴킷
Frida의 주요기능
- AppMon과 Needle 의 도구에서 프리다를 기반으로 사용한다.
AppMon : MacOs, IOS 및 안드로이드에서 기본 앱에 시스템 API를 모니터링 하고 Frida를 기반으로 한다.
Needle : NWR의 IOS 보안 테스팅 프레임워크 ( drozer 와 같은 도구 ) - 함수 후킹 ( 특정 함수에 연결하여 반환 값 변경, 함수 재작성 등 )
- 애플리케이션 디버깅 기능
프로세스에서 호출하는 특정 부문을 추출하여 작동로직을 확인하고, 함수를 재작성 할 수 있다. - 힙 메모리 내 객체 인스턴스 검색 및 사용
실행중인 인스턴스화한 객체를 사용할 수 있다. - 실시간 트래픽 스니핑 또는 암호 해독
안드로이드 앱 내부에서 암호화부분을 후킹하여 암호화 전의 값을 확인할 수 있고, 변조하여 정상 값 처럼 속일 수 있다. - 탈옥 또는 루팅되지 않은 단말기에서도 사용 가능
2. Frida 환경구축
필요 도구
- 녹스
- 아나콘다 (파이썬)
- 프리다
- 프리다 서버 ( Android)
2.1. Nox
Nox 플레이어의 경우, 필자는 이전 안드로이드 InsecureBank에서 구축을 해놓은 상태이다.
환경변수 설정은 아래와 같다.
2.2. anaconda
anaconda도 마찬가지로 구축이 되어있으며, 이번에는 가상환경에서 python=3.7 버전을 사용한다.
2.3. Frida
아나콘다 가상환경에 접속해 Frida를 다운받는다.
pip install frida-tools
다운로드가 완료되었다면 추가적으로 버전확인도 진행한다.
frida --version
프리다 서버는 windows, linux, ios, android 별로 설정이 다르고, 비트도 다르다.
프리다 서버를 안드로이드 에뮬레이터에 설치하기 위해 녹스 플레이어의 비트를 확인한다.
#접속
nox_adb shell
#비트 확인
getprop ro.product.cpu.abi
이제 서버를 다운받기 위해 프리다 홈페이지에 접속한다.
Frida • A world-class dynamic instrumentation toolkit
Observe and reprogram running programs on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX
frida.re
DOCS > Tutorial - Android 선택
Frida에 관련된 모든 파일을 확인할 수 있으며, 여기서 서버를 다운받는다.
다운받은 파일을 압축을 풀고, nox 내부로 push 한다.
#nox로 push
nox_adb push C:\Android\frida-server-16.3.1-android-x86_64 /data/local/tmp
이제 지정한 폴더로 이동해서 실행시켜준다.
실행을 시킬 때에는 백그라운드에서 동작되게 끔 설정하기 위해 & 를 포함해서 명령어를 작성한다.
#백그라운드 실행
star2lte:/data/local/tmp # ./frida-server-16.3.1-android-x86_64
/frida-server-16.3.1-android-x86_64 &
3. Frida 명령어 활용
frida
- 프리다 CLI인 REPL 인터페이스로, 신속한 프로토타이핑과 손쉬운 디버깅이 목표인 도구
frida-ps
- 프리다에 연결된 프로세스 목록을 출력하기 위한 도구
frida-ls-devices
- 연결된 디바이스를 출력하는 도구
frida-trace
- 함수 호출을 동적으로 추적하기 위한 도구
frida-kill
- 프로세스를 종료하는 도구
Frida CLI
Frida CLI는 frida -h 명령어로 사용가능한 옵션을 확인할 수 있다.
frida -h
Frida가 정상적으로 작동하는지 확인을 위해, 크롬을 다운로드 받고 확인한다.
# 프로세스 확인
frida-ps -U
크롬의 패키지를 확인한 후, 프리다로 실행한다.
#프리다로 실행
frida -U <패키지 명>
Frida-ps
프리다에 연결된 프로세스 명령을 확인한다.
# 도움말 출력
frida-ps -h
실행되는 어플리케이션을 출력하는 명령어를 작성한다.
frida-ps -Ua
Frida-ls-devices
frida-ls-devices
이제 함수이름을 줘서 trace를 가동해본다.
frida-trace -i "open" -U com.android.chrome
입력창에서 입력을 하거나 클릭을 통해 타 사이트를 들어갈 때에도 open() 함수가 실행되는 것을 볼 수 있다.
이제 open 함수를 불러오는 open.js 파일을 수정한다.
여기서는 frida의 java script API를 추가하여 변경한다.
4. Frida 기본 문법
- Java.perform(fn)
- Java.use(className)
- Java.enumerateLoadedClasses(callback)
- Java.choose(className, callbacks)
- setImmediate(fn)
- Overloading
4.1. Java.perform(fn)
현재 스레드가 가상머신에 연결되어 있는지 확인하고 fn을 호출
4.2. Java.use(ClassName)
- Java.use()는 변수와 메소드에 액세스 할 수 있는 클래스 객체를 반환한다.
- 메소드 구현을 변경하려면 새로운 메소드로 덮어 써야 한다.
- 인스턴스를 반환하는 것이 아닌 클래스 객체를 반환한다.
- Java.perform 코드에 감싸져 있으며, 가상머신 연결을 확인하고 연결이 되어있다면, Java.use를 사용한다.
- 여기에서는 <com.mypackage.name> 이 가지고 있는 class 를 가져온다.
- 가져온 myClass 내부에 있는 MyMethod 라는 이름을 가진 메소드를 가져온다.
- implementation은 MyMethod라는 메소드를 불러와 MyClass 내부에 있는 MyMethod 를 재작성한다.
4.3. Java.choose(className, callbacks)
- 힙을 스캔하여 className Class에 인스턴스화된 Class를 찾는다.
- callbacks : onMatch, onComplete
- onMatch : 실시간으로 인스턴스에 대해 호출
(요청에 일치하는 것을 찾으면 하나 이상의 인수로 호출) - onComplete : function()의 모든 인스턴스가 열거될 때 호출
(모든 호출에 대한 완료)
- Java.perform 코드에 감싸있으며, 내부에 Java.choose가 실행된다.
- Java.choose는 classname을 받으며 여기서는 com.mypackage.name.class로 지정을 해준다.
- 그렇게 되면 해당 클래스에 대한 인스턴스를 onMatch 의 function(instance)로 받게 된다. (인자)
- 이후 console.log 내부에 인스턴스에 대한 값을 문자열로 출력한다.
- 모든 출력이 끝나면 OnComplete 가 실행된다.
4.4. Java.enumerateLoadedClasses(callbacks)
- 로드된 모든 클래스를 열거하고 모든 일치 항목을 출력
- onMatch : 일치하는 것을 찾으면 호출
- onComplete : 가능한 일치(Match)를 모두 마치면 사용됨
- 가능한 모든 class를 출력시키기 위해 onMatch에서 console에서 출력하려고 한다.
- 모든 출력을 마치면, Oncomplete가 실행되어 함수가 끝나게 된다.
4.5. setImmediate(fn)
- Process terminated 오류 해결한다
자세한 설명은 아래와 같다
- 자바스크립트 페이로드 작성전 유의사항이 존재한다.
- 프리다는 에뮬레이터가 느려질 때, 시간 초가 되어 연결을 자동으로 종료하는 경우가 존재한다.
- 이를 막기 위해 아래와 같이 setImmediate 함수로 포장을 한다.
스크립트 파일을 수정하여 setImmediate를 적용하면, 시간 초과가 되더라도 setImmediate가 스크립트를 자동으로 재실행하고 백그라운드로 실행되게 한다.
보통 스크립트 코드를 작성 시, 혹시 모를 상황을 대비해 작성해놓는다.
4.6. overload()
자바에서는 오버로딩이 존재한다.
같은 클래스에서 동일한 메소드 이름이 존재하지만, 입력을 받는 인자의 타입, 갯수가 달라 역활이 다르다고 생각하면 된다.
위와 같이 인자 타입, 인자의 갯수 등으로 다르게 사용하면된다.
.overload()
.overload('int')
.overload('boolean')
.overload('float')
.overload('[B')
.overload('[B', '[B', '[B')
.overload('java.io.File')
.overload('java.lang.String')
.overload('android.view.View')
.overload('android.app.Activity')
.overload('android.content.Context')
.overload('android.content.Context', 'java.lang.String')
.overload('java.lang.String', 'java.lang.String')
.overload('android.graphics.Bitmap')
.overload('java.util.List')
.overload('android.content.Context', 'java.lang.String', 'java.lang.String')
.overload('android.app.Activity', 'int', 'int', 'int', 'boolean')
[출처] 인프런 보안프로젝트 프리다(Frida)를 이용한 안드로이드 앱 모의해킹
'앱 모의해킹 > 안드로이드' 카테고리의 다른 글
Frida - FridaLab 분석 (0) | 2024.06.20 |
---|---|
Frida(2) - 후킹, 쉘 다루기 (0) | 2024.06.14 |
InsecureBank 취약점 분석 (0) | 2024.06.04 |
Drozer 프레임워크 (0) | 2024.05.30 |
안드로이드 기본개념(3) (0) | 2024.05.29 |