naroSEC
article thumbnail

들어가기 앞서

이전 포스팅에 이어 시스템 속성이 정의되어 있는 Build.prop 속성을 검사해 탐지하는 방법과 또 이를 어떠한 방안을 통해 우회할 수 있는지 다뤄보겠다.

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

 

GitHub - naroSEC/Anditer

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

github.com


개요

[그림 1]  Bypass Build-Tags 탐지

루팅 패치 프로그램을 통해 디바이스 루팅을 진행할 때 해당 프로그램은 디바이스의 boot 이미지 설정값들을 수정하게 된다. 그리고 변경된 수정 사항들은 Android 시스템 파일인 build.prop에 반영되어 디바이스 부팅 시 참조하게 된다.

 

Bypass Build-Tags 탐지 항목은 Android 시스템 파일인 build.prop 파일의 시스템 속성 값을 검사하고 비정상 값 존재 시 루팅 디바이스로 판단해 탐지하게 된다.

 

[그림 2]  build.prop 시스템 속성 확인

일반적으로 바뀌는 시스템 속성 값은 ro.build.type, ro.build.tags, ro.build.display.id, ro.build.description, ro.build.fingerprint 등이 있으며, 디바이스 콘솔에서 getprop 명령어를 통해 확인이 가능하다.


분석

[그림 3] isCheckRootingKeys () 함수 소스코드

[그림 3]isCheckRootingKeys() 함수는 Bypass Module 탐지 결과를 반환해 주는 역할을 한다. 코드를 살펴보면 위에서 언급한 시스템 속성 값인 ro.build.type, ro.build.keys 등이 getSystemProperty 클래스의 prop() 함수 호출 시 인수 값으로 사용되고 있으며, 결과 반환 값은 arrayList0 리스트 변수에 저장된다. 그 후 contains() 함수를 통해 반환 값 중 test-keys 와 일치하는 문자열이 있는지 검사하게 된다.

 

[그림 4] getSystemProperty 클래스 소스코드

isCheckRootingKeys() 함수에서 사용된 getSystemProperty 클래스를 살펴보면 prop() 함수 하나만 존재하고 있고, 매개 변수로 받은 문자열은 Class 클래스를 통해 로드된 클래스의 함수 매개 변숫값으로 사용되며 해당하는 시스템 속성 값을 반환한다

 

Bypass Module 탐지를 우회하기 위한 후킹 포인트는 두 가지가 있다. 첫 번째는 함수 결과 상관없이 무조건 false를 반환하도록 isCheckRootingKeys() 함수를 재 작성하는 방법이고 두 번째는 prop 함수 호출 시 인수 값으로로 전달되는 문자열을 변조하는 방법이다. 여기서는 두 번째 방법을 사용해 탐지를 우회해 보도록 하겠다.


우회 실습

[그림 5] systemProperty 클래스의 prop() 함수를 후킹하기 위한 Frida 스크립트

[그림 5]는 systemPropertyClassprop() 함수를 후킹하기 위해 필자가 작성한 Frida 스크립트이다. 코드를 보면 ① isCheckRootingKeys() 함수에서 prop() 함수 호출 시 전달 했던 시스템 속성을 그대로 가져와 리스트로 선언했고 ②에서는 prop() 함수 사용을 위해 getSystemProperty 클래스 객체를 반환 받았다. ③ 에서는 prop() 함수로 들어오는 매개 변숫값이 ①에서 선언한 리스트에 포함되어 있을 경우 더미 값으로 변조하고 ④ 변조한 더미 값을 인수로 원본 prop 함수를 호출해 결괏값을 반환한다

 

[그림 6] Bypass Build-Tags 우회 성공

 

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


마무리

지금까지 안드로이드 OS가 참조하는 시스템 속성이 정의되어 있는 Build.prop 파일을 검사해 루팅 디바이스를 탐지하는 방법과 또 이를 어떻게 우회할 수 있는지 살펴보았다. 다음 포스팅에서는 디바이스의 시스템 디렉터리에 일반 사용자 쓰기 권한이 부여되어 있는지 검사해 루팅을 탐지하는 방법을 다뤄보도록 하겠다.

profile

naroSEC

@naroSEC

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

profile on loading

Loading...