본문 바로가기

JAVA

안드로이드 VPN Service를 이용해서 HTTPS(SSL) MITM 해보자

TL;DR : 매우 제한적이다. 앱에 따라 적용 가능 여부가 다르다.

 

로컬에서 작동하는 VPN Service를 통해 HTTPS Proxy로 포워딩하여 MITM!

 

 

 대충 그려보자면 위 그림과 같은데 VPN으로 하려는 이유. 첫째 프록시 적용을 일부 앱에서 하고 싶다, 둘째 하지만 해당 앱이 별도의 프록시 설정을 지원하지 않아...  셋째 기존 안드로이드에서 제공하는 방식의 프록시 설정은 매우 불편하고 시스템-와이드로 적용 되기 때문에 프록시가 불필요한 대상을 포워딩하여 오버헤드가 발생한다는 점이다.

 

만들어보자... 우선 Vpn Service를 만들어주고, 해당 서비스에 연결되는 TUN 인터페이스를 만들고 HTTP CONNECT로 프록시 서버에 넘겨주면 된다.

 

말은 쉽다.. 하지만 언제나 그렇듯, 이미 다른 유저가 삽질한 오픈소스가 있다. 빨리 가보자. ㄱㄱ

 

https://github.com/raise-isayan/TunProxy

 

raise-isayan/TunProxy

Android VPN interceptor to send HTTP and HTTPS traffic to a proxy - raise-isayan/TunProxy

github.com

 

잠깐 [MITM (SSL decrypt)] 문단도 주의 깊게 살펴보자. 엥? 근데 읽지않고 바로 코딩착수했다고? ㅋㅋㅋ

 

안드로이드 7 (누가) 이상부터는 보안 정책의 변경으로 인해 기본적으로 어플리케이션의 SSL 통신시, 안드로이드 키보관소의 USER 섹션은 읽지 않는다. 그러므로 아무리 self-signed CA 인증서를 설치를 해도, 해당 앱이 별도로 User 키스토어를 읽지 않는 이상은 아래와 같은 에러를 지겹게 볼 것이다.

CertPathValidatorException: Trust anchor for certification path not found.

 

그러니까, 루트 권한을 이용해서 시스템 키스토어에 self-signed 인증서를 때려박거나 해야한다.....

 

물론 위에 언급한 것 처럼 별도로 User 키 스토어를 로드하거나 관리하는 앱들은 가능하다는 말. 그런 앱이 어디있어 ㅅㅂ;; 싶었지만 대부분의 브라우저 (파이어폭스는 별도의 인증서 저장 공간이 있다.)는 신뢰 할 인증서를 불러오고 관리하기 때문에 가능하다.

 

결론 : 안드로이드에서 기본적으로 제공하는 프록시 기능을 사용하자.

 

 

 

-추가-

혹시 편법이 나올 수 있을까? 아래 깃헙이슈를 구독해놓자... 어렵겠지만 ㅎㅎ

 

https://github.com/mitmproxy/mitmproxy/issues/2054

 

mitmproxy does not see traffic from Android app · Issue #2054 · mitmproxy/mitmproxy

Steps to reproduce the problem: Install mitmproxy's CA certificate on Android. Use Chrome to verify that HTTPS interception is working. Open an app to inspect its HTTPS traffic. Expected result...

github.com