무결성이란?

: 정보보호 3요소 중 하나로 영어로 Integrity이며, 정보가 오직 허가된 사람에게만 개방되고 수정될 수 있음을 보장하는 것

  • 모바일 애플리케이션에서 의미하는 무결성은 애플리케이션의 개발자가 아닌 타인(악의적인 사용자)이 애플리케이션을 위/변조할 수 있느냐를 판단하는 기준
  • 일반적으로 금융앱을 제외하고는 무결성 체크로직을 구현하지 않지만 구현하는 경우에도 우회가 가능한 경우 존재
  • 무결성 로직이 미존재하면 정상 애플리케이션을 악의적인 목적으로 위/변조하여 유포 및 재설치를 통해 단말기 정보 및 단말기 내 중요정보 유출 가능


무결성 확인 
  1. 무결성 체크 로직 미존재

            * 무결성 체크 로직이 존재하지 않는 경우, 애플리케이션 명을 변경 후 재설치 시 정상적으로 실행되는 지 확인한다.

            1) 변경 전 애플리케이션 명 확인 - SIK-C1

            2) 애플리케이션 추출 후 디컴파일

                 자세한 내용은 이전 게시물 참조: http://securitynote.tistory.com/7?category=788948

            3) AndroidManifest.xml 파일 열기
                                

            4) intet-filter 태그 내에 android:label="@String/app-name" 옵션 변경

        
                    @String/app-name 부분을 변경하고자 하는 이름으로 바꾼다.



            5) 변조한 앱 재컴파일, 서명 후 설치 시 정상 실행 확인
            
                


            ★ 이렇게 간단한 조작을 통해 무결성 테스트를 진행한다. 이 때, 정상적으로 앱이 실행이 되지 않으면 무결성 체크 로직 우회를 시도한다.

→ 자세한 내용은 다음 포스팅에서...!!



아이폰(IOS) 취약점 점검 환경 구성

IOS 취약점 점검을 하려면 일단 몇가지 프로그램을 설치해야 한다. 

  1. 아이폰 탈옥
            일단, 대부분의 취약점 점검이 탈옥된 환경에서 진행되므로 아이폰을 탈옥해야한다. 

            - 탈옥 방법에 대해서는 IOS 버전에 따라 다르므로 확인 후 진행하도록 한다.
            - 나는 Pheonix툴을 사용해서 진행했는데 아직도 꾸준히 많이 사용하고 있는 툴인것 같다. 
            - 탈옥 후 전원을 끄면 탈옥이 풀리므로 주의한다.

            - 탈옥 후 기기에 cydia 앱이 깔리는데 이를 통해  3rd party app 다운로드 가능
           
            - cydia 가본 앱 설치
                      1)  cydia 소스 추가 : http://repo.biteyourapple.net
                      2) openssh 설치 : ssh 접근을 위해 필요
                      3) bigboss recommand tool 설치 (wget 등)
                      4) clutch 설치 : ipa 복호화 도구  -> 설치 후 권한 바꾸기
                      5) snoopit 설치 
                      6) Apple File Conduit "2" 설치 : ifunbox에서 jailbroken 확인 및 연결
                      7) cycript : 함수 변조
                      8) class-dump-z : 클래스 내 오브젝트 분석

  1. Itunes (아이튠즈) 최신 버전 다운로드

                → https://www.apple.com/kr/itunes/download/
           
  1. Ifunbox (아이펀박스) 최신 버전 다운로드

                → http://www.i-funbox.com/en_download.html

           


안드로이드 스튜디오(Android Studio)를 이용한 동적디버깅

1. 디버깅할 APP을 apktool로 디컴파일

2. 디컴파일한 폴더의 AndroidManifest.xml를 열고 <application> 태그 내에 android:debuggable="true" 옵션 추가 후 저장
ex) <application android:icon="@drawable/app_icon" android:debuggable="true" ...
** 일반적으로 앱스토어에서 다운받은 앱은 android:debuggalbe 속성이 존재하지 않거나 false로 처리되어있다.  
→ true인 경우, 앱스토어에 올릴 수 없음


