티스토리 뷰

728x90
반응형

[ 루팅 탐지 및 우회 취약점]

 < 콘텐츠 프로바이더 >

- 다른 애플리케이션의 데이터베이스나 파일에 접근할 수 있는 인터페이스 제공

- 주로 프로세스 간 통신으로 다른 애플리케이션과 데이터 공유 ( 앱 데이터를 다른 앱에서 사용할 수 있는 통로 제공 )

- Androidmanifest.xml의 <provider> 요소에 정의

 

Content Provider를 통한 데이터 얻어 오는 과정

 

- 컨텐츠 프로바이더에 접근하기 위해서는 콘텐츠 프로바이더의 주소인 URI와 콘텐츠 리졸버(Content Resolver)가 필요

- 컨텐츠 프로바이더의 주소인 URI는 "content://authority/path"와 같은 형식으로 구성'

   (인터넷 주소인 URI와 비슷한 구성이며, 콘텐츠 프로바이더의 주소는 content://로 시작)

- Authority는 콘텐츠 프로바이더의 고유 주소, path는 데이터 위치에 대한 정보가 있으므로,

  특정 애플리케이션의 데이터 위치를 찾아갈 수 있음

- 정상적일 때, 대상 앱의 데이터베이스에 접근 X, 사용자가 원하는 항목에만 접근하도록 공유 가능

- 비정상적일 때, 공격자는 민감한 데이터에 접근해 데이터를 조회, 변경 할 수 있음

 

 

 

 

 

< 취약점 진단 과정 >

1. Androidmanifest.xml에 콘텐츠 프로바이더가 선언되어 있는지 확인

<provider android:name=".TrackUserContentProvider" 
	android:authorities="com.android.insecurebankv2.
    TrackUserContentProvider" android:exported="true"> 
</provider>

- 프로바이더의 URI 구성에 포함되어 있는 authorities 항목이

  "com.android.insecurebankv2.TrackUserContentProvider" 로 설정되어 있음

 

 

2. 취약점 확인

1)  ADB 이용

1. exported 항목 확인

- false일 경우 : 같은 앱에서만 해당 요소를 호출해 사용

- ture일 경우 : 외부 앱에서 해당 요소 사용 가능

 

 

2. content:// 항목 확인

- true이므로, 다른 앱에서 해당 콘텐츠 프로바이더를 이용 가능한 상태로 보고 취약점 확인을 진행

- 콘텐츠 프로바이더를 이용해 다른 앱의 데이터 접근하기 위해서는 URI 이용

- 인시큐어뱅크에 설정된 URI 확인하기 위해 앱을 디컴파일하고 파일 내용 중 content://로 시작하는 항목 확인.

 

 

astrogrep : 특정 폴더의 파일의 내용 중 사용자가 입력한 단어가 포함되어 있는 파일이 있는지 확인하는 프로그램

Content:// 항목 확인

 

TrackUserContentProider.smail 항목을 확인해보면 

인시큐어뱅크에서 설정된 URI의 전체 주소는

content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers

 

기본적으로 콘텐츠 프로바이더의 URI는 content://로 시작하며,

위에서 제시한 URI는 manifest 파일에 선언되어 있는 부분과 path인 trackeruser로 구성.

 

 

3. 콘텐츠 프로바이더 취약점 확인

adb shell content query --uri [ URI 전체 주소 ]

dinesh는 인시큐어뱅크에서 로그인하는 사용자 id이므로

출력된 것은 사용자가 로그인한 내역이다.

 

이 내역은 인시큐어뱅크의 데이터베이스에 저장되기 때문에

출력되는 정보는 데이터베이스에서 가져와 출력되는 것으로 판단.

 

 

 

2) 드로저 이용

1. 콘텐츠 프로바이더 공격 가능 확인

run app.package.attacksurface com.android.insecurebankv2

attacksurfce 모듈 : 특정 안드로이드 패키지에서 겉으로 드러나는 공격 가능한 지점을 찾아줌

                                안드로이드에서 겉으로 드러나는 지점은 manifest 파일에서 각 요소가 exported되어 있는 지점을 의미

                                이는 각각의 정의된 컴포넌트에서 exported 속성이 true 되어있는 경우.

 

 

2. 콘텐츠 프로바이더 정보 확인

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

위 명령어로 대상 앱의 콘텐츠 프로바이더 정보 확인할 수 있음.

출력되는 정보는 androidmanifest.xml 파일에 선언된 정보와 동일.

 

 

3. 콘텐츠 프로바이더 URI 검색

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

scanner.provider.finduris 모듈 : 콘텐츠 프로바이더의 URI 주소를 검색해 접근 가능한 목록 출력.

                                                        대상 앱에 포함된 모든 URI 주소 출력해주고, 접근 가능한 항목 별도록 출력해줌.

 

인시큐어뱅크 앱은 접근 가능한 항목이 2개 출력되었으나, 2개가 동일하므로

content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers 를 통해 앱의 데이터를 조회

 

 

4. 콘텐츠 프로바이더를 이용한 데이터 확인

run app.provider.query [ URI 주소 ]

위 명령어는 ADB 통해 확인한 정보와 비슷하고 결과 또한 동일하게 출력된 것을 확인 가능

콘텐츠 프로바이더는 대상 앱의 데이터베이스나 데이터 등을 확인할 수 있으므로,

드로저를 이용해 SQL Injection이나 경로 탐색 등의 공격도 수행 가능하다.

 

 

 

< 드로저로 SQL Injection 하는 법 >

1. SQL injection 확인

run app.provider.query [ URI 주소 ] --projection " ' "

싱글 쿼터(') 취약점 존재 여부 확인

 

2. 테이블 목록 확

run app.provider.query [ URI 주소 ] --projection "* from SQLITE_MASTER where type='table';--"

"* from SQLITE_MASTER where type='table';--" 구문을 추가해 SQLITE에 존재하는 테이블 목록을 확인했다.

 

 

3. SQL Injection을 통한 names 테이블 출력

run app.provider.query [ URI 주소 ] "* from names;--"

 

 

 

 

< 대응 방안 >

1. exported를 false로 선언

<provider android:name=".TrackUserContentProvider" 
	android:authorities="com.android.insecurebankv2.
    TrackUserContentProvider" android:exported="false"> 
</provider>

- 콘텐츠 프로바이더를 통해 앱의 데이터가 유출되지 않도록 manifest 파일에 프로바이더 선언할 때

   exported를 false로 선언한다.

- false인 경우 권한이 없다는 메시지가 출력되고, 아무런 결과도 출력되지 X

- 콘텐츠 프로바이더는 앱 간에 데이터를 주고받는 중요한 역할 수행하므로 전화번호 등 다양하게 활용되는 데이터는

   연결통로가 막히면 사용자가 대신 입력해야 하는 불편함 발생

 

 

 

728x90
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함