결론 : 파일 이름 잘 바꾸면 우회가 가능하다!

1. 환경

어플 에뮬레이터 프로그램을 이용하여 rooting환경을 구성하고 어플이 이를 탐지하는가 안 하는가를 점검해 보겠습니다.

이번 들은 로컬 파일 변경 즉, SU파일 변경을 통한 우회를 알려드릴 생각입니다.

 

우선 단말기 혹은 에뮬레이터의 환경을 루팅 하는 것이 중요합니다.

기본적인 안드로이드 루팅은 녹스 에뮬레이터는 환경설정에서 변경이 가능하며 단말기는 루팅 어플(Kingroot, magisk, SuperSU 등등)을 이용하여 루팅하고 각각의 진단 환경을 구성해 줍니다.(안드로이드 루팅은 구글에 많습니다.)

 

단말기의 경우는 root explorer를 자주 사용하는 것으로 알고 있습니다.(굳이 언급한 어플이 아니더라도 파일 이름을 변경할 수 있는 어플은 정말 많습니다.)

 

2. 방법

이 방법은 정말 간단하지만 백신이 적용되어 있지 않거나 없는 경우에 가장 많이 발생하는 취약점입니다.

 

기본적인 SU파일은 루트 디렉터리의 system/bin과 system/xbin에 존재하며 비슷한 이름으로 감추어져 있는 경우도 있습니다.(system 디렉터리에 대부분 존재하므로 찾아보시면 발견하실 수 있습니다.)

 

우선 파일의 위치를 찾아가는 방법은 크게 두 가지로 말씀드릴 수 있습니다.

1) 안드로이드 파일 관리자

2) adb tool

 

1) 안드로이드 파일 관리자

파일 관리자는 루팅된 환경에서 권한은 높이는 작업이 필요하다.

대부분이 su파일의 이름을 바꿀 경우 rootroot 권한보다 높은 권한을 요구하지만 이는 권한을 허용해 주는 것으로 변경이 가능하다.

위의 그림의 su파일의 이름에 다른 문자를 붙이거나 이름을 변경하는 것 만으로 우회가 가능하다.

 

2) adb tool

adb의 커서 위치를 위에 말했던 system 디렉터리로 옮기고 rename을 통해 su파일의 이름을 변경해 주면 됩니다.

 

최근의 어플은 대부분 이 방법을 막아 두었지만 아직도 백신이 적용이 되어있지 않거나 백신이 없는 앱은 되는 경우가 많은 취약점이기도 합니다.

1) 선행

드로저를 사용하기 위해서는 선행되어 설치해야 할 프로그램들이 조금 있다.

ADB, Python27, JAVA가 있다.(설치법은 인터넷을 찾아보시길)

필요에 따라 에러 발생 시 PIP를 이용한 부수적인 설치가 필요하다.

 

2) 드로저 설치

https://labs.mwrinfosecurity.com/tools/drozer/ 접속 후

APKMSI를 다운로드한다

APK는 단말기에 설치해준다(APKAgent이다)

MSI는 그냥 깔아도 되지만

환경변수의 Path를 Python27 폴더로 지정하여 깔아준다.(Python3점대 버전이면 코드를 읽지 못하는 경우가 발생할 수도 있다(:COMMAND Error))

 

3) 드로저 연결

(NOX 환경)

우선 디바이스의 개발자 모드 변환과 USB 디버깅을 허용해주어야 한다.

물론 USB 디버깅 시에 일반 사용자 모드여도 괜찮지만 앱 테스트를 하기 위해서는 rooting을 한 Device를 사용하는 것을 추천한다.

adb devices

디바이스의 연결 여부를 확인할 수 있다.

만약 실제 단말기를 이용한다면 USB 디버깅 설정 시에 이 명령어로 디바이스 연결 여부를 확인할 수 있다.

adb connect 127.0.0.1:62001 (NOX환경)

녹스 환경의 기본적인 Device127.0.0.1:62001로 지정되어 있다.

연결이 되지 않는다면 뒤의 포트번호를 62025, 62026 등으로 변경해서 시도한다면 연결이 되는 것을 확인할 수 있다.

adb forward tcp:31415 tcp:31415

드로저 Agent를 디바이스에서 실행한 후 Embedded ServerON으로 설정하여 준다.

이는 포트를 포워딩함으로써 드로저의 동적 분석을 하기 위한 선행 작업이다.

