이전 기사에서 JDB라는 작은 도구를 사용하여 Java 애플리케이션을 디버깅하는 방법을 살펴 보았습니다. 이 기사에서는 Android 앱을 디버깅 할 수있는 플래그가 지정된 경우 동일한 로직을 적용하여 Android 앱을 개발합니다. 응용 프로그램에 디버그 가능 플래그가 지정되면 취약한 응용 프로그램 프로세스의 컨텍스트에서 실행하기 위해 자체 코드를 삽입 할 수 있습니다.
배경
이 기사를 더 흥미롭게 만들기 위해 "button"와 "textview"로 만들어진 데모 목적의 (보안에) 취약한 응용 프로그램을 개발했습니다. 아래 양식을 작성하여이 기사와 관련된 코드를 다운로드하십시오.
※ 링크된 본문 사이트에서 다운 받을 수 있음
이 응용프로그램을 올리면(launch), “Crack Me“ 메시지를 보여 줍니다.
버튼을 클릭하면 "Try Again"라고 표시됩니다. 이제 우리의 목표는 응용 프로그램의 소스 코드를 수정하지 않고 "Try Again"메시지를 "Hacked"메시지로 변경하는 것입니다. 정확히, 런타임 상에서 변경해야합니다.
요구되는 툴
에뮬레이터
#adb – Android Debug Bridge #jdb – Java Debugger |
나의 경우 설치를 좀 더 쉽게 하기 위해서, 위의 사용 툴이 이미 설치 된 Android Tamer 를 사용 하고 있습니다.
내용 별 주제
취약점 확인하기
설치 준비하기.
런타임 코드 인젝션
게임을 시작해 보겠습니다.
취약점 확인하기
사실, 이 절은 전체 기사에서 제일 쉬운 부분입니다.
1. 다음 #APKTOOL 명령을 사용해서 응용프로그램을 디컴파일 한 다음 AndroidManifest.xml을 얻습니다.
apktool d <vulnerableapp>.apk
2. 다음 줄이 있는 지 검사합니다.
android:debuggable=”true”
AndroidManifest.xml 파일에서 위의 행을 찾았다면, 이 애플리케이션이 디버그 가능하며 악용 될 수 있습니다.
참고 : APKTOOL을 사용하여 앱이 디버그 가능 여부를 확인했습니다. 앞에서 언급 한 코드를 건들이거나 수정하지 않습니다.
설치 준비하기
이 단계에서는 코드를 실행하는 동안 앱에 코드를 삽입하는 데 필요한 모든 것을 설정합니다. 이전 기사에서 언급했듯이이 기사에서는 #원격 #디버깅을 사용합니다.
에뮬레이터 시작하기
결함 프로그램 설치하기
터미널을 열고 다음 명령을 실행하여 에뮬레이터에서 수신 대기중인 Dalvik VM 포트를 확인하십시오.
adb jdwp
위의 명령은 아래와 같이 우리가 연결하고 디버그 할 수있는 모든 포트를 표시합니다.
참고: JDWP는 Java Debug Wire Protocol의 약자입니다. VM에서 실행중인 응용 프로그램이 디버깅 가능하다면 JDB를 사용하여 연결할 수있는 고유 한 포트를 노출합니다. 이는 Dalvik 가상 머신에서 JDWP를 지원하기때문에 가능합니다.
이제 대상 응용 프로그램을 시작하고 동일한 명령을 실행하여 대상 응용 프로그램과 연결된 수신 포트를 확인합니다. 아래와 같이 보입니다.
그림 2와 그림 3의 차이점을 관찰하면 그림 3에서 대상 애플리케이션을 실행 한 후 추가로 포트 543이 리스닝하고 있음을 알수 있습니다. 우리는 대상 애플리케이션 포트를 찾았으므로, JDB에 이 포트를 연결 합니다.
응용 프로그램에 연결하기 전에 원격 디버깅을 사용하기 때문에 #adb 를 사용하여 포트 포워드(#port forward) 해야합니다. 그림 4와 같이 됩니다.
이제 다음 그림과 같이 JDB를 애플리케이션에 연결해 보겠습니다.
동적 코드 인젝션
이 단계에서는 취약한 응용 프로그램을 실제로 런타임에 수정하여 응용 프로그램을 악용합니다. 런타임에 응용 프로그램의 동작을 수정하려면 중단 점을 설정하고 흐름을 제어해야합니다. 그러나 우리는 응용 프로그램에서 사용되는 클래스와 메서드를 알지 못합니다. 이제 다음 명령을 사용하여 응용 프로그램에 사용되는 클래스와 메서드를 찾아 보겠습니다. 클래스를 찾기 위한 명령 : "classes"
목록에 너무 많은 클래스들이 있지만, 그림에 몇 가지 클래스 만 나열하고 있습니다. 그러나 계속 아래로 스크롤하면 아래 그림과 같이 흥미로운 사용자 정의 클래스가 나타납니다.
이제 다음 명령을 사용하여 MainActivity $ 1 클래스와 관련된 메소드를 살펴 보겠습니다.
“methods com.example.debug.MainActivity$1”
그림 7에서 결과를 볼 수 있습니다.
이제 onClick 메서드에 중단 점을 설정하고 그림 8과 같이 응용 프로그램의 실행을 제어합시다.
“stop in com.example.debug.MainActivity$1.onClick(android.view.View)”
중단 점까지 실행하려면 응용 프로그램에서 단추를 수동으로 클릭해야합니다. 버튼을 클릭하면 중단 점에 도달하고 그림 9와 같이 나타납니다.
여기에서 우리는 다양한 명령을 사용하여 민감한 값, 메소드 인수 등을 제어하고 볼 수 있습니다. 백그라운드에서 어떤 일이 일어나고 있는지 이해하기 위해 onClick 메서드와 관련된 코드를 따르고 있습니다.이 코드는 그림 10에 나와 있습니다.
계속 진행하기 전에 "locals"명령을 사용하여이 시점에 지역 변수가 있는지 살펴 보겠습니다
우리가 보듯이 흥미로운 정보가 없습니다. 다음과 같이 "next"명령을 사용하여 다음 행을 실행 해 봅시다.
이전 명령에서 어떤 일이 있었는지 보려면 "locals"명령을 다시 실행 해 봅시다.
TextView가 메소드 인수에 로드되었다는 것은 명확합니다. 그림 10에 제공된 소스 코드를 보면 TextView 인스턴스화와 관련된 행이 실행되었습니다. 이제 "next"명령을 실행하여 다음 줄을 실행하고 아래 그림과 같이 로컬 변수를 확인하십시오.
보시다시피 모든 지역 변수가 표시되었습니다. "secret"문자열이 흥미로와 보입니다. 값 "Try Again"는 버튼을 클릭 할 때 출력 될 내용입니다. 그림 10에서 setText 메소드가 "Try Again"값을 출력하기 위해 실행 중임을 분명히 알 수 있습니다. "step"명령을 사용하여 "setText"메서드의 정의를 얻고 인쇄 할 텍스트를 동적으로 수정 해 봅시다.
"locals"를 사용하여 정의 안에 지역 변수를 봅시다.
이제, "set"명령을 사용하여 "text"의 값을 "Try Again"에서 "Hacked"로 변경합시다.
수정 된 코드를 실행하지 않았으므로 응용 프로그램의 변경 사항을 볼 수 없습니다. 아래 그림과 같이 "run"명령을 사용하여 응용 프로그램을 실행하고 화면에서 응용 프로그램의 출력을 봅니다.
에뮬레이터에서 실행중인 응용 프로그램을 살펴 보겠습니다.
우리는 런타임에 응용 프로그램의 출력 문자를 성공적으로 수정했습니다. 이 과정은 응용 프로그램이 디버깅 가능할 경우 응용 프로그램의 동작을 수정하는 방법을 보여주는 예입니다. 취약한 응용 프로그램의 맥락에서 장치에 "Getting a shell"를 비롯한 다양한 다른 작업을 수행 할 수 있습니다.
결론
이 기사에서는 Android 애플리케이션을 프로덕션으로 이동할 때 디버깅 가능 상태로 남겨두면 #Android 애플리케이션을 어떻게 활용할 수 있는지 보여주었습니다. Pentestters는 안드로이드 애플 리케이션 취약점 침투테스트(#Penetration test) 동안 항상이 취약점을 찾아야 합니다.
이상.
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
[Android] MVP 접근 방식으로 상용구 코드를 줄여 봅시다 (0) | 2023.03.28 |
---|---|
자신만의 Sqlite 설치하고 개발하기 (0) | 2023.03.23 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 부록 (0) | 2023.03.06 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 3 (1) | 2023.03.05 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 2 (0) | 2023.03.04 |