상세 컨텐츠

본문 제목

[모바일 진단] 안드로이드 앱 루팅 우회

[Tech] 정보보안/보안진단, 모의해킹

by tech-dailylife 2021. 1. 6. 11:20

본문

반응형

(허가 되지 않은 공격 시도는 법적 문제 소지가 있으니 주의!)

 

이 글에서는 adb install을 통해 앱을 설치하는 방법, dex2jar와 jd-gui 도구로 디컴파일하여 소스분석하는 방법, apktool 도구로 디컴파일하고 smali 코드를 수정하여 재배포 하는 방법을 다룹니다.

 

 

1. 테스트 앱 다운로드

구글에서 uncrackable-level 1.apk 검색합니다.

안드로이드 앱의 확장자는 apk이며 OWASP에서 배포한 테스트 apk를 사용해보겠습니다.

 

 

2. 테스트 앱 설치 및 실행

녹스 애뮬레이터를 실행한 상태에서 nox_adb install 명령어를 사용하여 설치합니다.

# nox_adb install [apk 설치경로 포함 파일명]

CMD에서 성공이라고 뜨고 녹스 플레이어에서 앱을 보면 설치되어 있습니다.

앱을 실행해보면 루팅 단말로 탐지되었다는 문구가 출력되며, 앱을 더는 사용할 수 없습니다.

앱 진단을 하기 위해서는 루팅 탐지를 우회해야합니다.

루팅된 스마트폰에서 루팅탐지 없이 앱이 실행된다면 취약한 것이라고 볼 수 있으며,

루팅탐지가 되더라도 우회가 가능하다면 이 또한 취약한 것이라고 볼 수 있습니다.

 

3. apk 파일 디컴파일하여, jd-gui 로 소스코드 확인하기 (Feat. dex2jar)

apk 파일을 zip으로 확장자를 바꿈 -> 압축 해제

해제된 폴더에서 classes.dex 등 파일 확인

 

classes.dex(실행 파일)를 dex2jar와 같은 경로로 이동 시킵니다.

dex 파일을 dex2jar 파일에 드래그하여 실행시키면 .jar 파일이 생성됩니다.

.jar 파일을 압축 해제하면 .class 파일 얻을 수 있습니다.

이제 jd-gui를 실행합니다.

 

.class 파일을 jd-gui로 드래그하면 디컴파일된 .calss 파일을 볼 수 있습니다.

살펴보면, 루팅 탐지 팝업의 문구가 보입니다.

이제 이 a라는 함수 부분을 변조하여 루팅 우회를 시도하는 것이 목표입니다.

(a로 된것은 난독화가 적용되어 있어 함수명이 대체 치환되어 있는 것입니다.)

 

 

4. 루팅 우회 하기

> java -jar apktool_2.3.3.jar d UnCrackable-Level1.apk

위 명령어를 CMD에서 입력하여 apk 파일을 디컴파일을 합니다.

apktool은 apk파일을 컴파일하고 디컴파일할 수 있는 도구입니다.

컴파일은 b 옵션 디컴파일은 d 옵션이라는 점만 기억하세요.

(당연히 java를 설치해야합니다. 설치가 안되어있다면 jdk를 검색하여 설치하면 되고, 물론 환경변수 세팅까지 해줘야 합니다. 환경변수 세팅은 지난 포스팅에 있습니다. 참고)

apk 파일이 디컴파일되어 UnCrackable-Level1 폴더가 생깁니다.

폴더 내부를 보면 smali 폴더가 있고 그 안에 smali 코드가 존재합니다.

MainActivity 파일에서 루팅탐지 문구를 보았기 때문에 이 파일을 에디터로 열어봅니다.

문구를 역시 확인할 수 있습니다.

좀 더 아래를 보면 if-nez v0, : cond_0 이라고 되어 있고 그 아래 :cond_0을 보면 Root detected! 문구가 나오는 것을 볼 수 있습니다.

이 문구가 안나오게 하면 루팅이 우회될 것 같네요.

if-nez v0, :cond_0 을 cond_1로 바꿔봅니다.

(한 줄씩 해석할 수 있는 능력을 갖추면 수월해지겠죠. 그 전에는 느낌으로만 수정해보고 직접 동적으로 확인해봅니다.)

이제 수정한 코드가 있는 폴더를 다시 apk로 컴파일합니다.

> java -jar apktool_2.3.3.jar b UnCrackable-Level1

폴더 내에 dist 폴더가 있고 그 안에 컴파일된 apk 파일이 생성됩니다.

이제 이 파일을 녹스 애뮬레이터에 다시 설치를 해서 확인을 해봅니다.

인증서 문제로 설치가 되지 않습니다.

인증서 설치를 위해 우선 인증서로 사용할 키를 생성합니다.

keytool을 사용하여 아래와 같이 생성합니다.

> keytool -genkey -v -keystore my-release-key.keystore -alias test -keyalg RSA -keysize 2048 -validity 10000

비밀번호를 입력하고 정보를 임의로 입력합니다.(정보는 생략하여 Unknown으로 하겠습니다.)

keystore 파일이 생성되었습니다.

키를 생성하였으니 이 키를 가지고 apk 파일을 서명(sign)해야 합니다.

> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore UnCrackable-Level1.apk test

(참고 : 키를 생성할 때, alias로 지정한 문자열을 맨 뒤에 인자로 사용)

검증(verify)을 하는 절차가 남아있습니다.

> jarsigner -verify -verbose -certs UnCrackable-Level1.apk

서명한 apk 파일을 설치해보면, 아래와 같이 설치가 완료됩니다.

설치된 앱을 실행해보면, 이전에 루팅탐지가 되어 뜨던 팝업이 뜨지 않고 바로 앱 내부로 접속하는 것을 확인할 수 있습니다. 루팅우회가 성공되어, 취약점이 발견된 것입니다.

 

이렇게 루팅우회는 smali 코드에서 루팅탐지 하는 부분을 찾아 분기문을 변조하거나 조건문을 변조하는 방법을 사용하는 것이 일반적인 방법입니다.

 

 

(허가 되지 않은 공격 시도는 법적 문제 소지가 있으니 주의!)

반응형

관련글 더보기

댓글 영역