3. 재컴파일 후 디바이스에 설치

4. 디버거 연결 대기 ON  :: 디바이스에서 설정 > 개발자 옵션 > USB 디버깅 ON > 디버깅할 앱 선택 > debuggable 옵션을 준 앱 선택 



6. 안드로이드 스튜디오에 설치한 뒤 재시작 :: File > Settings > Plugins > Install plugin from disk...


7. 안드로이드 스튜디오 실행 시 Open an existing Android Studio project를 클릭하여 디버깅할 앱의 smali 폴더를 지정하여 실행
* android studio를 켰을 때 좌측에 파일들이 보이지 않을 경우 상단의 Android라고 되어 있는 부분을 클릭하여 Project로 선택

8. Run > Edit Configurations > + > Remote 선택하여 나온 탭에서 Settings의 Port를 8700으로 변경 후 저장


9. [Help - Find Action] 클릭 후 monitor 검색 및 실행
* 만약 안켜질 경우 [SDK 설치 폴더 - tools - monitor.bat] 실행
ex) C:\Users\KJY\AppData\Local\Android\Sdk\tools 


10. 진단폰에서 디버깅할 APP 실행 시 디버거 대기 창이 뜨고 이 때 monitor에서 빨간색 디버깅모양이 뜨면 정상

11. 안드로이드 스튜디오 내에서 브레이크 포인트를 건 뒤 Shift+F9를 눌러 디버깅 



