Santoku: Exposed Content provider Vulnerability (using Drozer)

2020. 2. 2. 15:012020/Android App Hacking

CSipSimple 앱 파일에 내포되어 있는 취약점 분석

drozer 툴을 활용해 제 3자의 입장에서 해당 앱에 어떤 기능을 사용할 수 있고 어떤 데이터에 접근이 가능한지 확인한다.

 

#1 drozer, CSipSimple installation (파일들은 github, google에서 구할 수 있음)

  $ adb install drozer.apk

  $ adb install CSipSimple.apk 

 

#2 Connection 

디바이스에서 drozer앱을 실행시킨 뒤 31415포트를 열어 listening을 시작한다.

  $ adb forward tcp:31415 tcp:31415

  $ drozer console connect

 

[ Drozer Command ]

1. dz> list

 

2. dz> run app.package.info [PackageName]

3. dz> run app.package.attackSurface [PackageName]

 

4. dz> run app.activity.info -a [PackageName]

5. dz> run app.activity.start --component [PackageName] [ActivityName]

 

6. dz> run app.provider.info -a [PackageName]

7. dz> run app.provider.finduri -a [PackageName]

8. dz> run app.provider.query | read | write [ContentURI]

 

9. dz> run app.service.info -a [PackageName]

10. dz> run app.service.start --component [PackageName] [ServiceName]

 

11. dz> run app.broadcast.info -a [PackageName]

12. dz> run app.broadcast.send --component [PackageName] [BroadcastReceiverName]

* --extra string varibleName varibleValue --extra ... (브로드 캐스트 신호전송 시에 변수가 존재하는 경우)

 

13. dz> run scanner.provider.finduirs -a [PackageName]

14. dz> run scanner.provider.injection -a [PackageName]

 

 

 

#3 Investigation

 3번 명령어 -> CSipSimple앱에 존재하는 취약점을 파악 -> 2개의 노출된 content providers 등등

 8번 명령어를 통해 content provider들을 실행시키려 하였지만 권한이 없어서 실행할 수 없다.(Permission Denial: require android.permission.CONFIGURE_SIP)

 해당 권한은 CSipSimple앱 소스코드의 Manifest.xml파일에 permission태그를 통해 설정한 허가 권한에 포함된다. 안드로이드 앱들은 다음과 같은 권한을 선언하고 해당 권한을 가진 앱에게 정보나 기능들을 제공한다. (through content providers)

 

#4 Manipulation

 Decompile CSipSimple -> Manifest.xml 분석 -> 권한 부여와 관련된 코드 확인.

 Decompile Drozer -> Drozer Manifest.xml파일에 필요 권한들을 삽입하는 수정 -> Repackage & Signning -> Install

Decompile & Compile(Repackage) Methods

    $ apktool d CsipSimple.apk

    $ apktool b CSipSimple (<--Directory)

    $ apktool d drozer.apk

    $ apktool b drozer (<--Directory)

 

CSipSimple - Manifest.xml: uses-permission - 권한 선언
CSipSimple - String.xml 변수확인

 

 CSipSimple앱의 Content provider들을 사용하기 위해 Drozer가 필요한 코드들은 CONFIGURE_SIP권한이 필요하다. 해당 권한 소스 코드를 Drozer-Manifest.xml에 추가하고 String.xml에 선언된 변수 또한 Drozer-String.xml에 추가한다.

 

Signing the App

$ [signner.batPath] -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorePath] [AppPath] [alias_name]

 

Install the app on the device

 

#5 Test

8번 명령어: run app.provider.query [Content] -> Permission Denial 발생 X

 

#6 보충

 dz에 내포된 스캐너를 통해서 사용할 수 있는 Contet providers들을 확인해서 일일이 실행하고 필요한 권한이 있으면 한 번에 Manifest.xml에 추가한 뒤 drozer을 리패키징한 뒤 취약점 분석을 진행할 수 있다.

 

#7 결론

 CSipSimple앱 입장에서 제 3자인 Drozer앱이 노출되어 있는 CSipSimple앱의 content providers들로 인해 데이터가 노출되어 지고 있음을 확인할 수 있었다. 대응방안으로는 manifest.xml에서 content provider태그들의 외부 노출을 제한(exported="false")하는 것과 또는 permission태그를 통한 권한 선언시에 동일한 시그니처 값을 통한 권한 인증 등의 방식을 추가해 보안을 강화할 수 있다.

* apktool을 사용해 앱을 Repackage 할 때 -o을 통해 저장장소를 지정해주었다 ($apktool b [DirectoryRelatedApp] -o [dir]) 알 수 없는 이유로 해당 장소에 apk파일이 compile되지 않았고 대신 build하려고 한 디렉토리의 dist폴더에 저장되어 있음. (path: AppDirectory/dist/App.apk)