비루팅/비탈옥 단말에서 프리다 사용하기 (Frida Inject DL for no-jail, no-root)

앱 취약점 분석 시 엄청나게 활용도 높은 프리다. 예전부터 약간 Jailbreak, rooting 단말에서만 동작한다는 편견이 있었는데요. 재미있는 트릭을 이용하면 비루팅/비탈옥 단말에서도 프리다 사용이 가능합니다. 프리다 공식 홈에도 있는 내용이니 참고하시길 바랍니다 :)

Frida Gadget

Frida 공식 홈에선 Frida gadget 이란 이름으로 소개되고 있습니다. 그 말인 즉슨 분석할 앱에 Frida의 Dynamic library를 넣어 실행하게 하여 마치 frida-server가 떠있는 것과 동일한 효과를 만들 수 있습니다. 일반적인 frida 사용과 동일하게 대상 어플리케이션에 대해 attach 하고 hooking 할 수 있습니다.

정리하면 이렇습니다.

  • 비탈옥/비루팅 단말에선 권한에 제약이 있기 떄문에 frida-server를 띄울 수 없음
  • 단 앱을 통해 frida-server 처럼 구현할 순 있지만 앱 간 권한으로 간섭이 불가능하기 떄문에 실질직인 분석은 불가능함
  • 그래서 분석할 앱에 프리다 코드를 넣고 동작시키게 하여 프리다가 해당 앱을 attach 할 수 있도록 함

Step by step

우리가 해야할일은 프리다 라이브러리를 앱에 집어넣고 실행해야 합니다. 우선 프리다 라이브러리를 다운로드 받습니다.

Download frida library

릴리즈 버전, iOS / Android 유무에 따라 링크는 바뀔 수 있습니다. 아래 깃에서 뒤적뒤적해서 맞는 버전으로 다운로드 하시면 됩니다.

wget https://github.com/frida/frida/releases/download/9.1.26/frida-gadget-9.1.26-android-arm.so.xz
unxz frida-gadget-9.1.26-android-arm.so.xz

압축을 받고 풀어주면 .so(ios는 .dylib) 파일 하나가 남습니다. 이제 라이브러리 파일을 앱에 넣어야하기 떄문에 앱을 풀어줍니다.

Extract Application(Apk,Ipa)

Android

apktool d base.apk
I: Using Apktool 2.3.1 on base.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources…
….
I: Baksmaling classes7.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

iOS

unzip test.ipa

Inject Dynamic Library and Byte code

그다음 라이브러리 파일을 넣어줍니다. Android의 경우는 보통 lib 하위, iOS는 바이너리에 직접 주입합니다. (frida 홈에선 따로 앱을 만드는 방식을 추천하네요. 참고) 그리고 삽입한 라이브러리를 코드단에서 로드할 수 있도록 smail 코드단을 수정해서 라이브러리를 로드해줍니다.

Android

cp frida-gadget-9.1.26-android-arm.so base/lib/armeabi/libfrida.so
vim splash.smail
....
const-string v1, "frida”
invoke-static {v1}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

// byte 코드 풀어서 보면 결국 loadLibrary("frida") 이며 앱 라이브러리 디렉토리에서 frida라는 이름의 라이브러리를 읽습니다.
// 그래서 아까 넣은 libfrida.so가 로드됩니다. 

iOS - sert_dylib

iOS에선 Tyilo의 insert_dylib 를 사용하면 쉽게 inject할 수 있습니다.

insert_dylib frida.dylib test

아주 먼지같은 팁이지만, loadLibray 시 앱이 죽는 경우도 있을 수 있어(앱이 크면 더더욱) 삽입 구간을 잘 골라야합니다. 보통은 바로 트리거될 수 있게 splash, main의 oncreate 등에도 많이 넣고 다른 라이브러리 불러오는 구간에서 같이 로드시키면 에러나 비정상 동작할 가능성이 줄어듭니다. 그래서 코드단에서 grep 으로 포인트 찾아보고 주입하는게 좋습니다.

grep * -R “loadLibrary"

iOS - XCode

아까 DL Inject 부분에서 iOS는 도구를 사용하여 삽입했었는데요. 정석으로 해보자면 frida 깃에서 FridaGadget 가져온 후 XCode를 이용해 삽입하여 Gadget을 주입할 수 있습니다.

FridaGadget.dylib를 버전에 맞게 다운로드합니다.

mkdir Frameworks
cd Frameworks
frida_version=x.y.z
curl https://github.com/frida/frida/releases/download/$frida_version/frida-gadget-$frida_version-ios-univers\al.dylib.xz | xz -d > FridaGadget.dylib

다음 Apple 개발자 계정 사이닝으로 코드 사인합니다. 이후 XCode에서 로드하여 Lib를 포함하면 됩니다.

security find-identity -p codesigning -v
  1) A30E15162B3EB979D2572783BF3… "Developer ID Application: …"
  2) E18BA16DF86318F0ECA4BE17C03… "iPhone Developer: …"
     2 valid identities found
codesign -f -s E18BA16DF86318F0ECA4BE17C03… FridaGadget.dylib
FridaGadget.dylib: replacing existing signature

Repackaging App

다시 앱을 묶어 주고 서명합니다. 그럼 일단 본인의 키 파일으로 frida 코드가 주입된 앱은 만들 수 있습니다.

Android

apktool b -o 123.apk base/
jarsigner -sigalg SHA1withRSA -digestalg SHA1 \
-keystore custom.keystore \
-storepass test1234 123.apk hwul

iOS

codesign -f -s E18BA16DF86318F0ECA4BE17C03… test/test.app/test
zip test.zip ./test/ -R
mv test.zip inject.ipa

이제 frida-ps로 보면..

frida-ps -U
Waiting for USB device to appear...
  PID  Name
-----  ------
2025  Gadget

이런식으로 Gadget 이란 이름으로 잡힙니다.

References

  • https://www.frida.re/docs/ios/#without-jailbreak
  • https://github.com/Tyilo/insert_dylib