BlackHat 자료 보던 중 괜찮은 Android 취약점 분석 도구가 있어 공유드립니다. 아직 자료가 많이 없어 삽질이 좀 많습니다. 양해 부탁드립니다.

오늘 이야기할 툴은 BadIntent입니다.

What is BadIntent?

BadIntent는 Burp suite의 확장기능입니다. Burp에 BadIntent를 붙여놓고 안드로이드 기기에 설치한 Bad Intent 앱으로부터 앱 구동 시 발생하는 정보를 전송받아 분석가에게 테스트를 할 수 있도록 제공해줍니다.

대표적으로 intent sniffing, bf , AIDL Test, GCM Attack, Webview vuln, Insecure logging, ACL Issue, PasteBoard Vuln 에 대해서 체크할 수 있다고 공식홈에 설명되어있습니다.

다만 Intent 데이터를 받을 수 있기 떄문에 위에 설명된 부분 이외에도 여러가지 방향으로 테스트해 볼 수 있을듯합니다.


Burp 확장기능, Android 앱으로 구성되어있으며 각각 maven, gradle로 컴파일이 필요합니다. (개발자가 미리 만들어두지 않았네요)

크게 구성을 보면 아래와 같습니다. App에서 다른 App의 데이터를 후킹하고, 그 데이터를 Burp Extension을 통해 Burp interface로 전달해줍니다. 분석가는 Burp를 통해 안드로이드 앱에 대한 동적 분석을 할 수 있습니다.



그럼 다운로드하고 시작해보도록 하죠.

#> git clone https://github.com/mateuszk87/BadIntent.git
#> cd BadIntent

BadIntentBurp

먼저 Burp 확장기능 부터 만들어봅시다. BadIntent 디렉토리 내 BadIntentBurp 디렉토리가 있고 pom.xml 파일이 있는 것으로 보아 maven 프로젝트로 보입니다.

#> cd BadIntentBurp
#> vim pom.xml

pom.xml 내용을 보니 maven이 맞네요. 따로 target.dir 지정하셔도 좋고, 지정 안하면 바로 하위에 target 파일이 생기게 됩니다.

#> cat pom.xml 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.mat3.badintent</groupId>
  <artifactId>badintent-burp</artifactId>
  <version>0.9.9.9</version>
  <name>badintent</name>
  <description>BadIntent Burp Plugin</description>
 
    <properties>
       <deploy.target.dir>/home/hahwul/</deploy.target.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

mvn을 이용해 패키지를 생성해볼까요?

