naroSEC
article thumbnail

들어가기 앞서

 

Frida 실행 시 생성되는 파일 검사를 통한 탐지 방안과 우회 기법

들어가기 앞서 이번 포스팅부터는 모바일 데이터 위·변조 목적 및 분석 도구로 사용되는 후킹 도구인 Frida를 탐지하는 방안과 우회 기법에 대해서 다뤄보도록 하겠다. 실습 진행에 사용되는 ANDI

naro-security.tistory.com

이전 "Frida 실행 시 생성되는 파일 검사를 통한 탐지 방안과 우회 기법" 포스팅에 이어서 Frida 클라이언트와 서버가 통신 시 사용하는 포트를 검사하여 Frida를 탐지하는 방안과 우회 기법을 다뤄보도록 하겠다.

 

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

 

GitHub - naroSEC/Anditer

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

github.com


개요

[그림 1] Bypass Port 탐지

Frida는 클라이언트 & 서버(에이전트) 구조로 통신하며, 소켓을 통해 클라이언트가 명령을 요청하면 서버에서 해당 명령을 수행하게 된다. 이때, 서버는 클라이언트와의 연결을 위해 특정 포트를 사용하게 되는데 별도의 설정을 하지 않을 경우 디폴트 포트인 "27042"번 포트를 사용해 클라이언트와 통신한다.

[그림 2]  Frida 서버 실행 시 열려있는 디폴트 포트

디바이스에서 Frida 서버를 실행시킨 후 netstat 명령어를 통해 디바이스의 네트워크 정보를 확인해보면 [그림 2]와 같이 디폴트 포트인 27042 포트가 클라이언트와의 통신을 위해 열려있는 것을 알 수 있다.

Bypass Port 탐지 항목은 디바이스에서 Frida 서버 포트가 열려있는지 검사하고 해당 포트가 열려 있을 경우 Frida 서버가 동작 중인 것으로 판단해 탐지하게 된다.


분석

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

[그림 3]isCheckFridaBinary() 함수는 Bypass Port 탐지 결과를 반환해주는 역할을 한다. 코드를 보면 ①에서 Thread를 생성하고 디바이스 포트 검사를 위해 FridaDetector.isCheckFridaPort..inlined.Runnable.1 클래스 객체 정보를 받아오고 있다.

[그림 4]  FridaDetector.isCheckFridaPort..inlined.Runnable.1 클래스 소스코드

[그림 4]의 FridaDetector.isCheckFridaPort..inlined.Runnable.1 클래스 코드를 보면 ① Socket 클래스를 사용해 디바이스의 27000 ~ 27500 포트 중 연결되어 통신 중인 포트를 검사하고 있으며, isCheckFridaPort() 함수에서 ② Thread.start() 구문 실행 시 run() 함수가 자동으로 호출되어 해당 코드를 동작시킨다.

Bypass Port 탐지를 우회하기 위한 후킹 포인트는 두 가지가 있다. 첫 번째는 함수 결과 상관없이 무조건 false를 반환하도록 isCheckFridaPort() 함수를 재 작성하는 방법이고 두 번째는 통신 중인 포트를 검사할 때 사용하는 Socket 클래스를 후킹해 생성자 인수 값으로 전달되는 포트 번호를 변조하는 방법이다. 여기서는 두 번째 방법과 Frida 서버 설정 방법을 통해 탐지를 우회 보도록 하겠다.


우회 실습

[그림 5]  Socket 클래스의 생성자 생성 과정을 후킹하기 위한 Frida 스크립트

[그림 5]는 Socket 클래스 생성자를 후킹하기 위해 필자가 작성한 Frida 스크립트이다. 코드를 보면 에서 Socket 클래스 객체를 생성하고 FridaDetector.isCheckFridaPort..inlined.Runnable.1 클래스의 run() 함수에서 Sokcet 객체를 생성할 때 전달한 인자의 데이터 타입에 맞춰 생성자를 오버로딩으로 구현했다. ②에서는 Socket 객체 생성 시 들어오는 매개 변수 포트 값이 27042일 경우 임의의 포트 번호로 변조하고 변조한 값을 인다로 원본 Socket 클래스 객체를 생성해 결과 값을 반환하게 된다.

[그림 6]  Bypass Port 탐지 우회 성공

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


추가 우회 기법 실습

[그림 7]  Frida 서버 옵션

추가로 Frida 서버의 포트 지정을 이용한 탐지 우회 방법도 다뤄보도록 하겠다. [그림 7]은 Frida 서버 실행 시 설정할 수 있는 옵션에 관한 설명으로 -h 옵션을 통해 확인할 수 있으며 이 중 –l 옵션의 경우 Frida 서버의 동작 IP 주소 및 포트 지정을 가능케 해준다.

[그림 8] Frida 서버 포트 지정

-l 옵션을 사용해 임의의 포트 번호를 지정하고 Frida 서버를 실행시킨다. 그 후 netstat 명령을 통해 디바이스의 네트워크 정보를 확인해보면 [그림 8]과 같이 지정한 포트 번호로 동작되고 있는 것을 볼 수 있다. 애플리케이션에서 Frida 탐지 시 지정 포트 또는 포트의 범위를 검사하고 있을 경우 위와 같이 검사하지 않는 포트 번호를 지정해 사용하면 쉽게 우회가 가능하다.

Frida 서버 포트 번호를 변경하는 방법에 대해 자세히 알고 싶은 분들은 아래의 포스팅을 참고하면 된다.

 

Frida 포트 번호를 변경해서 실행하는 방법

개요 모바일 앱을 진단하다 보면 DroidX, AndroGuard 등 다양한 보안 솔루션이 적용된 앱을 보게 되는데 이들 대부분은 Frida를 필수적으로 탐지한다. 솔루션이 Frida를 탐지할 때는 보편적으로 Frida 생

naro-security.tistory.com

 

[그림 9]  포트 지정 방식을 통한 Bypass Port 탐지 우회 성공

Bypass Port 탐지 항목을 체크하면 Success! 가 출력되며 탐지가 우회된 것을 볼 수 있다.


마무리

지금까지 Frida 서버와 클라이언트가 통신 시 사용하는 특정 포트를 검사해 Frida를 탐지하는 방안을 다뤄봤고 또 이를 공격자의 관점에서 어떻게 우회할 수 있는지 살펴봤다. 다음 포스팅에서는 Frida에서 사용되는 모듈을 검사해 Frida를 탐지하는 방안과 우회 기법을 다뤄보도록 하겠다.

profile

naroSEC

@naroSEC

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

profile on loading

Loading...