'2013/11'에 해당되는 글 1건

  1. 2013.11.05 Android 환경에서 후킹을 통한 SSL 스트립 방법

많이 어플리케이션이 보안을 위해 SSL통신을 수행하고있으며, 연구나 다른 목적을 위해 SSL패킷을 스트립해야하는 경우가 생깁니다. (저는 제일 처음 모바일 게임쪽을 분석하기위해 이를 수행하였습니다.)

이를 위해 일반적으로 PC 환경에서는 SSL 스트립을 위해 MITM(Man In The Middle)을 수행합니다.

하지만 모바일 환경에서는 MITM이 쉽게 수행되지 않습니다.

가장 큰 이유는 윈도우에서도 CA체크가 되지않은 인증서의 경우 경고창이 뜨고 클릭해야 실행할 수 있듯이, 모바일에서도 CA체크를 합니다. 그리고 대부분에 SSL을 사용하는 어플리케이션에서는 CA체크에 대해서 호락호락하게 넘어가주지 않습니다. (하지만 다 할수있는 방법은 있습니다. Mitm을 수행할 필요가 있으신분은 Kandroid에서 GMS 를 분석한 자료를 보면 참고하면 됩니다. )

하지만 특정 어플에서 발생하는 SSL 트래픽을 구분하기도 힘들뿐더러, 환경을 구성하기도 번거럽습니다..

그래서 본 포스팅에서는 좀 더 쉽게(?) SSL 스트립을 할 수 있는 방법을 제시합니다. 모두가 아는방식일거고 이미 쓰는사람도 많을겁니다.

안드로이드는 SSL 통신을 위해 내부적으로 openssl 을 사용합니다.

그리고 SSL_read, SSL_write 함수를 통해 데이터 송수신을 수행합니다.

즉, SSL_read 함수와 SSL_write 함수를 후킹해서 송수신 전, 후의 데이터를 가져온다면, 인증서 생성 환경구성등의 번거러운거 없이 SSL 스트립을 수행할 수 있습니다. (이게 더 번거러울지도 모름....)

SSL_read, SSL_write 의 데이터를 가져오기 위해서는 후킹을 통해 두 함수의 기능에 로깅을 추가하면 되며, 쉽게 2가지 방법을 선택할 수 있습니다.

1) 프레임워크 소스코드를 받아 로깅기능을 추가한 libssl.so 를 재 컴파일해서 교체하면 손쉽게 로깅을 수행 할 수 있습니다. 하지만 이경우 어플에 대한 예외처리를 하지 않을경우 시스템에서 SSL 을 사용할 경우 모두 로깅이 되기 때문에 엄청난 데이터가 축적됩나다.

2) 두번째 방법으로는 고전적으로 많이 사용되던 lnline 후킹을 통해 함수에 전달되는 데이터를 추출할 수 있습니다. 특정 프로세스 메모리에 존재하는 SSL_read 함수와 SSL_write 함수를 패치하여 인자 및 수행결과를 추출할 수 있습니다. (비슷한 연구로는 collin님이 발표한 Dynamic Binary Instrumentation on Android 이 있었고, 물론 발표에 사용된 도구 모두 제공됩니다. 하지만 코어 라이브러리에 대한 후킹이 재대로 수행되지 않습니다. 이유는 따로 설명하지 않겠습니다. 그래서 저는 안드로이드 환경에서 동작하는 lnline 후킹 도구를 재 설계해 개발하였습니다.)

위 방법을 통하면 그림과 같이 손쉽게 SSL 스트립이 가능해집니다. 

아래 사진은 2번에 제시한 방법으로 inline 후킹도구를 개발하여 페이스북 어플의 SSL 통신을 스트립한 결과로 Logcat으로 로깅을 수행하였습니다.


Posted by EXSO

댓글을 달아 주세요