#> mvn clean package
[INFO] Scanning for projects...
[INFO]                                                                       
[INFO] ------------------------------------------------------------------------
[INFO] Building badintent 0.9.9.9
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom (4 KB at 2.4 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom (13 KB at 23.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/21/maven-parent-21.pom

target 디렉토리로 가서 보면..

#> cd target
#> ls
archive-tmp  badintent-burp-0.9.9.9-jar-with-dependencies.jar  badintent-burp-0.9.9.9.jar  classes  generated-sources  maven-archiver

jar 파일이 생성되었습니다. Burp로 들어가서 해당 jar 파일을 로드시켜줍니다.
(badintent-burp-0.9.9.9.jar)


BadIntentAndroid

안드로이드 디렉토리로 들어가서 gradle로 apk를 만들어줍니다.
#> cd BadIntentAndroid
#> gradle assemble

or

아래 따로 트러블슈팅 내용도 적긴했지만 혹시 과정에 문제가 많다면 xpose에 올라온 apk 파일로 설치하는 것도 좋습니다.

http://repo.xposed.info/module/de.mat3.badintent



apk 를 받았다면 테스트할 폰에 깔아줍니다.

#> adb install badintent.apk 
434 KB/s (2768885 bytes in 6.227s)
pkg: /data/local/tmp/badintent.apk
Success



Conclusion

위에 앱에서 대충 써놓은 것 처럼 후킹할 패키지와 인터페이스에 대해 필터를 건 후 앱 동작 시 Burp Suite로 데이터가 넘어오게 됩니다. 대체로 앱 내 웹, API 요청에 대한 분석도 모바일 취약점 분석에서 많은 부분을 차지하기 떄문에 Burp, Fiddler와 같은 툴과의 연동성은 굉장히 좋은 장점으로 보입니다.

https://github.com/mateuszk87/BadIntent/raw/master/doc/img/main.png

※ TroubleShooting

설치 과정 중 발생했던 문제 관련해서 남겨눕니다. maven쪽은 별거 없었는데, gradle 에서 많이 걸렸습니다.

1. Minimum supported Gradle version is 2.14.1. 오류
apk를 만들기 위해 assemble 과정에서 아래와 같은 에러가 발생합니다.

#> gradle assemble
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.10/userguide/gradle_daemon.html.

FAILURE: Build failed with an exception.

* Where:
Build file '/home/hahwul/Noon/BadIntent/BadIntentAndroid/app/build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.application']
   > Minimum supported Gradle version is 2.14.1. Current version is 2.10. If using the gradle wrapper, try editing the distributionUrl in /home/hahwul/Noon/BadIntent/BadIntentAndroid/gradle/wrapper/gradle-wrapper.properties to gradle-2.14.1-all.zip

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.977 secs

먼저 에러 내용에서 나오는 것과 같이 gradle-wrapper.properties에서 distributionUrl을 2.14 이후로 올려주면 됩니다만, BadIntent의 경우 기본 3.0 대로 지정되어 있습니다.

고민하고 검색하다보니 간단한데 답이 있었습니다. 바로 gradle 자체 버전으로 인한 문제였습니다.
아래 블로그를 보시면 각각 gradle 버전에서 지원할 수 있는 plugins의 버전이 다르다는 것을 알 수 있습니다.

http://creaby.tistory.com/6

기존 2.1에서 상위버전으로 올려야겠습니다.

#> gradle -v

------------------------------------------------------------
Gradle 2.10
------------------------------------------------------------

Build time:   2016-01-26 15:17:49 UTC
Build number: none
Revision:     UNKNOWN

Groovy:       2.4.5
Ant:          Apache Ant(TM) version 1.9.6 compiled on July 8 2015
JVM:          1.8.0_131 (Oracle Corporation 25.131-b11)
OS:           Linux 4.4.0-97-generic amd64

ppa 등록 후 apt 통해 상위 버전으로 설치합니다.

#> add-apt-repository ppa:cwchien/gradle
#> apt-get update
#> apt-cache search gradle
android-platform-tools-base - base tools for developing applications for the Android system
gradle-debian-helper - Helper tools for building Debian packages with Gradle
gradle-doc - Powerful build system for the JVM - Documentations
gradle-propdeps-plugin - Gradle plugin enhancing the Maven integration
libgradle-core-java - Powerful build system for the JVM - Core libraries
libgradle-jflex-plugin-java - Gradle plugin for JFlex, a scanner generator
libgradle-plugins-java - Powerful build system for the JVM - All plugins
gradle - Gradle is a Groovy based build system
gradle-ppa - Gradle is a Groovy based build system
gradle-3.0 - Gradle is a Groovy based build system
gradle-3.1 - Gradle is a Groovy based build system
gradle-3.2 - Gradle is a Groovy based build system
gradle-3.2.1 - Gradle is a Groovy based build system
gradle-3.3 - Gradle is a Groovy based build system
gradle-3.4 - Gradle is a Groovy based build system
gradle-3.4.1 - Gradle is a Groovy based build system
gradle-3.5 - Gradle is a Groovy based build system
gradle-4.0 - Gradle is a Groovy based build system
gradle-4.0.1 - Gradle is a Groovy based build system
gradle-3.5.1 - Gradle is a Groovy based build system
gradle-4.0.2 - Gradle is a Groovy based build system
gradle-4.1 - Gradle is a Groovy based build system
gradle-4.2 - Gradle is a Groovy based build system
gradle-4.2.1 - Gradle is a Groovy based build system

#> apt-get install gradle-3.0
#> gradle -v

------------------------------------------------------------
Gradle 3.0
------------------------------------------------------------

Build time:   2016-08-15 13:15:01 UTC
Revision:     ad76ba00f59ecb287bd3c037bd25fc3df13ca558

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_131 (Oracle Corporation 25.131-b11)
OS:           Linux 4.4.0-97-generic amd64


2 .SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

두번째 문제는 ANDROID_HOME 환경변수 관련 문제입니다. 컴파일 시 Android SDK를 사용해야하기 때문에 환경 변수의 값을 참조하게 되어있습니다. 다만 사람에 따라 Android Studio를 사용하지 않을 수 있기 때문에(저 같은 상황) 환경 변수에 SDK가 설치된 경로를 넣어주면 깔끔하게 해결됩니다.

#> env | grep ANDROID_HOME
#> export ANDROID_HOME=/home/hahwul/Other/android/sdk/
#> env | grep ANDROID_HOME
ANDROID_HOME=/home/hahwul/Other/android/sdk/


3. You have not accepted the license agreements of the following SDK components:   [Android SDK Build-Tools 25.0.3].
(http://doctorson0309.tistory.com/42, 참고)
이 문제는 SDK에 라이센스 동의가 되지 았았다는 이야기로 보입니다.

Warning: License for package Android SDK Build-Tools 25.0.3 not accepted.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> You have not accepted the license agreements of the following SDK components:
  [Android SDK Build-Tools 25.0.3].
  Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html


sdk 디렉토리로 이동 후 license 디렉토리를 만들어줍니다.

#> mkdir license

그다음 licenses 디렉토리에 있는 android-sdk-license 파일을 license 디렉토리로 복사해줍니다.

#> licenses
#> cp android-sdk-license ../license

그러고 다시 해보면..

#> gradle assemble
License for package Android SDK Build-Tools 25.0.3 accepted.

Reference

https://github.com/mateuszk87/BadIntent
http://creaby.tistory.com/6
http://doctorson0309.tistory.com/42

댓글 4개:

  1. 혹시 Xpose 모듈이 단말에 설치되어있어야하나요?

    답글삭제
    답글
    1. 넵 맞습니다. Xpose base 로 구성되어서 필요합니다. 다만 xpose 없어도 설치까지는 되는데
      기능이 정상 동작할지는 모르겠네요

      삭제
  2. 추가로 Android에서 BadIntent 로드 시 많이 느려집니다. 되도록이면 사용 좋은 테스트폰에서..

    답글삭제
  3. 감사하게도 이분께서 빌드해서 올려놓으셨네요 :)
    https://github.com/mateuszk87/BadIntent/releases

    답글삭제