Exploiting a debuggeable application

디버깅 가능한 애플리케이션 악용하기

HackTricks 지원하기

루트 및 디버깅 가능성 검사 우회하기

이 게시물의 이 섹션은 https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0에서 요약한 내용입니다.

Android 앱을 디버깅 가능하게 만들고 검사 우회하기 위한 단계

앱을 디버깅 가능하게 만들기

내용은 https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0를 기반으로 합니다.

  1. APK 디컴파일:

  • APK 디컴파일을 위해 APK-GUI 도구를 사용합니다.

  • android-manifest 파일에 android:debuggable=true를 삽입하여 디버깅 모드를 활성화합니다.

  • 수정된 애플리케이션을 다시 컴파일하고 서명한 후 zipalign합니다.

  1. 수정된 애플리케이션 설치:

  • 명령어: adb install <application_name>을 사용합니다.

  1. 패키지 이름 가져오기:

  • adb shell pm list packages –3을 실행하여 서드파티 애플리케이션 목록을 확인하고 패키지 이름을 찾습니다.

  1. 앱이 디버거 연결을 기다리도록 설정:

  • 명령어: adb shell am setup-debug-app –w <package_name>입니다.

  • 참고: 이 명령은 애플리케이션을 시작하기 전에 매번 실행해야 디버거를 기다리도록 설정됩니다.

  • 지속성을 위해 adb shell am setup-debug-app –w -–persistent <package_name>을 사용합니다.

  • 모든 플래그를 제거하려면 adb shell am clear-debug-app <package_name>을 사용합니다.

  1. Android Studio에서 디버깅 준비:

  • Android Studio에서 _File -> Open Profile or APK_로 이동합니다.

  • 다시 컴파일한 APK를 엽니다.

  1. 주요 Java 파일에 중단점 설정:

  • MainActivity.java(특히 onCreate 메서드), b.java, ContextWrapper.java에 중단점을 설정합니다.

검사 우회하기

애플리케이션은 특정 시점에서 디버깅 가능성을 확인하고 루팅된 장치를 나타내는 바이너리를 검사합니다. 디버거를 사용하여 앱 정보를 수정하고, 디버깅 가능 비트를 해제하며, 검색된 바이너리의 이름을 변경하여 이러한 검사를 우회할 수 있습니다.

디버깅 가능성 검사에 대해:

  1. 플래그 설정 수정:

  • 디버거 콘솔의 변수 섹션에서 다음으로 이동합니다: this mLoadedAPK -> mApplicationInfo -> flags = 814267974.

  • 참고: flags = 814267974의 이진 표현은 11000011100111011110으로, "Flag_debuggable"이 활성화되어 있음을 나타냅니다.

https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png

이 단계들은 애플리케이션이 디버깅 가능하도록 하고, 특정 보안 검사를 디버거를 사용하여 우회할 수 있도록 보장하여 애플리케이션의 동작을 보다 심층적으로 분석하거나 수정할 수 있게 합니다.

2단계에서는 플래그 값을 814267972로 변경하는데, 이는 이진수로 110000101101000000100010100으로 표현됩니다.

취약점 악용하기

버튼과 텍스트뷰가 포함된 취약한 애플리케이션을 사용하여 시연이 제공되었습니다. 처음에 애플리케이션은 "Crack Me"를 표시합니다. 목표는 소스 코드를 수정하지 않고 런타임에서 "Try Again" 메시지를 "Hacked"로 변경하는 것입니다.

취약점 확인

  • apktool을 사용하여 애플리케이션을 디컴파일하여 AndroidManifest.xml 파일에 접근했습니다.

  • AndroidManifest.xml에 android_debuggable="true"가 존재하면 애플리케이션이 디버깅 가능하고 악용될 수 있음을 나타냅니다.

  • apktool은 코드를 변경하지 않고 디버깅 가능 상태를 확인하는 데만 사용된다는 점에 유의해야 합니다.

설정 준비

  • 프로세스는 에뮬레이터를 시작하고, 취약한 애플리케이션을 설치하며, adb jdwp를 사용하여 수신 대기 중인 Dalvik VM 포트를 식별하는 것이 포함되었습니다.

  • JDWP(Java Debug Wire Protocol)는 VM에서 실행 중인 애플리케이션을 디버깅할 수 있도록 고유한 포트를 노출합니다.

  • 원격 디버깅을 위해 포트 포워딩이 필요했으며, 이후 JDB를 대상 애플리케이션에 연결했습니다.

런타임에서 코드 주입

  • 중단점을 설정하고 애플리케이션 흐름을 제어하여 악용이 수행되었습니다.

  • classesmethods <class_name>와 같은 명령어를 사용하여 애플리케이션의 구조를 파악했습니다.

  • onClick 메서드에 중단점을 설정하고 그 실행을 제어했습니다.

  • locals, next, set 명령어를 사용하여 로컬 변수를 검사하고 수정했으며, 특히 "Try Again" 메시지를 "Hacked"로 변경했습니다.

  • 수정된 코드는 run 명령어를 사용하여 실행되어 애플리케이션의 출력을 실시간으로 성공적으로 변경했습니다.

이 예시는 디버깅 가능한 애플리케이션의 동작을 조작할 수 있는 방법을 보여주며, 애플리케이션의 컨텍스트에서 장치에 대한 쉘 접근과 같은 더 복잡한 악용 가능성을 강조합니다.

참고문헌

HackTricks 지원하기

Last updated