앱 취약점 분석 시 엄청나게 활용도 높은 프리다. 예전부터 약간 Jailbreak, rooting 단말에서만 동작한다는 편견이 있었는데요.

재미있는 트릭을 이용하면 비루팅/비탈옥 단말에서도 프리다 사용이 가능합니다. 프리다 공식 홈에도 있는 내용이니 참고하시길 바랍니다 :)

How?

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

정리하면 이렇습니다.

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

Step by step(Android/iOS)

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

1. 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) 파일 하나가 남습니다. 이제 라이브러리 파일을 앱에 넣어야하기 떄문에 앱을 풀어줍니다. 

2. 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

3. 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 ]
여긴 그냥 툴 쓰시는게 편할듯합니다. 저는 탈옥 기기로 하는지라, 트러블슈팅까진 어려울듯하네요 ㅜㅜ
#> insert_dylib frida.dylib test
(https://github.com/Tyilo/insert_dylib)

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

#> grep * -R “loadLibrary"

4. 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 이란 이름으로 잡힙니다.

번외 - iOS

공식 홈 내용 일부입니다. frida 깃에서 FridaGadget 떙긴 후 XCode를 이용해 삽입하는 방법입니다.
링크 읽어보시길..

https://www.frida.re/docs/ios/#without-jailbreak

$ 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
$ 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

댓글 없음:

댓글 쓰기