[InsecureBank] #2 Application patching , Week Auth
처음으로 해볼 것은 앱 패치입니다.
필요한 것은 apktool과 SignApk입니다.
인터넷에 apktool과 SignApk설치 관련 자료가 많으니 생략하겠습니다.
./apktool d InsecureBankv2.apk
apktool경로에 InsecureBankv2.apk를 옮긴 뒤, 명령을 이용해서 앱을 디컴파일 해줍니다.
그 뒤 /InsecureBankv2/res/values/strings.xml파일을 열어줍니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="abc_action_bar_home_description">Navigate home</string>
<string name="abc_action_bar_up_description">Navigate up</string>
<string name="abc_action_menu_overflow_description">More options</string>
<string name="abc_action_mode_done">Done</string>
<string name="abc_activity_chooser_view_see_all">See all</string>
... 중략
<string name="hello_world">Hello world!</string>
<string name="is_admin">no</string>
<string name="loginscreen_password">Password:</string>
<string name="loginscreen_username">Username:</string>
<string name="pref_submit">Submit:</string>
<string name="server_ip">Server IP:</string>
<string name="server_port">Server Port:</string>
</resources>
strings.xml은 앱 내부에 들어가는 문자열들이 모여있는 파일입니다.
파일 내용을 잘 살펴보면, is_admin이라는 요소가 보입니다. no라고 지정이 되어있는데, 이 값을 통해서 어드민인지 아닌지 앱에서 판단하는 것 같아 보입니다.
실제로 저 부분이 어디서 쓰이는지 확인해보겠습니다.
우선 https://github.com/Konloch/bytecode-viewer/releases링크를 통해 Bytecode-Viewer.jar를 다운로드 받습니다.
jar파일을 더블클릭 혹은 java -jar Bytecode-Viewer-[버전명].jar로 실행시켜줍니다.
왼쪽 상단에 InsecureBankv2.apk를 드래그 드롭해줍니다. (파일이 로드되는데 시간이 조금 걸립니다.)
com.android.insecurebankv2.R$string.class를 클릭하여 열어줍니다.
방금 우리가 확인했던 is_admin이 보입니다. is_admin의 값은 2131165258이고, 앱 내부에서 is_admin을 사용할 때 2131165258를 이용하여 참조합니다. 따라서 왼쪽 하단의 search로 2131165258를 검색해봅시다.
검색결과가 하나가 나오는데 위치는 LoginActivity이고, onCreate메소드에서 참조됩니다.
if문을 보게되면, is_admin에 해당하는 2131165258번 리소스를 가져와서, "no"인지 검사합니다.
만약 "no"라면, 2131558510리소스에 setVisibility(8)을 해주는것을 알 수 있습니다.
0 is for VISIBLE
4 is for INVISIBLE
8 is for GONE
이때 8은 GONE이므로 2131558510리소스를 없애버린다고 이해할 수 있습니다.
com.android.insecurebankv2.R$id.class파일을 열어서 검색을 해보면 button_CreateUser라는 것을 알 수 있습니다.
그렇다면 아마 is_admin의 값이 "no"만 아니면, CreateUser버튼이 활성화 된다 라고 생각해 볼 수 있겠습니다.
다시 apktool폴더로 돌아와서 /InsecureBankv2/res/values/strings.xml의 is_admin값을 임의로 바꿔 봅시다.
저장한 뒤 re compile 해줍니다.
./apktool b InsecureBankv2
작업이 완료되면, InsecureBank/dist/ 에 apk파일이 생성되는데, adb install을 통해 이 파일을 설치하려고 하면 에러가 발생합니다.
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl883768825.tmp/base.apk: Attempt to get length of null array]
그 이유는 리컴파일 한 뒤, signing을 해주지 않았기 때문입니다.
https://github.com/appium/sign
여기서 sign.jar를 받아준 뒤,
java -jar sign.jar InsecureBankv2.apk
를 해주시면, sign이 완료되고 InsecureBankv2.s.apk가 생성됩니다.
sign과정에서 BASE64 관련 오류가 난다면 Java 8이하의 버전으로 실행하셔야합니다.
adb install InsecureBankv2.s.apk
adb를 통해 앱을 설치를 하게되면 정상적으로 설치가 됩니다.
예상대로 Create User버튼이 활성화 되었습니다.
'안드로이드 > InsecureBank' 카테고리의 다른 글
[InsecureBank] #5 Exploiting Weak Cryptography (0) | 2020.01.15 |
---|---|
[InsecureBank] #4 Exploiting Android Content Provider (0) | 2020.01.10 |
[InsecureBank] #3 Exploiting Android Activities (0) | 2020.01.08 |
[InsecureBank] #1 환경 구축하기 (0) | 2020.01.07 |