drozer console connect

포트가 연결이 되었다면 이 명령어로 드로저를 실행시켜주어야 한다.

만약 저 명령어가 실행되지 않는다면 Python의 경로를 환경변수에 등록했는지 확인해보면 된다. (내 컴퓨터 우클릭 – 고급 시스템 설정 – 환경 변수 Path값에 Python27 Python27/Scripts 경로 추가)

이후 드로저 실행 시에 오류가 생길 수 있는데 이는 JAVA미설치, Python 미설치 혹은 3점대 버전 설치가 있으며 가장 많이 일어나는 오류로는 모듈이 설치되지 않은 경우가 대부분이다.

pip install protobuf

pip install pyOpenSSL

pip install twisted

pip install service_identity

위의 명령어를 사용하면 대부분의 문제점은 해결이 된다.

 

4) 패키지 확인

가장 먼저 분석할 앱의 package를 알아야 하는데 이는 드로저를 실행하여 확인할 수 있다

run app.package.list

위의 명령어를 사용하면 모든 package를 볼 수 있지만 분석하고자 하는 앱을 정확이 알고 있다며 더 쉽게 찾을 수 있는 방법이 있다.

run app.package.list -f <분석할 앱에 꼭 들어가는 간단한 단어>

<분석할 앱에 꼭 들어가는 단어> <------ 이 부분을 알고 있는 단어로 고쳐주면 된다.

: run app.package.list -f insecure

이렇게 쓸 경우 insecure가 들어간 package는 모두 찾는 것이다.

 

5) 앱의 퍼미션 확인 및 간단한 정보 수집

run app.package.info -a <package>

이 명령어로 앱의 process이름, 디렉터리, APK경로, UID, GID, 공유 폴더 및 공유 ID, 사용 중인 퍼미션 등을 알 수 있습니다.

run app.package.manifest <package>

이 명령어를 이용하여 앱의 manifest파일을 읽는 것도 가능하다.

위의 정보를 이용하여 앱의 설정 정보를 알 수 있습니다.

 

6) attacksurface확인

run app.package.attacksurface (package)

위의 명령어를 통해 앱의 activity exported, broadcast receivers exported, content providers exported, services exported의 액티비티를 확인할 수 있습니다.

상황에 따라 명령어의 결과 값 하단에 is debuggable이 포함되어 출력될 수도 있습니다.

is debuggable에 포함되어 출력되는 경우 개발 앱이 아닌 릴리즈 버전이라면 큰 취약점이 될 수 있다. 앱의 코드에 임의의 코드를 주입하여 실행시킬 수 있으며 코드를 변조한 공격에 취약할 수 있다.

 

7) 액티비티 확인 및 점검

run app.activity.info -a <package>

attacksurfaceactivity exported에 포함된 액티비티를 점검하기 위해 액티비티 경로 및 간단한 정보를 알아보는 과정이다.

run app.activity.start --component <package> <activity>

activity의 알아낸 정보를 통해 실행 가능한 activity를 실행시켜 불필요한 activity의 존재 여부나 취약한 부분을 점검한다.

 

8) broadcast확인

run app.broadcast.info -u -f <package>

attacksurface를 통해 알아낸 broadcast의 수를 알아내고 그 리시버를 테스트한다.

(체크하는 부분이나 취약한 부분은 하는 사람이 알아냄에 따라 다르다. 설정 사항이나 소스 및 리시버의 사용 형태에 따라 새롭게 나뉠 수 있다.)

 

9) Provider확인

앱이 사용하는 정보 혹은 DB를 공유하기 위해 사용하는 부분이다. 전체가 아니라 일부분의 정보만을 공유하고자 사용한다.

run app.provider.info -u -a <package>

위의 명령어를 활용해 현재 어플의 provider를 확인하고 노출된 provider의 존재 여부를 확인할 수 있다.

예로 contentprovider가 노출이 되었다면 이건 알아볼 가치가 충분한 경우이다.

 

지금부터는 가정을 전제하여 설명을 이어가도록 하겠습니다.

만약 취약한 provider 혹은 의심이 가는 provider의 존재를 확인했을 경우에는 URI정보를 확인해 봄으로써 DB정보를 공부하는 방식을 알아볼 필요가 있다.

 

run app.provider.finduri <package>

위의 명령어로 활용 중인 URI의 정보가 나오면 이 정보를 통해 packageprovider부분을 점검해 볼 수 있다.

 

