Whitehat School 프로젝트를 하면서 초반에 했던 스터디를 따로 정리해놓았는데, 복습을 다시 해보면서 작성을 해봅니다.
1. Insecure logging
Source Code
package jakhar.aseem.diva;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
/* loaded from: classes.dex */
public class LogActivity extends AppCompatActivity {
/* JADX INFO: Access modifiers changed from: protected */
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log);
}
public void checkout(View view) {
EditText cctxt = (EditText) findViewById(R.id.ccText);
try {
processCC(cctxt.getText().toString());
} catch (RuntimeException e) {
Log.e("diva-log", "Error while processing transaction with credit card: " + cctxt.getText().toString());
Toast.makeText(this, "An error occured. Please try again later", 0).show();
}
}
private void processCC(String ccstr) {
RuntimeException e = new RuntimeException();
throw e;
}
}
Analysis
해당 코드는 AppCompatActivity를 확장하는 클래스를 정의하고, Logacitivty(1. 로그 화면)를 담당한다. 또한 onCreate를 재정의 하는데, 이 때, activity_log 레이아웃을 표시한다.
checkout method는 화면에서 특정 액션(클릭)이 발생할 때 호출이 되는데, EditText 에 입력된 값들을 가져와 processCC 에 전달하고 processCC에서 예외가 발생되면 Log에 Error 메세지를 띄운다 이 때 입력된 cctxt 값들을 함께 log 메세지로 남기고 사용자에게 화면에서는 Toast를 통해 에러 메세지를 띄운다.

위와 같이 사용자가 올바른 값을 입력하거나 하지 않더라도, check out 버튼을 누르고 adb logcat을 통해 Log 기록들을 확인하면, 아래와 같이 개인정보가 유출된 log가 보이는 걸 확인할 수 있다.

2. Hardcoding Issues - Part 1
Source Code
package jakhar.aseem.diva;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
/* loaded from: classes.dex */
public class HardcodeActivity extends AppCompatActivity {
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hardcode);
}
public void access(View view) {
EditText hckey = (EditText) findViewById(R.id.hcKey);
if (hckey.getText().toString().equals("vendorsecretkey")) {
Toast.makeText(this, "Access granted! See you on the other side :)", 0).show();
} else {
Toast.makeText(this, "Access denied! See you in hell :D", 0).show();
}
}
}
Analysis
해당 코드는 access 버튼을 누를 때, hckey에 대한 값을 EditText라는 입력창을 통해서 받아오게 되는데, 만약 입력창에 입력된 값이 “vendorsecretkey”와 동일하면 Toast를 통해 성공 메세지를 화면에 보여주고 아니라면 틀렸다는 메세지를 띄운다.
해당 문제 제목처럼 실제로 코드상에서 어떤 값을 입력하면 Access가 되는지 보여지는 부분이 취약점이다. 즉 vendorkey가 하드코딩 되어 있다는 부분이 취약점.
#3. Insecure Data Storage - Part 1
Source Code
package jakhar.aseem.diva;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
/* loaded from: classes.dex */
public class InsecureDataStorage1Activity extends AppCompatActivity {
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insecure_data_storage1);
}
public void saveCredentials(View view) {
SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor spedit = spref.edit();
EditText usr = (EditText) findViewById(R.id.ids1Usr);
EditText pwd = (EditText) findViewById(R.id.ids1Pwd);
spedit.putString("user", usr.getText().toString());
spedit.putString("password", pwd.getText().toString());
spedit.commit();
Toast.makeText(this, "3rd party credentials saved successfully!", 0).show();
}
}
Analysis
해당 코드는 실제 화면에서 save 버튼을 누르면, 입력된 usr와 pwd 값을 Shared Preferences에 저장이 되고 최종적으로 Toast를 통해 성공적으로 저장됐다는 메세지를 출력한다.
SharePreferences란?
안드로이드에서 기본적으로 제공하는 Key-Value 방식의 데이터 관리 기능이다. 데이터베이스에서 관리할 필요가 없는 비교적 간단한 데이터를 관리한다. 대표적인 특징으로는, 앱 내 폴더에 저장되는 방식을 꼽을 수 있는데, 데이터가 ‘앱 내’에 저장된다는 것은, 앱이 제거되면 해당 데이터 또한 같이 제거된다는 것이다. 이 부분이 DB와 구분지을 수 있는 부분.
보통 SharePreferences가 사용되는 경우는 몇가지가 있는데,
- 앱 로그인 정보 저장
- 자동 로그인, 로그인 유지를 할 때 사용이 된다. 예를 들어서 모바일 게임 앱을 이용할 때 마다, 매번 로그인이 번거롭기 때문에, 자동 로그인이 보통 활성화 되는데 앱을 삭제 후 재설치 하면 자동로그인이 안되는 점을 이를 통해 알 수 있다.
- 앱 환경 설정 변동 사항 데이터 저장
- 앱 내 테마 변경 사항, 앱 내 음량 변경 사항, 앱 내 언어, 폰트 변경 사항 등
- 앱을 삭제 & 재설치해도 큰 문제가 없는 요소들을 SharedPreferences에 저장하는 경우도 있다.
- DB에 반드시 저장하지 않아도 될 요소들은 SharedPreferences를 이용하기도 하는 것.

usr와 pwd 모두 test를 입력한 뒤 SAVE 버튼을 누르면 보이는 것과 같은 메세지가 출력이 되는데, SharedPreferences에 저장되는 것을 확인하기 위해 adb shell에서 shared_prefs 폴더에 접근해 jakhar.aseem.diva_preferences.xml 파일을 확인해 볼 수 있다. 이 과정에 있어서 약간의 문제가 있었는데, 살펴보자면,,

다음과 같이 adb shell을 통해서 emulator에 접속을 했는데 접근이 되지 않을 경우가 있다. 이와 같이 Permission denied 에러로 접근이 안될 때에는 adb shell로 우선 접속 후 run-as <앱 이름>을 통해서 접속을 하면 문제가 해결된다.
앱 이름은 아래와 같이 package 명을 사용한다.

run-as jakhar.aseem.diva 명령어를 통해서, 접속 후, 똑같이 해당 앱 내에서 ls 명령어를 입력하면 아래와 같이 diva 앱에서 사용되는 폴더, 파일들을 확인할 수 있다.

shared_prefs 폴더가 존재하기 때문에 해당 폴더에 접근해 xml 파일을 cat 명령어로 확인하면 다음과 같이 password와 user 정보가 저장된 것을 확인할 수 있다.

결론적으로 만약 해커가 root에 접근을 하고 SharePreferences에 접근을 해서 여러 정보들을 알거나 변경할 수 있다는 취약점을 갖고 있다.
'Hacker > APP' 카테고리의 다른 글
| Insecurebankv2 - Insecure Content Provider access (취약한 컨텐트 프로바이더 접근) (0) | 2024.08.21 |
|---|---|
| drozer 환경 구축 (0) | 2024.08.20 |
| Insecurebankv2 - Local Encryption issues, Hardcoded secret, Weak Cryptography implementation (0) | 2024.08.12 |
| Diva 풀이 4~6번 (Insecure Data Storage - Part 2 ~ 4) (0) | 2024.08.09 |
| InsecureBankv2 환경 구축 (0) | 2024.08.09 |