DIVA.apk - INSECURE DATA STORAGE PART 1 ~ 4

Gunter·2024년 2월 5일
0

DIVA.apk

목록 보기
3/7

DIVA.apk는 flag를 찾아서 문제를 푸는 형식이 아닌 취약점을 확인하는 것.

.
.

Insecure Data Storage - Part 1

objective : Find out where/how the credentials are being stored and the vulnerable code.

Hint : Insecure data storage is the result of storing confidential information insecurely on the system i.e. poor encryption, plain text, access control issues etc.

목표 : 자격 증명이 저장되는 위치/방법 및 취약한 코드를 확인한다.

힌트 : 안전하지 않은 데이터 저장은 기밀 정보를 시스템에 안전하지 않게 저장한 결과입니다. 즉, 암호화 불량, 일반 텍스트, 접근 제어 문제 등입니다.

+) 3rd party service : 제 3자 서비스로 정보를 저장한 후 로그인을 대행해주는 서비스

.

username에 hi를 입력하고 pw에 hihi라고 입력한 뒤 save를 눌러보면
위과 같이 저장되었다는 toast를 확인할 수 있다.


해당 문제의 activity를 보면, SharedPreferences에 username과 pw를 저장하는것을 볼 수 있다. 따로 암호화 없이 평문으로 저장된다.

SharedPreference : 간단한 설정 값이나 문자열 같은 데이터를 저장하기 위해 안드로이드에서 기본적으로 제공하는 옵션. 데이터를 파일로 저장한다.

sharedPreferences는 앱을 실행하는 동안 로그인 정보 세션정보를 유지시키는 정보를 담 고 있는데, xml 파일로 구성되어있다.

adb를 이용해 앱 내 파일을 /data/data를 통해 들어가 파일 내용을 cat으로 확인해보면 username과 password가 그대로 적혀있는 것을 확인할 수 있다.

.
.
.

Insecure Data Storage - Part 2

part1과 똑같이 hi/hihi를 입력해 보았다.


성공적으로 저장되었다는 toast가 떴다.


무엇이 part1과 다른 형태인지 jadx로 activity를 확인해보았다.

mDB라는 데이터베이스 객체를 사용하여 SQL 쿼리를 실행하고, 쿼리는
INSERT INTP myuser VALUES ('사용자이름', '비밀번호'); 형식으로 작성되어 사용자한테 입력값을 받은 후 DB를 평문으로 myuser 테이블에 추가하는것을 볼 수 있다.

.

adb를 실행한 후 shared.preferences 폴더에 들어가면 databases 폴더가 있다.
sqlite3을 이용하여 테이블을 확인한 후 (명령어 .tables) .dump를 이용해서 myuser 테이블을 덤프시켜 보면 전에 입력한 데이터베이스 값을 확인할 수 있다.

.
.
.

Insecure Data Storage - Part 3

hi/hihi 입력 후 뜨는 toast 확인

.

jadx로 클래스 소스코드 확인
.

이 코드는 위의 Part2와 다르게 사용자가 입력한 정보를 임시 파일에 저장하는 기능을 수행한다. DB 대신 파일을 사용하여 정보를 저장한다는 거다.

File 객체를 사용하여 ddir 경로를 기반으로 임시파일 uinfo를 생성한 후, uinfo.setReadable (true)와 uinfo.serWritable(true)를 사용하여 uinfo 파일을 읽기 및 쓰기가 가능하도록 설정한다.

FileWriter를 사용하여 uinfo 파일에 사용자 이름과 비밀번호를 쓰고 \n 을 추가한다.

adb를 연후 /data/data에 들어가면 위에 입력한 ID/PW 내용을 담은 tmp 임시파일이 생성된다.
위 파일을 확인해보면 hi/hihi가 평문으로 노출되어 있는 것을 확인할 수 있다.

.
.
.

Insecure Data Storage - Part 4

바로 jadx 들어가서 뭐가 다른지 확인

이 코드는 PART3과 같이 사용자의 입력 정보를 외부 저장소에 있는 파일에 저장하는 기능을 수행한다. PART3과의 차이점은 저장 위치이다. 외부 저장소의 루트 디렉토리에 .uinfo.txt 라는 이름의 파일을 생성해 사용자 정보를 저장한다.
.

findViewById 메소드를 사용하여 ids4Usr과 ids4Pwd로 정의된 두 개의 EditText 객체를 찾는다.( 사용자가 입력한 아이디, 비번)

Environment.getExternalStorageDirectory()를 사용하여 외부 저장소 디렉토리의 경로를 가져온 후, File 객체를 사용하여 sdir 경로와 ".uinfo.txt" 파일 이름을 결합하여 uinfo 파일을 생성한다. 이 파일은 사용자 정보를 저장할 파일이다.
uinfo.setReadable (true)와 uinfo.serWritable(true)를 사용하여 uinfo 파일을 읽기 및 쓰기가 가능하도록 설정한다.
.

adb에서 /sdcard 경로에 들어가 ls -al을 보면 .uinfo.txt 가 생성되어있는것을 확인할 수 있다.

0개의 댓글