안드로이드 앱 취약점 진단

Simcurity·2023년 6월 12일
0

1. 드로저를 활용한 취약점 진단

드로저는 모바일 애플리케이션 취약점 진단 프레임워크인 머큐리의 새로운 업데이트 버전입니다.

1-1) 설치

https://labs.withsecure.com/tools/drozer 에서 apk only와 msi를 다운받습니다.

msi파일은 윈도우에서 설치 후 apk파일도 녹스 기기에 설치해줍니다.
녹스에서 실행 후 on으로 바꿔줍니다.

그 후 윈도우에서 다음 명령을 입력해줍니다.

adb forward tcp:31415 tcp:31415
drozer.bat console connect

오류가 발생하는데 이는 모듈이 없어서 발생하는 오류입니다. 필요한 모듈을 다운 받아줍니다.
필요 모듈 : protobuf, pyopenssl, twisted


성공적으로 실행됬네요.

2. 드로저를 활용한 앱 패키지 정보 확인

이제 드로저를 이용해 앱의 기본적인 정보들로부터 취약점을 확인하고 취약점으로부터 어떤 정보를 얻을 수 있는지 살펴보겠습니다.

run app.package.list -f insecure

insecurebank의 패키지 정보를 확인했습니다.

run app.package.info -a com.android.insecurebankv2

인시큐어뱅크의 패키지 정보를 확인했습니다.

여러 정보가 나옵니다. 프로세스 정보, 데이터 저장 위치, apk 파일 위치, UID 특히나 사용하는 권한이 눈에 띄네요.

run app.package.info -p <특정 권한>

입력으로 특정 권한을 가지고 있는 패키지 목록을 확인할 수 있습니다.
예를 들어, android.permission.SEND_SMS 권한은 SMS를 보낼수 있는 권한으로 이러한 권한은 AndroidManifest.xml파일에 정의되어 있고 모든 앱의 최상위 폴더에 존재합니다. 또한, 여러 정보를 추출할 수 있어 기본적으로 분석 대상입니다.

다음으로는 manifest파일을 볼 수 있는 명령어입니다.

run app.package.manifest <패키지 명>

앞서 보았던 권한들이 그대로 출력됩니다. 이처럼 앱의 기본적인 정보들을 추출하는 것만으로도 취약한 부분을 확인할 수 있고 유추할 수 있기 때문에 분석에 앞서 기본적인 정보들을 수집하는 것이 좋습니다.

3. 드로저를 이용한 취약점 분석

드로저는 자동으로 앱의 취약한 부분을 검색하는 기능을 가지고 있습니다.

run app.package.attacksurface <패키지 명>

명령어로 분석할 수 있습니다.

인시큐어 뱅크 앱을 분석해 보겠습니다.

결과로 액티비티에서 5개, 브로드캐스트 리시버에서 1개, 컨텐츠 프로바이더에서 1개 그리고 디버깅이 가능한 취약점이 발견되었습니다.

3-1) 액티비티 분석

5개의 액티비티가 노출된 정보를 더 자세하게 알아보기 위해 다음 명령어를 입력합니다.

run app.activity.info -a <패키지 명>

취약한 액티비티 정보가 정확하게 나왔습니다.

이제 실제로 액티비티를 실행시킬 수 있는지 테스트 해보겠습니다.
changePassword 액티비티를 정상적으로 로그인 후 접근했을 때와 드로저를 이용해 비정상적으로 접근했을 때의 차이점을 살펴보겠습니다.


정상적인 접근 시 계정의 ID가 적혀져 있습니다.

run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword
위 명령어를 한 문장으로 입력하게 되면

ID는 적혀있지 않은 액티비티가 노출됩니다. 즉 비정상적인 접근의 경우 로그인 정보가 없어 ID 항목이 공란이 됩니다.

 

3-2) 브로드캐스트 리시버 분석

브로드캐스트 리시버는 디바이스에서 이벤트가 발생하는 경우 브로드캐스트 신호를 주고받으며 시스템상에 일어나는 상황들을 공유합니다. 신호를 받기위해 각각의 신호에 맞는 액션 역시 적용되어 있어야 합니다. 인시큐어뱅크의 정의되어 있는 정보를 확인해보겠습니다.

run app.broadcast.info -f insecure

입력 시 앞서 본 브로드캐스트 취약한 부분이 상세하게 출력됩니다.
인시큐어뱅크 앱에서 사용하는 브로드캐스트 리시버 이름은 MyBroadCastReveiver입니다.
app.broadcast.info 모듈에 여러 옵션이 있습니다.
-a : 특정 패키지에 대해 브로드캐스트 취약점 점검
-f : 특정 단어를 포함한 앱만 취약점 점검
-u : 숨겨진 리시버를 점검

