공부를 위해 '안드로이드 모바일 앱 모의해킹 (저자 : 조정원, 김영근, 조승현, 류진영, 김광수)' 책을 구매하여 책을 기반으로 공부하겠습니다.
안드로이드는 안드로이드 사에서 개발한 리눅스 기반의 운영체제입니다.
이 후, 구글이 안드로이드 사를 인수하여 스마트폰, 카메라 등의 장치에 맞게 설계하였습니다.
안드로이드 아키텍처는 다음과 같습니다.
최하위 레이어부터
리눅스 커널 -> 라이브러리, 런타임 -> 인터페이스 -> 애플리케이션
안드로이드의 필수 구성 요소는 총 4가지의 주요 기능으로 구성되어 있습니다.
사용자에게 보여주는 디바이스의 인터페이스입니다. 화면은 메뉴를 클릭하거나 버튼을 클릭하는 등과 같은 특정한 액션에 의해 전환되는데, 각 화면이 모두 액티비티라고 할 수 있습니다.
사용자들에게 보여주지 않고 백그라운드에서 액티비티가 실행되는 것과 비슷한 프로세스로 동작합니다. 액티비티가 화면에서 동작하는 동안, 이 기능이 함께 동작하는 경우가 많습니다. 예를 들어, 음악을 틀고 바탕화면으로 가도 음악이 재생되는 것이 있습니다. 웹으로 따지자면 액티비티는 프론트엔드 서비스는 백엔드 같다는 생각이 드네요.
각 애플리케이션 사이에서 데이터를 공유하기 위한 인터페이스입니다. 안드로이드는 기본적으로 각 애플리케이션마다 샌드박스에서 동작하므로 각각의 애플리케이션 간의 데이터 접근은 격리됩니다. 그러므로, 컨텐츠 프로바이더 기능이 필요합니다.
실시간으로 시스템의 상태 (배터리 잔량, 메일 알람 등)를 확인하여 이벤트가 발생했을 때 응답합니다. 또한, 노티피케이션 등을 이용해 사용자에게 알람을 발생합니다.
책에서 인시큐어뱅크 버전 2 를 사용했습니다.
모바일 뱅킹 취약점 진단을 위한 테스트 용도로 제작되었으며 백엔드 서버는 파이썬입니다.
총 23가지의 취약점이 존재하며 이 정도의 취약점만 숙지하여도 상용 안드로이드 모바일 앱 취약점 진단은 충분하다고 합니다.
1. 취약한 브로드캐스트 리시버
2. 취약한 인증 메커니즘
3. 로컬 암호화 취약점
4. 취약한 액티비티 컴포넌트
5. 루트 노출 및 우회 취약점
6. 취약한 컨텐츠 프로바이더
7. 취약한 웹 구현
8. 취약한 암호화 구현
9. 애플리케이션 패칭 취약점
10. 중요 정보 메모리 노출 취약점
11. 취약한 로깅 메커니즘
12. 페이스트보드 취약점
13. 애플리케이션 디버깅 취약점
14. 안드로이드 키보드 캐시 취약점
15. 안드로이드 백업 취약점
16. 런타임 조작
17. 취약한 SD 카드 스토리지
18. 취약한 HTTP 전송
19. 파라미터 조작
20. 하드코드된 중요 정보
21. 사용자 계정 목록화
22. 개발 백도어 취약점
23. 취약한 비밀번호 변경 로직
안드로이드 스튜디오를 사용하기 위해 자바 소프트웨어 개발 도구를 설치합니다.
https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html
설치를 마치고 나면 윈도우가 자바 위치를 인지하도록 환경 변수를 등록합니다.
내 PC에서 우클릭 -> 속성 -> 고급 시스템 설정 -> 환경 변수 -> 시스템 변수 새로 만들기
변수 이름은 JAVA_HOME 경로는 설치한 자바 개발 도구 위치
확인 후 PATH 시스템 변수에서 자바 경로를 추가해줍니다.
%JAVA_HOME%\bin; 추가
그 후에 CMD창에서 java -version 입력
자바 개발 도구의 버전 정보가 출력 시 성공
https://developer.android.com/studio 이 곳에서 다운로드하고 설치를 해줍니다.
설치 완료 후 SDK 매니저를 들어오면
여러 버전의 SDK를 확인할 수 있습니다.
우선 실습할 안드로이드의 AVD를 설치하겠습니다.
넥서스 계열로 설치하겠습니다.
다음은 시스템 이미지 선택입니다. 안드로이드 시스템에서 사용될 버전을 선택하는 것으로 SDK 매니저로 API를 설치하면 시스템 이미지 항목이 목록에 추가됩니다. API가 최신이라고 무조건 좋은 것은 아니고 앱 환경에 따라 API 레벨을 선택합니다. 인시큐어 뱅크 앱은 API Level 24정도면 충분합니다. 이름 앞에 다운로드 링크를 클릭하면 다운로드가 됩니다.
다음은 가상 기기의 이름이나 저장 공간 등을 설정할 수 있습니다.
다음으로 ADB 환경 변수를 설정하겠습니다. ADB는 안드로이드 디버깅 도구입니다.
마찬가지로 내 PC -> 속성 -> 고급 시스템 설정 -> 환경 변수에서 사용자 변수 PATH에 마지막 부분에 C:\Users\사용자 이름\AppData\Local\Android\Sdk\platform-tools를 추가해줍니다.
CMD에서 adb version을 입력해봅니다.
녹스를 설치하는게 더욱 간단하고 안드로이드 스튜디오와 비교했을 때 실행 시간도 훨신 빠를 것입니다.
녹스를 설치하면 처음에 태블릿 크기로 되어있는데 스마트폰으로 설정해줍니다.
또한 ROOT 권한을 조절하여 취약점 진단 시 활성화시킬 수 있습니다.
마찬가지로 NOX도 환경 변수 설정을 해줍니다.
이 후, CMD에서 nox_adb shell 입력 시 실행한 녹스 에뮬레이터 쉘에 접속이 됩니다.
이제 녹스에서 앱을 실행하고 싶으면 nox_adb 안드로이드 스튜디오에서 실행하고 싶으면 adb를 입력하면 됩니다.
안드로이드 스튜디오에서 개발한 앱을 녹스 에뮬레이터에서 설치해 동작하도록 하려면 (더 빠르므로) 에뮬레이터에서 디버깅 접근을 허용해야 합니다.
녹스 에뮬레이터에서 설정 -> 태블릿 상태 -> 빌드 번호를 여러 번 누르다 보면 개발자 모드가 켜집니다. 그러면 개발자 옵션이라는 메뉴가 생기는데 거기서 디버깅을 허용해줍니다.
안드로이드 스튜디오에서 프로젝트를 하나 만든 후 테스트 앱을 만들어보겠습니다.
안드로이드 스튜디오에서 가상 기기에서 녹스 기기가 성공적으로 잡혔습니다.
이제 실행되는 앱을 대상으로 안드로이드 스튜디오에서 제공하는 로그캣 정보와 메모리 검색 정보 제공 기능을 사용할 수 있습니다.
https://github.com/dineshshetty/Android-InsecureBankv2
링크를 들어가면 인시큐어 뱅크 어플의 오픈 소스 코드가 나와 있습니다.
AndroLabServer은 백엔드 서버
InsecureBankv2는 인시큐어 뱅크 안드로이드 애플리케이션 소스
InsecureBankv2.apk는 인시큐어 뱅크 안드로이드 애플리케이션
Usage Guide.pdf는 사용자 가이드 입니다.
cmd 창에서 adb connect 127.0.0.1:62001
입력하여 녹스의 기기와 adb와 연결시킵니다.
adb devices
로 연결된 기기를 확인합니다.
그리고 adb install [인시큐어뱅크 apk경로] 를 입력하면 녹스 기기에 설치가 됩니다.
백엔드 언어는 파이썬 기반의 플라스크언어입니다.
파이썬 설칭 경로에 Scripts 폴더로 이동 후
pip install flask sqlalchemy simplejson cherrypy web.py
입력해서 필요한 라이브러리를 다운받습니다.
그 후, 명령창에서 앞 서 깃에서 다운받은 파일에서 AndroLabServer에서 app.py를 파이썬으로 실행해줍니다.
자꾸 오류가 나서 찾아보니 python3부터는 print가 함수가 돼서 괄호를 써주어야 하는데 현재 이 백엔드 서버는 python2로 작성돼서 이러네요. 그래서 호환성을 위해 파이썬2 버전으로 다시 설치했습니다.
AndroLabServer 디렉터리에 requirements.txt 파일로 모듈설치를합니다.
python2 -m pip install -r requirements.txt
pip 버전이 낮아 설치가 안되면 pip 업그레이드를 해줍니다.
python2 -m pip install --upgrade pip
python2 -m pip install -r requirements.txt
기존에 파이썬 3 버전과 구분하기 위해 python2로 exe파일 이름을 바꿨습니다.
이제 서버를 실행시키겠습니다.
정상적으로 실행된 결과입니다.
preferences 메뉴에서 ip를 백엔드 서버 주소로 설정해주어야합니다.
submit 누른 후 로그인을 해줍니다.
디폴트 계정 정보는 다음과 같습니다.
dinesh/Dinesh@123$
jack/Jack@123$
성공적으로 로그인됐습니다.
서버를 실행한 cmd창에도 로그인 로그가 남습니다.
여기까지 안드로이드 앱 취약점 진단을 위한 환경 구축을 해보았습니다.
다음에는 컴파일방법에 대해 공부하겠습니다.