ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Frida, adb 설정 & OWASP UnCrackable-Level1.apk
    Hacking/Android 2019. 12. 29. 17:36

    한동안 블로그에 글을 포스팅 하지 못했다.

    나름대로 많은 일들이 있었지만 사정상 올리진 못할 것 같다.

    뭔가 블로그에 공백기가 생기는 것 같아서 맘에 안들지만

    복습도 할 수 있었고 부족한 것들을 채워넣을 수 있던 경험이었다





    이번에는 Android 공부를 진행해보려고 한다. 

    기본적인 셋팅부터 차근차근 진행해보도록 하자.




    루팅폰이 필요했는데 이미 예전에 드론 해킹을 진행하기위해

    루팅을 진행해놓은 폰이 있었다. 나는 Nexus 5X를 이용했다.

    나쁘지 않다ㅎㅎ(중고로 구매하는 것도 추천!)

    * 루팅 폰이 없다면 Nox 같은 에뮬레이터를 사용하자! *




    우선 분석할 Target을 선정해주자. 나는 공부와 연습을 위해

    OWASP의  UnCrackable-Leve1.apk를 이용하기로 했다.



    OWASP UnCrackable 문제 링크 

    https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/README.md





    adb를 설치해보도록 하자.

    brew install android-platform-tools를 이용해서 설치하면 된다.

    설치가 제대로 완료되었다면 adb version을 입력 시

    다음과 같은 화면을 만날 수 있다.





    그러면 루팅된 Nexus 5X에 한 번 apk를 올려보도록 하자.

    스마트폰과 연결하는 방법은 일반적으로 2가지가 있다.

    너무나 당연하지만 하나는 유선, 하나는 무선이다.

    연결하기전 스마트폰에서 개발자 옵션을 활성화 시키고

    (보통 디바이스 정보 -> 소프트웨어 정보 -> 빌드번호 연속으로 눌러주면 됨)




    개발자 옵션 내부에 USB디버깅을 켜주어야 한다.





    유선의 경우는 안드로이드 폰을 연결 한 뒤, adb devices를 이용하면

    스마트폰에 정보를 확인할 수 있고 adb -s 를 이용해서 연결을 진행하면 된다.



    무선으로 adb를 이용해야할 경우는 다음과 같이 진행하면 된다.

    당연한 제약 조건이 하나 따르는데 그건 바로 연결할 PC와 스마트폰이

    같은 무선환경에 있어야 한다는 것이다. PC와 스마트폰 모두 같은 공유기에 붙자!

    PC와 스마트폰을 유선으로 연결한 다음 아래의 명령어를 진행해주자.


    adb tcipip 포트

    위와 같은 화면을 만난다면 제대로 성공한 것이다.




    그럼 이제 유선 연결을 해제하고 아래의 명령어를 진행하자

    adb connect 스마트폰ip:포트

    제대로 성공한 것을 확인할 수 있었다.





    유선에서 사용했던 것 처럼 adb -s 를 이용해서 사용해주면 된다.

    무선의 경우 반응속도가 느리다. 그러므로 유선을 사용할 수 있다면

    유선을 사용하자^^ 굳이 무선을 사용하는 것은 비추천이다...ㅎㅎ(답답)





    해당 apk문제를 다운로드 받은 뒤에 스마트폰에 설치해보도록 하자.

    adb install을 이용해서 진행하면된다. (sudo를 빼먹지말자!)

    설치가 왼료되면 어플 목록에서 제대로 설치된 것을 확인 할 수 있다.




    그러면 이제 Level1.apk를 한 번 실행시켜보겠다.

    루팅이 탐지되어서 app이 종료되는 것을 확인 할 수 있었다..




    그럼 해당 app을 분석하기 위해서 apk파일을 디컴파일 해봐야 겠다.

    디컴파일하기위해서는 두 가지 툴을 이용할 것이다.

    하나는 dexjar이고 다른 하나는 jd-gui 이다.



    apk는 달빅머신에서 돌아가는 dex파일을 포함하고 있다.

    dex파일 : Java 소스코드를 컴파일한 파일

    때문에 이 파일을 디컴파일 하면 Java 소스를 확인할 수 있다.


    * Mac OS 설치방법 *

    brew install dex2jar


    *사용법 *

    d2j-dex2jar 디컴파일 apk 파일

    -> .jar 파일이 생성된 것을 확인할 수 있다.



    * Java 그냥 참고.. ㅎㅎ *

    Java의 경우 컴파일시, 자바코드를 가상머신이 이해할 수 있는 자바 바이트 코드로 변환한다. 

    자바 바이트 코드란 : Java 컴파일러에 의해 변환되는 코드로 명령어 크기가 1byte라

    자바 바이트 코드라고 불리며 .class 확장자를 가진다. 자바의 경우 가상머신만 설치되어

    있다면 어떠한 운영체제에서도 실행이 가능하다. 하지만 이 Java 가상머신(JVM)이

    운영체제에 종속적이기 때문에 각각의 운영체제에 맞는 JVM을 설치해주어야 한다.

    Java 프로그램은 무조건 JVM을 거치기 때문에 상대적으로 실행속도가 느린 편이다.




    jd-gui는 이렇게 디컴파일된 jar파일을 보기위해서 사용하는 것이다.

    설치에 대해서는 간단하게 링크를 걸어 두었다. 나는 Mac에서 진행하고 있다.

    설치 링크 : http://java-decompiler.github.io/



    jd-gui로 .jar파일을 open한 화면이다. 

    이제 어떻게 문제를 풀 수 있을지 생각해보자




    우선, 우리는 Frida를 이용해서 Hooking을 진행할 것이기 때문에

    Frida 관련 설정을 먼저 진행한 뒤, 어떻게 풀어나갈 것인지 생각해보자.




    Frida를 이용하기 위해서는 device에 frida-sever를 올려 실행시켜야 한다.

    device의 정보는 다음과 같은 명령어를 진행하여 확인할 수 있다.

    getprop ro.product.cpu.abilist



    확인을 했다면 그에 맞는 frida-server를 설치해주면 된다.

    frida-server Download https://github.com/frida/frida/releases




    설치를 완료했다면 adb를 이용해서 devices에 push 해주도록 한다.

    adb push frida-server명 /data/local/tmp

    (-s 옵션을 준 이유는 adb를 이용할 장치를 식별해주기 위함이다. 한 대만 연결중이라면 굳이 필요없다.)



    실행권한이 필요함으로 실행권한도 부여해주도록 하자.

    chmod 777 frida-server



    권한까지 다 주었다면 백그라운드로 실행시키자.

    ./frida-server &




    제대로 실행되었는지 확인하는 방법은 ps를 이용해도 되지만

    Frida를 이용해도 된다. 간단한 명령어로 확인이 가능하다.

    frida-ps -U





    이제 Frida Setting이 끝났다. 그럼 다시 문제로 돌아와서 분석을 진행해보자.





    해당 어플리케이션은 실행 시, 루팅을 탐지한다. 루팅을 탐지하는 로직을 우선 확인해보자




    MainActivity가 제일먼저 실행되는데 onCreate로 루팅을 탐지한다.



    if문을 통해서 루팅을 탐지하는데 해당 함수 중 하나라도 true가 발생하면

    a( )가 호출되면서 This is unacceptable ~~~라는 메세지의 Dialog가

    나타난다. 이 때 나타난 "OK" 버튼을 클릭하게되면 System.exit(0)이

    호출되면서 앱이 종료되는 로직이라는 것을 알 수 있다.



    그러므로 System.exit( )를 Hooking하여 루팅 탐지 Dialog 나타나도

    앱이 종료되지 않도록 Hooking 진행을 진행하면 된다.


    우선 frida를 이용해서 프로세스를 확인해주자.

    스마트폰으로  UnCrackable-Leve1.apk을 실행시키고 확인하면 된다.

    명령어 : frida-ps -U 



    우리는 Python과 Java를 이용해서 스크립트를 짤 것인데

    frida를 이용할 것이다. 우선 우리가 Hooking하려는 Process

    "owasp.mstg.uncrackable1"을 메모해두자.



    Java.perform( )의 인자로 후킹스크립트를 넘겨주면 된다.

    후킹 스크립트 원리는 다음과 같다. Java.use( )를 사용해서

    exit( ) 메소드가 존재하는 클래스를 호출 한 뒤, exit.implementation을

    이용해서 exit( )를 재정의(?)해주면 된다. 진행해보자.

    아까 기록해두던 owasp.mstg.uncrackable1을 Hook_package로 걸어서 스크립트를 작성!





    "OK"버튼을 눌러도 앱이 종료되지 않는 것을 확인했다.

    그러면 이제 첫 번째 관문을 넘긴 것이다. 


    창을 닫고나니 Secret String을 맞춰야한다는 것을 알 수 있었다. 

    그렇다면 다시 한 번 코드를 분석해보자.




    비교적 간단한 코드를 확인할 수 있다. a.a(str)을 true로 만들면

    "Success"를 띄울 수 있다. 때문에 a.a( )를 분석해보자.



    해당 코드를 보니 인자로 넘어온 paramString과 array0fByte를 equals로 비교하는데

    array0fByte는 어떠한 String을 sg.vantagepoint.a.a.a()를

    이용하여 복호화한 값이 저장된다는 것을 알 수 있다. 또한

    사용자로부터 입력받은 paramString과 array0fByte를 비교해서 맞으면

    결과가 "true" 틀리면 "false"가 return되어 정답의 유무 메세지가 

    출력되는 로직이라는 것을 확인할 수 있었다.




    때문에 여기서 비교기준이 되는 array0fByte가 Secret Code라는 것을 알 수 있다.

    그렇다면 array0fByte를 복호화해주는 sg.vantagepoint.a.a.a( )를 Hooking을 후킹해서

    복호화 된 값을 출력해주면 Secret String을 확인할 수 있을 것이고 확인한

    Secret String을 입력해보면 확실하게 찾았는지 확인할 수 있을 것이다.




    < Hooking Script >

    위의 Hooking Script를 진행하고 Verify버튼을 누르면

    다음과 같은 Secret String을 확인할 수 있다.





    그럼 이제 정답이 맞는지 확인해보도록 하겠다!!





    정답을 확인할 수 있었다!!!





    반응형

    'Hacking > Android' 카테고리의 다른 글

    InsecureBankv2 분석 및 Hooking  (0) 2020.01.08

    댓글

Designed by Tistory.