drozer 설치
drozer는 안드로이드 보안 테스트를 위한 도구입니다. 이제 이것을 설치해보겠습니다.
먼저 아래 링크에 접속해줍니다.
https://labs.withsecure.com/tools/drozer
들어가서 페이지를 아래로 내리다 보면 아래와 같은 부분이 나오는데 drozer (Python .whl)와 drozer (Agent .apk only)를 다운로드해줍니다.
터미널을 열고 아래의 명령어를 입력해줍니다.
cd Downloads
conda activate py2
pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
이제 apk파일을 안드로이드에 설치해주겠습니다.
adb install drozer-agent-2.3.4.apk
설치가 완료되면 안드로이드로 가서 drozer Agent를 실행시켜주겠습니다.
OFF 버튼을 눌러서 서버를 켜줍니다. 버튼이 ON이 되면 서버가 켜진 것입니다.
다시 칼리 리눅스로 돌아가서 아래의 명령어를 입력해줍니다.
adb forward tcp:31415 tcp:31415
drozer console connect
그러면 drozer가 정상적으로 실행되는 모습을 확인할 수 있습니다.
액티비티 호출 및 로그인 우회하기
먼저 액티비티(Activity)에 대해서 설명하겠습니다.
액티비티는 애플리케이션과 사용자가 상호작용할 수 있는 화면을 제공하는 애플리케이션의 기본적인 구성단위입니다.
쉽게 말하자면 이런 로그인 화면이나
로그인한 후의 화면,
비밀번호를 바꾸는 화면 등이 모두 액티비티입니다.
이러한 액티비티들은 호출될 수 있는데 로그인 화면은 당연히 호출되어도 문제가 없지만 만약 로그인 이후의 화면이 다른 애플리케이션에 의해서 호출된다면 로그인을 우회할 수 있다는 뜻이고 취약한 프로그램이라고 할 수 있습니다.
그렇다면 어떻게 특정한 액티비티가 호출될 수 있는지 없는지 알 수 있을까요?
AndroidManifest.xml파일에는 모든 액티비티가 등록되어있는데 android:exported요소의 값이 true인지 false인지에 따라서 알 수 있습니다.
값이 false라면 같은 애플리케이션에서만 호출할 수 있지만 값이 true라면 다른 애플리케이션에서도 액티비티를 실행시킬 수 있습니다.
AndroidManifest.xml파일을 확인하는 방법은 여러 가지가 있지만 jadx를 이용해서 apk파일을 디컴파일해서 확인해보겠습니다.
터미널에 아래의 명령어를 입력해줍니다.
jadx-gui
설치가 되어있다면 프로그램이 정상적으로 실행될 것이고 설치가 되어있지 않다면 설치할 거냐고 물어보는 메시지가 출력될 텐데 y 두 번이면 설치됩니다.
프로그램이 실행되면 Open file버튼을 눌러서 InsecureBankv2.apk파일을 열어줍니다.
약간의 시간이 흐르고 디컴파일이 완료되면 Resources하위 경로에 있는 AndroidManifest.xml파일을 열어줍니다.
Ctrl + F를 이용해서 검색해보면 몇몇 액티비티에 exported요소가 true로 설정되어 있는 것을 볼 수 있습니다.
이 중에는 로그인 후에 사용되는 액티비티로 추정되는 PostLogin이라는 이름을 가진 액티비티도 보입니다.
이런 방식을 통해서 exported가 true인 액티비티를 찾을 수도 있겠지만 drozer에서는 간단한 명령어로 이러한 액티비티들을 쉽게 찾을 수 있습니다.
칼리 리눅스로 돌아가서 drozer Console을 열어줍니다.
아래 명령어를 이용해서 exported가 true로 설정된 액티비티들을 모두 찾아주겠습니다.
run app.activity.info -a com.android.insecurebankv2
exported가 true로 설정되어있어도 문제가 없는 LoginActivity를 제외하고 4개의 취약한 액티비티를 찾을 수 있습니다.
이제 찾은 취약한 액티비티들을 실행시켜보겠습니다.
drozer Console에서 아래 명령어를 입력해줍니다.
run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin
아무 애플리케이션도 열려 있지 않던 안드로이드에서 로그인한 다음에 뜨는 화면이 나오는 것을 볼 수 있습니다.
ADB를 이용해서도 액티비티를 실행시킬 수 있습니다.
adb shell
am start -n com.android.insecurebankv2/.PostLogin
이번에는 비밀번호를 바꾸는 액티비티를 호출할 때 변수의 값을 정해서 호출해보겠습니다.
아래의 사진은 ChangePassword액티비티의 화면입니다. 유저 이름은 현재 로그인한 유저의 이름으로 고정돼서 바꿀 수 없고 새로운 비밀번호만 입력할 수 있게 되어있습니다.
이제 저 이름을 바꿔서 ChangePassword액티비티를 호출해보겠습니다.
먼저 jadx를 이용해서 코드를 분석해서 유저 이름을 가지고 있는 변수가 어떤 종류이고 어떤 이름을 가지고 있는지 알아야 합니다. 코드가 복잡한데 코드의 내용이나 변수의 이름을 봤을 때 uname변수가 유저의 이름을 가지고 있다고 생각할 수 있습니다.
이제 변수의 종류와 이름까지 확인했으므로 이제 명령어를 이용해서 유저 이름을 변경해보겠습니다.
일단 안 되어있어도 작동은 하겠지만 유저 이름을 담고 있는 변수의 값을 바꾼다는 점에 집중하기 위해서 InsecureBank에 로그인이 된 상태여야 합니다.
drozer Console에서 아래의 명령어를 실행해줍니다.
run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword --extra string uname jack
유저 이름이 로그인된 유저의 이름인 dinesh가 아닌 전혀 다른 값인 jack으로 변해있는 것을 확인할 수 있습니다.
이제 New Password를 적당히 입력하고 Change Password버튼을 눌러서 jack의 비밀번호를 바꾼 뒤 바꾼 비밀번호로 로그인을 하면 잘 됩니다.
액티비티의 변수의 값을 바꿔서 호출하는 것 역시 ADB를 이용해서 할 수 있습니다.
adb shell
am start -n com.android.insecurebankv2/.ChangePassword –e uname jack
drozer와 ADB 둘 다 사용할 수 있으니 편한 것을 사용하시면 될 것 같습니다.
'Android' 카테고리의 다른 글
Burp Suite 설치 및 HTTP 요청 패킷 가로채고 값 변조하기 (0) | 2022.11.21 |
---|---|
Android Log 출력하기 (0) | 2022.11.18 |
Android /data/app, /system/app 및 /data/data 확인하기 (0) | 2022.11.07 |
InsecureBankv2 설치하고 칼리 리눅스 연결해서 로그인하기 (2) | 2022.11.04 |
Anaconda 설치하기 (conda: command not found 해결) (0) | 2022.10.26 |