안녕하세요! 이번시간에는 모바일 DIVA 문제를 보며 Insecure Data Storage = '취약한 데이터 저장' 취약점 에 대하여 실습해보는 과정에 대하여 알아보겠습니다!
Insecure Data Storage 란?
> 개인정보같이 민감한 정보를 편의성을 위하여 로컬저장소에 저장해놓을 때 데이터를 평문으로 저장해버리면 공격자에 의하여 저장소가 노출될 경우 사용자의 아이디와 패스워드가 그대로 노출될 수 있는 취약점을 의미합니다. 예를들어 자동로그인을 위하여 앱의 내부저장소에 아이디와 비밀번호 정보를 저장하는 경우 비밀번호를 평문 그대로 저장해버리면 앱 내부 저장소에 접근하는 것만으로도 사용자의 계정정보가 탈취될 수 있습니다.
[실습]
1. Insecure Data Storage - Part 1
1. 우선 Nox 앱플레이어에서 DIVA 앱을 실행 후 Insecure Data Storage - Part 1 을 클릭해주세요.
2. 어디서/어떻게 인증정보가 저장되는지, 코드상 취약한 부분은 어디인지 를 찾는 문제같습니다
3. 아이디: james , 비밀번호 : admin159 라고 하고 SAVE 버튼을 눌러보겠습니다.
4. 인증정보가 저장되었다고 뜨는군요, 그러면 디컴파일링 하여 이 정보가 어디에 저장됐는지 확인해보겠습니다.
5.Jadx 를 사용하여 디컴파일링 한 다음 소스코드를 보니깐 SharedPreferences를 사용하여 앱의 내부저장소에 user & password를 평문으로 저장하는것 같습니다. 이 저장된 내용을 찾아서 열어본다면 저희가 저장한 로그인 정보를 얻을 수 있습니다!
Tip. getDefaultSharedPreferences(this) 함수를 쓰면 Preference 파일의 이름이 "jakhar.aseem.diva_preferences.xml" 라는 이름으로 자동 설정됩니다!
6. nox_adb shell 에 접근후 , /data/user/0/jakhar.aseem.diva/shared_prefs 경로에 접근하시면 저장된 preferences.xml 파일을 확인하실 수 있습니다!
7. cat jakhar.aseem.preferences.xml 라고 명령어를 입력하여 xml 파일 내용을 확인하시면 방금 저장했던 로그인 정보를 평문으로 확인하실 수 있습니다!
2. Insecure Data Storage - Part 2
1. Part2 문제 형식을 보아하니 Part 1 과 동작방식은 크게 차이 없어보입니다.
2. 이번엔 아이디 : pacmax & 비밀번호 : admin159 라고 작성후 저장해주겠습니다.
3. InsecureDataStorage2Activity 로 들어와보시면 SQLite를 사용하여 로그인 정보를 저장하는 것을 확인하실 수 있습니다. 앱 내부저장소에 저장될 DB이름이 ids2 라고 설정한 후 그 안에다가 로그인 정보를 넣는것 같습니다. 또한 쿼리문중 Insert 구문을 사용하여 myuser 라는 이름의 테이블에 아이디&패스워드가 아무런 암호화없이 평문저장이 되는것을 확인하실 수 있습니다!
4. 저장된 DB의 경로는 "/data/user/0/jakhar.aseem.diva/databases" 입니다. 여기엔 앱 내부저장소에 저장된 DB들이 모여있는데 저희가 원하는 DB인 ids2 의 내용을 살펴보겠습니다.
5. 다음과 같은 명령어로 DB 내용을 확인하실 수 있습니다. ids2 의 DB내용을 확인해보시면 저희가 저장했던 값인 pacmax,admin159가 저장되어있는것을 확인하실수 있습니다! (그위에 kevinadmin159는 제가 따로 실습하면서 저장했던 값인것 같습니다..)
> sqlite3 ids2 (ids2 라는 DB를 sqlite3 를 이용하여 열어본다)
> .table (현재 DB의 테이블 명을 확인한다)
> select * from myuser; (myuser 라는 테이블의 내용을 전부 읽어온다.)
3. Insecure Data Storage - Part 3
1. Part3 의 문제 형식도 이전과 같은것 같습니다. 이번엔 아이디:taegookki&비밀번호:admin123 이라고 하고 저장을 해주겠습니다.
2. 디컴파일링 하여 InsecureDataStorage3Acitivity 의 소스코드를 확인해보니 이번 문제는 앱의 내부저장소에 파일형식으로 저장하는것 같습니다. 그러면 코드에서 이해가 필요한 부분을 차례대로 설명해보겠습니다.
1. getApplicationInfo().dataDir 은 파일저장 위치를 아래와 같은 경로로 자동설정됩니다. |
2. uinfo 로 시작하여 tmp로 끝나는 이름의 파일의 객체를 생성한다. |
3. 지정한 파일에 적었던 로그인정보를 평문으로 저장합니다. |
3. 이후 /data/user/0/jakhar.aseem.diva 경로로 들어가면 uinfo로 시작하고 tmp 로 끝나는 파일이 존재합니다.
4. 이후 cat info1431452964tmp 라는 명령어로 내용을 확인해보면 저희가 적었던 로그인정보가 평문으로 저장된 것을 확인하실 수 있습니다!
4. Insecure Data Storage - Part 4
1. 아이디 : Gomdol & 비밀번호 : admin159 를 입력후 저장해주겠습니다.
2. 그러면 파일 에러가 뜰것입니다... 무슨일인지 한번 디컴파일하여 소스코드를 살펴봐야겠습니다.
3. InsecureDataStorage4Activity 코드를 살펴보니 로그인 정보를 파일에 저장합니다. 근데 파일을 저장할 때 getExternalStorageDirectory() 함수를 사용하여 외부저장소에 접근한다는 특징이 있습니다.. 외부저장소에 접근하려면 따로 앱의 권한에서 저장권한을 ON 해주어야 합니다.
4. NOX 화면으로 돌아가서 Diva 아이콘을 꾹누르면 앱 정보 라는 항목이 뜨게되는데 클릭합니다.
5. 권한 메뉴로 접근하셔서 앱의 저장 권한을 부여해주세요.
권한 메뉴로 접근 | 저장 권한을 ON 하기 |
6. 이후 다시 저장해보시면 이번엔 무사히 저장되는 것을 확인하실 수 있습니다!
7. 자 그럼 저장도 했으니 소스코드를 다시 살펴보죠! .... 이번 문제는 전반적으로 Part3 문제와 매우 유사하지만 하나 다른점이 있습니다. 이번엔 외부저장소의 절대경로를 파일의 저장경로로 사용한다는 점입니다!
※외부저장소의 절대경로는 : /storage/emulated/0 입니다!
즉 밑에 코드대로면 파일의 저장경로는 /storage/emulated/0/.uinfo.txt 가 됩니다!
8. 실제로 해당 경로에 접근하게 되면 .uinfo.txt 라는 파일이 존재합니다. 이때 ls -al 이라는 명령어로 숨겨진 파일까지 전부 보게 해주어야 txt 파일이 표시되게 됩니다. 이후 cat 명령어로 txt 내용을 확인하시면 저희가 입력한 로그인 정보가 평문으로 저장되어 있는것을 확인하실 수 있습니다.
[대응방안]
이 문제는 민감한 정보를 평문 그대로 저장하는것이 원인이였습니다. 대응방안은 다음과 같습니다.
- 패스워드와 같은 민감한 정보는 앱이 삭제되면 같이삭제될 수 있도록 내부저장소에 저장
- 저장할 때 반드시 비밀번호와 같은 민감한 정보는 반드시 암호화 하여 저장(암호화는 Hash 암호화 추천)
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Android DIVA' 카테고리의 다른 글
[Android DIVA] Access Control Issues 취약점 (0) | 2024.11.06 |
---|---|
[Android DIVA] Input Validation Issues 취약점 (0) | 2024.11.03 |
[Android DIVA] Hardcoding Issues 취약점 (0) | 2024.10.30 |
[Android DIVA] '취약한 로깅' 취약점 (0) | 2024.10.28 |
[Reversing] 디스어셈블러 툴 GHIDRA 설치방법 (0) | 2024.10.27 |