naroSEC
article thumbnail

들어가기 앞서

2023.05.31 - [안드로이드] - ANDITER를 활용한 Writeable 기반의 루팅 탐지 및 우회 방법

 

ANDITER를 활용한 Writeable 기반의 루팅 탐지 및 우회 방법

들어가기 앞서 이전 포스팅에 이어 시스템 디렉터리 권한 검사를 통한 탐지 방법과 또 이를 어떠한 방안을 통해 우회할 수 있는지 다뤄보겠다. 실습 진행에 사용되는 ANDITER 앱은 아래의 Github에

naro-security.tistory.com

 

이전 포스팅에 이어 시스템 속성인 ro.secure, ro.adb.secure 값 검사를 통한 탐지 방법과 또 이를 어떠한 방안을 통해 우회할 수 있는지 다뤄보겠다.

 

실습 진행에 사용되는 ANDITER 앱은 아래의 Github에서 다운로드 가능하다.

 

GitHub - naroSEC/Anditer

Contribute to naroSEC/Anditer development by creating an account on GitHub.

github.com


개요

[그림 1] Bypass System Property 탐지

루팅 패치 프로그램을 통한 디바이스 루팅 방식은 크게 두 가지로 나눠진다.첫 번째는 리커버리(복구 모드)를 통한 커스텀 바이너리 패치 방식이고 두 번째는 Android OS 초기 버전에서 사용되던 방법으로 default.prop 파일의 ro.secure 값을 변경해 루팅 커널 이미지를 제작하는 방식이다. 이 경우 루팅을 진행하지 않은 순정 디바이스 경우 시스템 속성인 ro.secure와 ro.adb.secure 값이 1인 반면에 루팅 디바이스는 1외의 값으로 설정된다.

 

Bypass System Property 탐지 항목은 디바이스 시스템 속성을 검사해 ro.secure, ro.adb.secure 값이 1이 아닐 경우 루팅 디바이스로 판단해 탐지하게 된다.


시스템 속성 변경

[그림 2] ro.sercure, ro.adb.secure 값 확인

ro.secure, ro.adb.secure 값은 디바이스 콘솔에서 getprop 명령어를 통해 확인이 가능하며 사용하는 디바이스 또는 루팅 패치 방식에 따라서, ro.secure, ro.adb.secure 값이 1인 사람이 있고, 0인 사람이 있을 것이다. 예전 방식의 루팅 패치 또는 낮은 버전의 Android OS를 사용하는 경우 0일 가능성이 있다. 원활한 실습을 위해 탐지를 원하는 경우 두 가지 방법을 통해서 시스템 속성 값을 변경할 수 있다.

 

첫 번째 방법은 Android 9.0 이하에서 사용 가능한 방법이다. Android OS에는 build.prop 설정을 변경하기 위한 setprop이라는 명령어가 존재하는데 현재는 Android OS 보안 정책에 의해 해당 명령어를 사용하더라도 값이 변경되지 않는다. 하지만, 별도의 바이너리 패치를 적용하면 setprop 명령어를 통해서 속성 값 변경이 가능해진다. 패치 파일은 아래의 링크를 통해 다운로드 및 사용법을 참고하면 된다.

 

GitHub - jedy/mprop: 修改android系统属性

修改android系统属性. Contribute to jedy/mprop development by creating an account on GitHub.

github.com

추가로 시스템 속성 값을 변경하기 앞서 주의할 점이 있는데 ro.secure 값이 1이 아닌 다른 값으로 변경될 경우 USB 인식, 부팅 관련 문제가 발생할 수 있다. 따라서, 값 변경 시 ro.secure 값은 변경하지 않고 ro.adb.secure 값만 0으로 변경한다.

 

두 번째 방법은 Android 5.0 이상에서 사용 가능하며, Magisk를 이용한 방법이다. Magisk는 링크에서 Github에서 다운로드해 설치하면 되며, 해당 포스팅에서는 Magisk를 설치해 값을 변경하고자 한다.

 

GitHub - topjohnwu/Magisk: The Magic Mask for Android

The Magic Mask for Android. Contribute to topjohnwu/Magisk development by creating an account on GitHub.

github.com

 

[그림 3] Magisk props 실행 초기 화면

Magisk 설치가 완료되었다면, 디바이스에 접속해 props 명령을 실행한다. 그러면 [그림 3-38]과 같은 화면이 출력되며 5번을 선택해 시스템 설정 페이지로 이동한다.

 

[그림 4] Magisk 시스템 설정 페이지