숨어있는 리시버가 있는 경우 다음과 같이 hidden reveiver이 출력됩니다.

3-3) 컨텐츠 프로바이더 분석

컨텐츠 프로바이더는 특정 애플리케이션이 사용하고 있는 데이터베이스를 공유하기 위해 사용됩니다. 또한, 전체 데이터가 아닌 공유하고 싶은 데이터만 공유를 할 수도 있습니다.

run app.provider.info -a <패키지 명>

인시큐어뱅크의 프로바이더 정보입니다.

결과로 com.android.insecurebankv2.TrackUserCintentProvider이 노출되었습니다.
프로바이더는 데이터베이스에 있는 정보를 URI로 공유하기 때문에 데이터베이스에 접근하기 위해서는 URI 정보가 반드시 필요합니다.

run app.provider.finduri <패키지 명>

앱의 URI 정보를 얻었습니다. 이제 이 정보로 어떤 정보에 접근할 수 있는지 확인해보겠습니다.

run scanner.provider.sqltables --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackusers/

3가지 테이블에 접근할 수 있습니다.

run scanner.provider.sqltables -a com.android.insecurebankv2

-a 옵션으로 패키지에서 사용하는 모든 URI 정보를 얻을 수 있습니다.

이제 얻은 테이블 정보를획득하기 위해 app.provider.query 모듈을 사용하겠습니다.
먼저, -h로 모듈 설명을 보겠습니다.

모듈 뒤에 uri만 넣음으로써 자동으로 분석하는 방법이 있고 --selection, --projection 옵션을 이용해 데이터베이스 정보를 추출하는 방법도 있습니다.

uri만 넣으니 로그인한 순서가 보여집니다.

다른 정보도 얻기 위해 sqlite_master 테이블을 사용합니다. 안드로이드는 기본적으로 sqlite 데이터베이스를 사용합니다.

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

리눅스나 윈도우에서의 sql injection 처럼 쿼리문에 변화를 주어 정보를 추출합니다.

--projection 옵션으로 작성한 sql 쿼리문이 적용되었고 그로 인해 sqlite_master 정보가 노출되었습니다.
그럼 이제 더 구체적인 정보를 얻기위해 쿼리문을 바꿔보겠습니다.

run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection name' from names where id = 2;'--

id 컬럼의 값이 2인 names을 추출하였습니다.

이를 통해 알 수 있는 것은 컨텐츠 프로바이더에 관련된 정보를 얻고 URI 정보를 얻은 후 URI 정보를 기반으로 쿼리문을 생성하여 sql 인젝션 공격이 가능하다는 것입니다.

scanner.provider.injection 모듈은 이러한 인젝션 공격이 가능한지 취약점 여부를 판단해주는 모듈입니다.

취약한 URI 주소와 인젝션 공격 방법도 분류해줍니다.

3-4) 서비스 분석

서비스란 액티비티와 반대로 UI가 없이 백그라운드에서 실행되는 컴포넌트의 한 종류입니다.
예시로, 음악이 있습니다. 음악을 틀고 다른 어플을 실행해도 백그라운드에서 동작하는 서비스가 실행되기 때문에 음악은 정지하지 않습니다.

run app.service.info -a <패키지 명>

bluetooth 앱의 서비스 목록 입니다. 해당 모듈도 마찬가지로 -u, -f옵션이 있습니다.

run app.service.info -u -f com.android.bluetooth

3-5) Debuggable package 분석

마지막으로 발견된 디버깅 가능 취약점입니다. 디버깅을 통해 중요 정보를 노출할 수 있으며 액티비티 우회 취약점, 컨텐츠 프로바이더 실행 취약점 등이 이에 해당합니다.

run app.package.debuggable -f insecure

인시큐어뱅크 앱의 디버깅이 가능한 권한 목록들입니다.

4. 모듈 관리

드로저는 모듈을 기반으로 작동하는 취약점 진단 서비스입니다.
그러므로 다양한 모듈들을 추가하거나 삭제할 수 있습니다.

4-1) 모듈 설치

저장소를 관리하는 방법에는 크게 두 가지가 있습니다.
search 명령어로 연결된 공식 모듈 저장소로부터 다운로드할 수 있는 모듈을 검색해보겠습니다.

module search

module search root -d exploit

모듈이름에 root가 들어가고 exploit 기능이 있는 모듈들을 출력합니다.
module install metall0id.root.cmdclient

모듈을 설치할 경로를 입력하면 모듈이 성공적으로 설치됩니다.

다음 시간엔 본격적으로 취약점 항목별 실습을 진행하겠습니다.

0개의 댓글