1) 선행
드로저를 사용하기 위해서는 선행되어 설치해야 할 프로그램들이 조금 있다.
ADB, Python27, JAVA가 있다.(설치법은 인터넷을 찾아보시길)
필요에 따라 에러 발생 시 PIP를 이용한 부수적인 설치가 필요하다.
2) 드로저 설치
https://labs.mwrinfosecurity.com/tools/drozer/ 접속 후
APK와 MSI를 다운로드한다
APK는 단말기에 설치해준다(APK는 Agent이다)
MSI는 그냥 깔아도 되지만
환경변수의 Path를 Python27 폴더로 지정하여 깔아준다.(Python이 3점대 버전이면 코드를 읽지 못하는 경우가 발생할 수도 있다(예:COMMAND Error))
3) 드로저 연결
(NOX 환경)
우선 디바이스의 개발자 모드 변환과 USB 디버깅을 허용해주어야 한다.
물론 USB 디버깅 시에 일반 사용자 모드여도 괜찮지만 앱 테스트를 하기 위해서는 rooting을 한 Device를 사용하는 것을 추천한다.
adb devices
디바이스의 연결 여부를 확인할 수 있다.
만약 실제 단말기를 이용한다면 USB 디버깅 설정 시에 이 명령어로 디바이스 연결 여부를 확인할 수 있다.
adb connect 127.0.0.1:62001 (NOX환경)
녹스 환경의 기본적인 Device는 127.0.0.1:62001로 지정되어 있다.
연결이 되지 않는다면 뒤의 포트번호를 62025, 62026 등으로 변경해서 시도한다면 연결이 되는 것을 확인할 수 있다.
adb forward tcp:31415 tcp:31415
드로저 Agent를 디바이스에서 실행한 후 Embedded Server를 ON으로 설정하여 준다.
이는 포트를 포워딩함으로써 드로저의 동적 분석을 하기 위한 선행 작업이다.
drozer console connect
포트가 연결이 되었다면 이 명령어로 드로저를 실행시켜주어야 한다.
만약 저 명령어가 실행되지 않는다면 Python의 경로를 환경변수에 등록했는지 확인해보면 된다. (내 컴퓨터 우클릭 – 고급 시스템 설정 – 환경 변수 – Path값에 Python27 및 Python27/Scripts 경로 추가)
이후 드로저 실행 시에 오류가 생길 수 있는데 이는 JAVA미설치, Python 미설치 혹은 3점대 버전 설치가 있으며 가장 많이 일어나는 오류로는 모듈이 설치되지 않은 경우가 대부분이다.
pip install protobuf
pip install pyOpenSSL
pip install twisted
pip install service_identity
위의 명령어를 사용하면 대부분의 문제점은 해결이 된다.
4) 패키지 확인
가장 먼저 분석할 앱의 package를 알아야 하는데 이는 드로저를 실행하여 확인할 수 있다
run app.package.list
위의 명령어를 사용하면 모든 package를 볼 수 있지만 분석하고자 하는 앱을 정확이 알고 있다며 더 쉽게 찾을 수 있는 방법이 있다.
run app.package.list -f <분석할 앱에 꼭 들어가는 간단한 단어>
<분석할 앱에 꼭 들어가는 단어> <------ 이 부분을 알고 있는 단어로 고쳐주면 된다.
예 : run app.package.list -f insecure
이렇게 쓸 경우 insecure가 들어간 package는 모두 찾는 것이다.
5) 앱의 퍼미션 확인 및 간단한 정보 수집
run app.package.info -a <package명>
이 명령어로 앱의 process이름, 디렉터리, APK경로, UID, GID, 공유 폴더 및 공유 ID, 사용 중인 퍼미션 등을 알 수 있습니다.
run app.package.manifest <package명>
이 명령어를 이용하여 앱의 manifest파일을 읽는 것도 가능하다.
위의 정보를 이용하여 앱의 설정 정보를 알 수 있습니다.
6) attacksurface확인
run app.package.attacksurface (package명)
위의 명령어를 통해 앱의 activity exported, broadcast receivers exported, content providers exported, services exported의 액티비티를 확인할 수 있습니다.
상황에 따라 명령어의 결과 값 하단에 is debuggable이 포함되어 출력될 수도 있습니다.
is debuggable에 포함되어 출력되는 경우 개발 앱이 아닌 릴리즈 버전이라면 큰 취약점이 될 수 있다. 앱의 코드에 임의의 코드를 주입하여 실행시킬 수 있으며 코드를 변조한 공격에 취약할 수 있다.
7) 액티비티 확인 및 점검
run app.activity.info -a <package명>
attacksurface의 activity exported에 포함된 액티비티를 점검하기 위해 액티비티 경로 및 간단한 정보를 알아보는 과정이다.
run app.activity.start --component <package명> <activity명>
activity의 알아낸 정보를 통해 실행 가능한 activity를 실행시켜 불필요한 activity의 존재 여부나 취약한 부분을 점검한다.
8) broadcast확인
run app.broadcast.info -u -f <package명>
attacksurface를 통해 알아낸 broadcast의 수를 알아내고 그 리시버를 테스트한다.
(체크하는 부분이나 취약한 부분은 하는 사람이 알아냄에 따라 다르다. 설정 사항이나 소스 및 리시버의 사용 형태에 따라 새롭게 나뉠 수 있다.)
9) Provider확인
앱이 사용하는 정보 혹은 DB를 공유하기 위해 사용하는 부분이다. 전체가 아니라 일부분의 정보만을 공유하고자 사용한다.
run app.provider.info -u -a <package명>
위의 명령어를 활용해 현재 어플의 provider를 확인하고 노출된 provider의 존재 여부를 확인할 수 있다.
예로 contentprovider가 노출이 되었다면 이건 알아볼 가치가 충분한 경우이다.
지금부터는 가정을 전제하여 설명을 이어가도록 하겠습니다.
만약 취약한 provider 혹은 의심이 가는 provider의 존재를 확인했을 경우에는 URI정보를 확인해 봄으로써 DB정보를 공부하는 방식을 알아볼 필요가 있다.
run app.provider.finduri <package명>
위의 명령어로 활용 중인 URI의 정보가 나오면 이 정보를 통해 package의 provider부분을 점검해 볼 수 있다.
run scanner.provider.sqltables --uri <URI 한 줄 전체 삽입>
예 : run scanner.provider.sqltables --uri content://com.android.insecurebankv2.TrackUserContentProvider
위의 명령어를 입력하면 provider와 관련된 테이블 정보를 보여줍니다.
run scanner.provider.sqltables -a <package명>
모든 URI에 대해 감색하고 싶다면 위의 방법을 쓰는 것도 좋습니다.
10) SQL Injection 분석
먼저 분석하기에 앞서 Query의 사용 방법을 확인할 수 있습니다.
run app.provider.query -h
마지막의 -h는 --help라 써도 무방하며 이 방법으로 Query의 사용방법을 알 수 있습니다.
dz> run app.provider.query -h
usage: run app.provider.query [-h] [--projection [columns [columns ...]]]
[--selection conditions] [--selection-args [arg [arg ...]]]
[--order by_column] [--vertical]
uri
Query a content provider
Examples:
Querying the settings content provider:
dz> run app.provider.query content://settings/secure
| _id | name | value |
| 5 | assisted_gps_enabled | 1 |
| 9 | wifi_networks_available_notification_on | 1 |
| 10 | sys_storage_full_threshold_bytes | 2097152 |
| ... | ... | ... |
Querying, with a WHERE clause in the SELECT statement:
dz> run app.provider.query content://settings/secure
--selection "_id=?"
--selection-args 10
| _id | name | value |
| 10 | sys_storage_full_threshold_bytes | 2097152 |
Last Modified: 2012-11-06
Credit: MWR InfoSecurity (@mwrlabs)
License: BSD (3 clause)
positional arguments:
uri the content provider uri to query
optional arguments:
-h, --help
--projection [columns [columns ...]]
the columns to SELECT from the database, as in "SELECT <projection> FROM ..."
--selection conditions
the conditions to apply to the query, as in "WHERE <conditions>"
--selection-args [arg [arg ...]]
any parameters to replace '?' in --selection
--order by_column the column to order results by
--vertical
읽는 것이 귀찮으실지도 모르지만 읽어두면 도움이 되는 부분이라서 전부 옮겨 두었습니다.
11) URI를 활용한 자동 Query분석
run app.provider.query <URI 한 줄 전체 삽입>
URI의 테이블을 확인하는 것에 좋은 명령어입니다.
"--selection", "--protection"들의 옵션을 이용하여 master table을 확인할 수 있습니다.
run app.provider.query <URI 한 줄 전체 삽입> --projection "* from sqlite_master where type='table';--"
위의 명령어는 master table을 조회하는 명령어이지만 query를 변경하여 세세한 점검을 진행할 수 있습니다.
12) Query분석을 하는 가장 쉬운 방법
앞의 분석은 세세하게 하나하나 살펴볼 수 있다는 장점이 있지만 굉장히 귀찮은 것도 사실이다.
또한 분석이 너무 느리다면 그것도 문제가 될 수 있다고 생각한다.(하나에만 매달려 있을 순 없지 않나요?)
run scanner.provider.injection -a <package명>
빠르게 분석할 때 굉장히 좋은 방법이다. 취약한 URI 및 Injection 가능한 공격 방법도 자동 분류해준다.
하지만 이 방법을 쓰기 전에 위의 방법을 하나하나 익혀서 기본적인 분석 방법을 익히고 흐름을 익힌다면 상황이 바뀌더라도 적을 하거나 분석하는 것에 수월함이 있을 것입니다.
13) Service확인
run app.service.info -u -f <package명>
service에 관한 정보를 확인할 수 있습니다. permission을 확인할 수 있습니다. 또한 hidden service를 확인할 수 있습니다.
14) 디버깅 가능 앱 분석
run app.package.debuggable -f <package명>
디버깅이 가능한 앱은 간단한 디컴파일을 통하거나 디버깅을 통해서 중요 데이터를 노출할 수 있다.
15) 모듈 분석
mudule search
module search <단어>
module search <단어> -d exploit
위의 명령어를 통해 단어가 포함된 모듈을 찾을 수 있으며 아래의 명령어로 그에 해당하는 exploit을 찾을 수 있습니다. 만약 해당하는 exploit이 존재하여 다운을 받고 싶다면 module install <module명>으로 다운로드할 수 있습니다.