새로운 시스템 설정을 위해 n을 선택해 [그림 3-39]와 같이 New custom prop 설정 페이지로 이동해 준다.

 

[그림 5] 시스템 속성 입력 화면

변경을 원하는 시스템 속성 이름은 [그림 3-40]와 같이 입력한다. 여기서는 ro.adb.secure를 입력해 주면 된다.

 

[그림 6] 시스템 속성 값 변경 화면

위 [그림 6]과 같이 확인 페이지가 출력되면 y를 선택하고, 변경을 원하는 값을 입력해 주면 된다. ro.adb.secure 값을 0으로 변경해 줘야 하기 때문에 여기서는 0을 입력하면 된다. 그 후 디바이스 재 부팅이 진행되고 변경된 값이 시스템 설정에 적용된다.


분석

[그림 7]isCheckForProps() 함수 소스코드

[그림 7]의 isCheckForProps() 함수는 Bypass System Property 탐지 결과를 반환해 주는 역할을 한다. 먼저 ①을 보면 이전 Bypass Build-Tags 항목에서 사용됐던 getSystemProperty 클래스의 prop() 함수가 사용되는 것을 볼 수 있다. 해당 함수는 매개 변수로 들어오는 문자열에 해당하는 시스템 설정값을 반환해 주는 기능을 가지고 있으며, 여기서는 ro.secure, ro.adb.secure 속성 값을 반환해 s, s1 변수에 저장하고 ②에서 저장된 값이 0인지 equals() 함수를 통해 검증해 0이라면 루팅 디바이스로 탐지하게 된다.

 

Bypass System Property 탐지를 우회하기 위한 후킹 포인트는 세 가지가 있다. 첫 번째는 함수 결과 상관없이 무조건 false를 반환하도록 isCheckForProps() 함수를 재 작성하는 방법이고 두 번째는 Bypass Build-Tags 항목을 우회하기 위해 사용했던 방법과 동일하게 getSystemProperty 클래스의 prop() 함수로 들어오는 매개 변수를 더미 값으로 변조하는 방법이다. 그리고 세 번째는 equals() 함수를 후킹해 결괏값을 false로 반환하게 만드는 방법이다. 여기서는 첫 번째 방법을 사용해 탐지를 우회해 보도록 하겠다.


우회 실습

[그림 8] isCheckForProps() 함수를 후킹하기 위한 Frida 스크립트

[그림 8]은 isCheckForProps() 함수를 후킹하기 위해 필자가 작성한 Frida 스크립트이다. ①에서는 isCheckForProps 함수 사용을 위해 RootingDectector 클래스 객체를 반환받고 ②에서는 ①에서 반환받은 RootingDectector 클래스의 isCheckForProps() 함수를 implementation을 사용해 함수 호출 시 무조건 false를 반환하도록 재 작성했다. Bypass System Property 탐지 항목을 우회하기 위한 코드는 위 세 줄의 코드가 전부이며 이전 탐지 항목들도 위와 같이 코드 작성 시 우회가 가능하다.

 

다만, 이 방법은 사용 시 주의가 필요한데 함수 재 작성 시 원본 함수의 데이터 반환 타입을 맞춰줘야 하고 또한, 해당 함수에서 다른 액티비로 데이터를 전송하거나 Context 정보를 수정하는 경우에도 동일한 기능을 수행할 수 있도록 코드를 작성해야 한다. 그렇지 않고 단순히 false 또는 true 값만 반환하게 될 경우 애플리케이션은 높은 확률로 오류가 발생해 종료된다. 따라서, 위 방법 사용 시 사전에 재 작성하려는 함수에 대한 정밀 분석이 이뤄져야 한다.

 

[그림 9] Bypass System Property 우회 성공

Frida를 통해 작성한 스크립트를 ADITER 애플케이션에 어태치 한다. 그 후 Bypass System Property 탐지 항목을 체크하면 Success! 가 출력되며 탐지가 우회된 것을 볼 수 있다.


마무리

지금까지 안드로이드 시스템 속성인 ro.secure와 ro.adb.secure의 값을 검사해 루팅 디바이스를 탐지하는 방법과 또 이를 어떻게 우회할 수 있는지 살펴보았다. 다음 포스팅에서는 디바이스의 백그라운드 프로세스를 검사해 루팅 전용 애플리케이션들이 동작 중인지 확인하고 이를 토대로 루팅 디바이스를 탐지하는 방법을 다뤄보도록 하겠다.

profile

naroSEC

@naroSEC

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...