run scanner.provider.sqltables --uri <URI 한 줄 전체 삽입>

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

위의 명령어를 입력하면 provider와 관련된 테이블 정보를 보여줍니다.

 

run scanner.provider.sqltables -a <package>

모든 URI에 대해 감색하고 싶다면 위의 방법을 쓰는 것도 좋습니다.

 

10) SQL Injection 분석

먼저 분석하기에 앞서 Query의 사용 방법을 확인할 수 있습니다.

run app.provider.query -h

마지막의 -h--help라 써도 무방하며 이 방법으로 Query의 사용방법을 알 수 있습니다.

dz> run app.provider.query -h

usage: run app.provider.query [-h] [--projection [columns [columns ...]]]

[--selection conditions] [--selection-args [arg [arg ...]]]

[--order by_column] [--vertical]

uri

 

Query a content provider

 

Examples:

Querying the settings content provider:

 

dz> run app.provider.query content://settings/secure

 

| _id | name | value |

| 5 | assisted_gps_enabled | 1 |

| 9 | wifi_networks_available_notification_on | 1 |

| 10 | sys_storage_full_threshold_bytes | 2097152 |

| ... | ... | ... |

 

Querying, with a WHERE clause in the SELECT statement:

 

dz> run app.provider.query content://settings/secure

--selection "_id=?"

--selection-args 10

 

| _id | name | value |

| 10 | sys_storage_full_threshold_bytes | 2097152 |

 

Last Modified: 2012-11-06

Credit: MWR InfoSecurity (@mwrlabs)

License: BSD (3 clause)

 

positional arguments:

uri the content provider uri to query

 

optional arguments:

-h, --help

--projection [columns [columns ...]]

the columns to SELECT from the database, as in "SELECT <projection> FROM ..."

--selection conditions

the conditions to apply to the query, as in "WHERE <conditions>"

--selection-args [arg [arg ...]]

any parameters to replace '?' in --selection

--order by_column the column to order results by

--vertical

읽는 것이 귀찮으실지도 모르지만 읽어두면 도움이 되는 부분이라서 전부 옮겨 두었습니다.

 

11) URI를 활용한 자동 Query분석

run app.provider.query <URI 한 줄 전체 삽입>

URI의 테이블을 확인하는 것에 좋은 명령어입니다.

 

"--selection", "--protection"들의 옵션을 이용하여 master table을 확인할 수 있습니다.

run app.provider.query <URI 한 줄 전체 삽입> --projection "* from sqlite_master where type='table';--"

위의 명령어는 master table을 조회하는 명령어이지만 query를 변경하여 세세한 점검을 진행할 수 있습니다.

 

12) Query분석을 하는 가장 쉬운 방법

앞의 분석은 세세하게 하나하나 살펴볼 수 있다는 장점이 있지만 굉장히 귀찮은 것도 사실이다.

또한 분석이 너무 느리다면 그것도 문제가 될 수 있다고 생각한다.(하나에만 매달려 있을 순 없지 않나요?)

 

run scanner.provider.injection -a <package>

빠르게 분석할 때 굉장히 좋은 방법이다. 취약한 URI Injection 가능한 공격 방법도 자동 분류해준다.

하지만 이 방법을 쓰기 전에 위의 방법을 하나하나 익혀서 기본적인 분석 방법을 익히고 흐름을 익힌다면 상황이 바뀌더라도 적을 하거나 분석하는 것에 수월함이 있을 것입니다.

 

13) Service확인

run app.service.info -u -f <package>

service에 관한 정보를 확인할 수 있습니다. permission을 확인할 수 있습니다. 또한 hidden service를 확인할 수 있습니다.

 

14) 디버깅 가능 앱 분석

run app.package.debuggable -f <package>

디버깅이 가능한 앱은 간단한 디컴파일을 통하거나 디버깅을 통해서 중요 데이터를 노출할 수 있다.

 

15) 모듈 분석

mudule search

module search <단어>

module search <단어> -d exploit

위의 명령어를 통해 단어가 포함된 모듈을 찾을 수 있으며 아래의 명령어로 그에 해당하는 exploit을 찾을 수 있습니다. 만약 해당하는 exploit이 존재하여 다운을 받고 싶다면 module install <module명>으로 다운로드할 수 있습니다.

 

 

+ Recent posts