JEB2를 이용한 동적디버깅

    1. 위의 1~4과정 진행 혹은 dirtyC0w를 이용하여 디버깅 가능상태 만들기

    2. 디버깅할 앱의 패키지와 액티비티명 확인

    3. 현재 실행중인 애플리케이션 중에서 디버깅 플래그 값을 확일할 수 있게끔 명령어 실행

        adb shell am start -D -n [패키지 이름/액티비티]
                 
    -D : 디버깅 가능하도록 플래그 추가
                 -n : 네이티브 힙메모리 덤프



    4. JEB2에서 디버깅 시작 :: Debugger > Start (혹은 벌레모양 아이콘 클릭)


    5. 디버거에 디버깅할 앱 Attach
    ** 하단의 Suspend all threads 체크한다


    6. 필요한 곳에 break point를 설정하여 디버깅 진행 (Ctrl+b)


    DirtyC0w(더티카우) 취약점 (CVE-2016-5195)

    1. 개요
             1) DirtyC0w (더티카우) 취약점이란?
                : 2016년 10월 CVE-2016-5195 취약점
                : 루트 권한으로도 변경할 수 없었던 default.prop 파일을 익스플로잇을 통해 수정 가능하도록 하는 취약점
                : 디바이스를 재시작하는 경우, default.prop이 초기 설정으로 돌아가기 때문에 다시 수정해주어야함.

    1. 필요성
            1) 안드로이드 apk 파일 동적 디버깅 시, Manifest.xml 파일에 android:debuggable="true"라는 옵션이 있어야 디버깅이 가능하다.
                무결성 검증을 하는 앱의 경우, Manifest.xml 파일만 변경해도 무결성 탐지가 일어나므로 무결성 우회를 하지 않는 이상 디버깅이 불가능하다.
                따라서, 더티카우 취약점을 이용해 default.prop 파일 변경

            2) 매번 Manifest.xml파일을 변경하기 귀찮으므로 수월하게 default.prop 파일 변경


    1. 방법
            ** <안드로이드 애플리케이션 리버스 엔지니어링 - 남대현, 류재형 저>책에 나와 있는대로 시도해 보았지만 
    계속 에러가 나서 익스플로잇 코드로는 실행해보지 못함..ㅠㅠ
                 → 안드로이드 애플리케이션의 기본적인 점검 방법부터 약간의 후킹 방법까지 잘 나와있는 책이므로 추천

             그래서 인터넷 검색 도중 앱으로 쉽게 default.prop을 바꿀 수 있는 방법을 찾아냈당!! (그러면 결론적으로 dirtyC0w 익스플로잇을 한것과 동일해짐)



           

             1)  플레이스토어에서 Root Explorer를 다운받는다.
                 ** 유료 앱이므로 http://ko.apkhere.com/app/com.speedsoftware.rootexplorer 에서 apk를 다운받아 디바이스로 옮기는 것을 추천
                 ** 비슷하게 생긴 Explorer 앱이랑은 다른 기능을 가지고 있으므로 다운 시 유의! 



           2) 앱을 실행시킨 후 default.prop 파일의 ro.debuggable 속성 정보 확인

            → ro.debuggable의 속성값이 1이 되면 디버깅이 가능해짐
            → 처음에는 해당 파일의 권한이 644가 아니라 444로 설정되어있던것 것으로 기억하므로 3)번 과정을 수행해야 파일 수정이 가능할 것이다...
            


           3) 파일 권한 바꾸기 (최소 600)


           4) 이제 default.prop 파일 편집이 가능하다! 편집기로 텍스트를 열고 ro.debuggable=1로 변경하고 저장하면 끝!!!






    2020-01-30 수정

    해당 내용으로 인터넷 검색 도중 과거에 포스팅한 내용이 현재에는 실행이 불가능한 것을 알게되어 수정한다. 


    어느 중국인이 포스팅한 내용이다. 


    #0. mprop 파일 다운로드

    https://github.com/wpvsyou/mprop에 들어가 mprop 파일을 다운받는다. 


    이제 다운받은 mprop 파일을 디바이스에 삽입하고 실행 권한을 준뒤 실행시키면 익스플로잇 코드가 실행되면서 ro.debuggable이 0에서 1로 변경된다. 


    #1. 현재 설정값 확인

    일단 getprop ro.debuggable 명령어를 통해 현재 값을 확인한다.

       ※ 익스플로잇 전에는 설정값이 0임


    #2. mprop 파일 기기에 설치 후 권한 변경

    > adb push mprop /data/local/tmp     //mprop 파일 기기로 이동

    > adb shell    // adb 연결


    shell@b1:/$ su   // 루트 접근

    root@b1:/# chmod 777 /data/local/tmp/mprop     // mprop 권한 변경


    root@b1:/# cd /data/local/tmp              // 현재 위치 이동

    root@b1:/# ./mprop ro.debuggable 1     // mprop 실행


    mprop 실행 시 익스플로잇이 실행되면서 다음과 같은 결과를 출력하며 끝난다. 

    이 때, patched ~ 이부분이 뜨지 않는 경우 마지막 명령어를 다시한번 실행시켜준다.


    0001ffa0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffb0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffc0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffd0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffe0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001fff0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    patching it at:0xb6e81904[0xb6f388fc], value:[0x00000030 -> 0x00000031]

    patching it at:0xb6e81900[0xb6f388f8], value:[0x01000000 -> 0x01000000]

    patched, reread: [0xb6f388fc] => 0x00000031

    patched, reread: [0xb6f388f8] => 0x01000000


    #3. 변경된 설정값 확인

    이제 ro.debuggable 값이 1로 변경된 것을 확인할 수 있을 것이다!!

    하지만 이전에 설명한 root explorer로 default.prop 파일을 확인하면 값이 변하지 않았으므로 getprop ro.debuggable 명령어로 꼭 확인할것!!


    그리고 디바이스를 재실행하면 해당 값도 다시 0으로 초기화되므로 주의하자



    더 자세한 설명은 https://www.bodkin.ren/index.php/archives/533/ 참조.....(중국어임.....)


    안드로이드 취약점 점검 시 자주 사용하거나 알아두면 유용한 adb 명령어에 대해 정리할 예정이다!

    먼저 adb가 무엇인지부터 짚고 넘어가자.

    adb란?

    : Android Debug Bridge의 약자로서 명령줄 도구
    : 앱 개발자가 데스크톱 컴퓨터를 사용해 연결된 Android 디바이스와 통신하거나 디바이스 애뮬레이터를 실행할 수 있도록 도와주는 도구
    : 안드로이드 취약점 점검 시에는 루트 권한으로 명령어를 사용하기 위해 루팅된 폰에서 많이 사용한다.


    adb 명령어

    아직 adb를 사용해 본적이 없다면 이전 포스팅에 설명한 설정과정부터 진행하고 와야한다.

    지난번 포스팅에서도 설명했던 명령어도 포함하여 설명한다.

    1. 연결된 device 목록 확인

          adb devices 

    1. 연결된 디바이스의 리모트 쉘 실행

    1)  adb shell 

    한개의 디바이스나 애뮬레이터가 연결되어 있으면 기본 명령어로 실행이 가능하지만 1개이상이면 실행이 불가능하다.
    (LG로 시작하는 기기는 usb 연결 단말기이고, 127.0.0.1은 녹스 실행한 가상 에뮬레이터이다. )

    따라서, 옵션 -d (usb 연결 단말기)나 -e (녹스 등의 가상에뮬레이터)를 사용해서 연결해야한다.

    2) adb -d shell → usb 단말기 연결


    3) adb -e shell → 가상 에뮬레이터 연결


    ** 이 때도, 둘 이상의 에뮬레이터가 연결되어 있으면 에러를 반환하므로 주의한다.

    1. adb 버전 확인

         adb version 
        

        



    1. 연결된 장치에 apk 파일을 설치하는 명령어 
         adb install [apk파일경로\파일명] 



      5.  로컬 컴퓨터에 존재하는 파일을 디바이스로 복사하는 명령어

         adb push [로컬파일 경로] [디바이스경로] 






      6. 디바이스에 존재하는 파일을 로컬 컴퓨터로 복사하는 명령어


          adb pull [디바이스 경로] [로컬컴퓨터 경로] 




    7. 디바이스에 존재하는 애플리케이션(apk)의 저장 경로 확인

          adb pm list packages -f | grep [패키지명] 


    녹스로 가상 디바이스 사용 시 adb devices에서 녹스를 인식하지 못한다.

    그래서 따로 명령어를 입력해야 연결가능!


    • NOX adb 연결

            adb connect 127.0.0.1:62001 

    • NOX adb 연결 확인

            adb devices 



    JADX

    : 이전 포스팅에서 설명한 jd-gui와 동일하게 java 디컴파일러
        ** 하지만 jd-gui 보다 디컴파일 결과가 좋고, dex2jar를 사용하지 않고도 디컴파일이 가능하여 더 많이 사용

    다운로드 경로: https://github.com/skylot/jadx

    1) jadx-gui.jar 파일 실행 


    2) 디컴파일하고자 하는 apk 파일을 가져오면 디컴파일 끝!


    JEB2

    : java 디컴파일러

    JEB는 상용화툴이라 앞서 설명한 두개의 디컴파일러보다 조금 더 기능도 많고 디컴파일 결과가 젤 좋다. 
    다음에 설명할 동적 디버깅 또한 지원하는 툴로 모바일 애플리케이션 분석 시 가장 많이 사용하는 디컴파일러이다.

    (해당 경로에서는 Free trial만 제공한다)

    1) jeb.exe 실행



    2) 디컴파일하고자 하는 apk 파일을 가져오기 후 Bytecode 선택 (smali 코드 추출)


    3) 커서를 해당 페이지에 놓고 q를 눌러 디컴파일 끝~!




    dex2jar

    : APK 파일은 안에 classes.dex라는 파일이 있는데 이 파일을 Android Dalvik이 인식할 수 있도록 class 파일을 바이트 코드로 변환하는 툴


    1) apk 파일의 압축을 푼다.



    2) 압축을 푼 classes.dex파일을 d2j-dex2jar.bat이 위치한 폴더로 이동시킨다.

    3) cmd를 열고 다음 명령어를 실행하여 dex파일을 jar파일로 변환한다.


    4) 해당 폴더 내 jar 파일이 위치하는 것 확인


    5) jar파일의 내용을 확인하려 하지만 깨져서 확인 불가ㅠㅠ



    이때 사용하는 것이 다음의 jd-gui 툴이다!


    JD-GUI

    : 자바 디컴파일러로 위에서 dex2jar로 추출해낸 jar파일을 디컴파일해 주는 툴

        ** 하지만 디컴파일이 완벽하게 100% 가능한 것이 아니므로 참고하장...ㅠㅠ

    다운로드 경로: http://jd.benow.ca/

    1) 다운받은 jd-gui.exe 실행


    2) 디컴파일할 jar 파일 가져오기



    APK-Manager Fix 7.4 (APK 디컴파일 / 컴파일 도구)

    : apk 파일을 디컴파일 및 재 컴파일 등을 할 수 있는 툴

    • 최신버전을 다운받을 수 있다면 최신 버전 추천
    • 압축파일을 다운로드 받으면 다음 그림과 같이 여러 폴더와 cmd 파일이 존재한다.
    • cmd 파일을 실행시키면 apktool을 간편하게 사용할 수 있다.


    • 자주 사용하는 기능 및 사용 방법
      • 9 : Decompile APK
      • 14 : Compile APK / Sign APK / Install APK (All in one step)

    ** 앱은 TeamSIK의 CTF 연습 문제인 app-easy-release.apk를 사용 

    1) 앱을 컴퓨터로 추출한다. (adb pull 또는 ASTRO 앱 사용)
                        - adb pull <apk 파일 위치 경로>
                        - 단말기에 설치된 앱 추출 시 ASTRO 앱 사용하면 편리함
                            → 앱 실행 > 앱 > 앱 오른쪽 상단의 메뉴 > 백업 
                            →  컴퓨터에 단말기 연결 후 backups > apps > 해당앱

                2) 추출한 앱(apk파일)을 "place-apk-here-for-modding" 폴더로 이동시킨다. 

                3) script.cmd를 실행시킨 후 22. Set current Project 입력


     4) 디컴파일하려는 앱(apk파일) 번호 입력


              5) 9. Decompile APK 입력하여 디컴파일

              6) Projects 폴더에서 디컴파일된 apk파일 확인

          


            7) 코드 수정 후  14. Compile apk / Sign apk / Install apk 를 입력하면 한번에 컴파일, 서명, 설치까지 가능하다. 
                ** 11. Compile APK로 컴파일 후, 12. Sign APK로 서명, 13. install APK로 단말기에 설치 각각 진행 가능\
                ** 서명까지 완료된 apk 파일은 "plcae-apk-here-for-modding" 폴더에 "signed[본래 파일명]"으로 저장된다.




    apktool.jar

    위의 방법이 훨씬 더 간단하므로 cmd툴을 이용하는 것을 추천하지만 apktool.jar 명령어에 대해서도 설명한다. 

    https://ibotpeaches.github.io/Apktool/에서 최신 버전의 apktool을 다운로드 받은 후 진행하자.


    1) 다운로드 받은 apktool.jar 파일이 위치한 경로에서 cmd를 실행시킨다.

           java -jar apktool.jar 
            


    2) 디컴파일
        
          java -jar apktool d [apk파일 경로] 



    3) 파일 수정 후 재 컴파일

         java -jar apktool b [디컴파일한 소스 폴더] -o [저장할 apk 명] 





    4) 단말기에 설치하기 전에 서명을 해줘야 제대로 동작한다. 이때 APK Easy Tool을 사용하면 편리하다.

        [select] 클릭 후, 재 컴파일한 apk파일 선택 > sign selected APK 







    + Recent posts