2019년 2월 11일자로 KT망에서 SNI 기반의 차단이 시작되었습니다. 이에 이를 우회할 수 있는지를 테스트해 보았습니다. 테스트 결과 쉽게 bypass가 되는 것을 확인할 수 있습니다.

본 시연 동영상은 PoC 레벨입니다.


원리 설명

대부분의 네트워크 장비는 모든 패킷을 검사하지 않습니다. 5 tuple로 나누어 세션(TCP or UDP)의 시작에서부터 앞의 몇개 정도만을 보면서 필요한 기능들을 수행합니다.

SNI 정보는 ClientHello에 들어가 있고, ClientHello는 대략 500~600바이트, 즉 MTU 크기를 벗어나지 않기 때문에 TCP connection이 establish되고 난 후 제일 첫번째 패킷에 SNI 정보가 들어가 있는 것이 일반적입니다.

이에 차단 장비는 첫번째 패킷만을 가지고 SNI를 추출할 것이라 예상을 하였고, 이에 ClientHello를 하나가 아닌 두개 이상으로 쪼개서 보내면 어떨까 테스트를 해 보았습니다.


간략 요약

  • 차단 : SNI를 보기 위해 ClientHello의 첫번째 패킷만을 검사한다.
  • 우회 : ClientHello 데이터를 쪼개서 보낸다.
  • 대응 : TCP reassemble을 하여 분리된 패킷들을 재조합하여 검사한다.


시연 동영상


reference

차현수님 - SNI 차단 우회하기 (for 32bit 브라우져) : WSASend hooking 방식 이용.

LoG님 - KT SNI 차단 우회 방법 : MTU 값 설정 변경을 통하여 ClientHello가 나눠져서 전송되도록 하는 기법 소개. 모든 TCP data에 대해 해당 MTU가 적용되므로 성능(속도)상으로는 약간의 저하가 있을 것으로 판단됨.

GoodByeDPI GUI : 첫번째 TCP data를 분리해서 보내기를 구현한 오픈소스. Windows(WinDivert) 기반이며 win32, win64 환경에 따라 다른 프로그램을 다운받아 실행하면 됨.