USB 연결 검사를 통한 동적 디버깅 탐지 방안과 우회 기법
들어가기 앞서
USB 디버깅 옵션 검사를 통한 동적 디버깅 탐지 방안과 우회 기법
들어가기 앞서 개발자 모드 검사를 통한 동적 디버깅 탐지 방안과 우회 기법 들어가기 앞서 동적 디버깅 도구(JEB Decompiler) 탐지 방안과 우회 기법 들어가기 앞서 ro.debuggable 값 검사를 통한 동적
naro-security.tistory.com
이전 "USB 디버깅 옵션 검사를 통한 동적 디버깅 탐지 방안과 우회 기법" 포스팅에 이어서 디바이스의 USB 연결 여부를 검사하여 동적 디버깅을 탐지하는 방안과 또, 이를 공격자의 관점에서 어떻게 우회할 수 있는지 다뤄보도록 하겠다.
실습 진행에 사용되는 ANDITER 앱은 아래의 GitHub에서 다운로드 가능하다.
GitHub - naroSEC/Anditer
Contribute to naroSEC/Anditer development by creating an account on GitHub.
github.com
개요
일반적으로 모바일 디버깅 및 기타 분석 도구들은 로컬 PC에서 실행시킨 후 USB를 통해서 디바이스와 연결해 사용한다. 물론, 몇몇 도구들 경우에는 공용 와이파이를 이용한 연결도 지원하지만 USB를 사용하는게 보편적이다.
Bypass Connect USB 탐지 항목은 디바이스에 USB가 연결 되었는지 확인하고 연결되어 있다면 애플리케이션이 디버그 모드로 동작 중인 것으로 판단해 탐지하게 된다. 하지만, USB 연결의 경우 PC와의 연결을 위해서 사용하기도 하지만 디바이스 배터리 충전 시에도 사용된다. 그래서 실제 애플리케이션에서는 USB 연결만으로 디버그 모드가 동작 중이라고 판단하지 않고 추가로 다른 설정들과 함께 참고해 디버그 모드를 탐지한다.
분석
[그림 2]의 isCheckConnectUSB() 함수는 Bypass Connect USB 탐지 결과를 반환해주는 역할을 한다. 코드를 보면 ①에서 IntentFilter를 통해 USB 연결 정보와 관련된 컴포넌트 유형을 지정해주고 있으며 ②에서는 디바이스에 USB가 연결 됐을 때 발생하는 이벤트를 수신하기 위해 ①에서 지정한 인텐트를 브로드캐스트 리시버에 등록해준다. 그리고 ③에서는 getBooleanExtra() 함수를 사용해 인수로 전달된 데이터가 인텐트에 포함되어 있는지 확인한다. 인텐트에 connected 데이터가 존재할 경우 true를 반환하고 존재하지 않을 경우 두 번째 인수로 지정한 디폴트 값 false를 반환하게 된다.
Bypass Connected USB 탐지를 우회하기 위한 후킹 포인트는 두 가지가 있다. 첫 번째는 함수 결과와 상관없이 무조건 False를 반환하도록 isCheckConnectUSB() 함수를 재 작성하는 방법이고 두 번째는 getBooleanExtra() 함수 호출 시 전달되는 첫 번째 인수 connected를 더미 값으로 변조해 두 번째 인수 값 false를 반환하도록 만드는 방법이다. 위에서도 설명 했듯이 getBooleanExtra() 함수는 데이터를 가져올 때 지정된 데이터가 존재하지 않는다면 함수 호출 시 전달된 두 번째 인수로 지정한 디폴트 값을 반환하게 된다. 여기서는 두 번째 방법을 사용해 탐지를 우회해 보도록 하겠다.
우회 실습
[그림 3-38]는 getBooleanExtra() 함수를 후킹하기 위해 필자가 작성한 Frida 스크립트이다. 코드를 보면 ①에서 getBooleanExtra() 함수 사용을 위해 Intent 객체를 생성했고 isCheckConnectUSB()에서 getBooleanExtra() 함수를 호출할 때 전달되는 인자의 데이터 타입에 맞춰 getBooleanExtra() 함수를 오버로딩으로 구현했다. ②에서는 함수 호출 시 들어오는 첫 번째 매개 변수(str) 값이 connecnted와 같다면 더미 값으로 변조하고 변조한 더미 값을 인자로 원본 getBooleanExtra() 함수를 호출해 해당 결과 값을 반환하게 된다.
Frida를 통해 작성한 스크립트를 ADITER 애플리케이션에 어태치 하고 Bypass Connect USB 탐지 항목을 체크하면 Success! 가 출력되며 탐지가 우회된 것을 볼 수 있다.
마무리
지금까지 디바이스의 USB 연결 여부를 검사하여 동적 디버깅을 탐지하는 방안과 또, 이를 공격자의 관점에서 어떻게 우회할 수 있는지 살펴봤다. 다음 포스팅에서는 후킹 도구 중 하나인 Frida의 여러 탐지 방법과 또 이를 우회하는 기법을 다뤄보도록 하겠다.