11/19/2018

Frida on Not Jailbreak, Not rooting Devices(비루팅/비탈옥 단말에서 프리다 사용하기)

앱 취약점 분석 시 엄청나게 활용도 높은 프리다. 예전부터 약간 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



HAHWUL

Security engineer, Gopher and H4cker!

Share: | Coffee Me:

9 comments:

  1. 글 잘읽었습니다...
    제가찾은 가장쉬운글이지만 초보장에겐
    어렵네요 ㅠ

    ReplyDelete
    Replies
    1. 앱 크래쉬 문제도 있어서 항상 성공하는 건 아닌 것 같네요 ㅜㅜ
      그냥 Jailbreak 사용이 가장 편리한 것 같습니다.
      (물론 요즘 단말 구하기가 어렵지만요)

      궁금하신 부분은 댓글 남겨주시면 아는선에서 최대한 답변드릴게요!

      Delete
  2. vim splash.smail 이코드가 어디 존재하는건가요? 아님 그냥 splash.smail 파일로 만들어 주는건가요???

    ReplyDelete
    Replies
    1. apktool d로 풀게되면 하위 디렉토리 내부에 smali code가 생성됩니다.
      I: Baksmaling classes7.dex...

      smali는 android 코드에서 Java보다 좀 더 하위 단계 언어에요. 그래서 Smali 코드단에서 frida를 로드하도록 코드를 수정해서 리패키징해주는 겁니다. 위에 예시로 드린거에선 jdgui, bcv 같은 툴로 보면 실제론 Splash.class 같은 형태의 코드입니다.

      요약하면,

      - smali는 Java보다 로우레벨 언어고, 수정해서 리패키징할 시 앱 로직을 바꿀 수 있음
      - smali 수정으로 앱 실행 단계에서 frida를 불러오도록 바꿔줌

      혹시 이해 어려운 부분 있으시면 이야기주세요 :)

      Delete
  3. 루팅을 우회하느냐 위변조를 우회하느냐 고민이로다..

    - 우회왕 -

    ReplyDelete
    Replies
    1. 루비신께서 루팅을 우회하라고 하십니다.

      irb(main):024:0> if rand(2)
      irb(main):025:1> puts 'rooting'
      irb(main):026:1> else
      irb(main):027:1> puts 'integrity'
      irb(main):028:1> end
      rooting

      Delete
  4. 간단한 CTF 예제에서 loadLibrary를 하는 부분에서 라이브러리를 frida로 명시하면 에러가 나는건 기존에 정상적으로 불러와야할 네이티브 함수를 못불러와서 에러가 난거겠죠...? 그래서 밑에 동일한 코드를 삽입했는데 실행하자마자 앱이 팅겨버리는건 무슨문제인지 도움을 요청드립니다..ㅠㅠ

    ReplyDelete
    Replies
    1. loadLibrary가있는 코드 아래쪽에 Smali를 추가했는데 위쪽에 넣으니까 되네요.....

      Delete
    2. 넵 이야기주신대로 loadLibrary 내용을 바꾸면 원래 라이브러리가 올라오지 못해서 에러날 확률이 매우 높긴하죠.

      동일한 코드로 아래쪽에 들어갔을 떈 에러 로그 봐바야 갈피를 잡을 것 같네요.
      아무쪼록 해결되서 다행입니다~

      Delete