SNI는 TCP connection 성립 이후 클라이언트에서 서버로 가는 TCP 패킷에 존재합니다. 자신의 컴퓨터에서 상대방(서버)에게 전달되는 패킷을 자신 스스로가 fragmentation하여 차단을 우회할 수 있습니다.

반면에 또 다른 차단 탐지 방법이 있습니다. 바로 인증서 정보입니다. Client Hello에 SNI 정보가 있다고 가정을 하면 Server Hello에는 인증서(Certificate) 정보가 포함이 되어 있습니다. 이 인증서에는 Common Name이라는 것이 있는데, 이 Common Name 정보를 이용하면 서버가 어떠한 호스트 이름으로 서비스를 하는지 판단이 가능합니다(Subject Alternative Name라는 별도의 이름이 있기도 하지만 여기에서는 논외로 함).

sex.com 인증서 정보 sex.com 인증서 정보

Server Hello 패킷 Server Hello(서버 > 클라이언트) 패킷 안의 인증서 정보에 호스트 정보가 보임.

차단 장비가 현재처럼 SNI(클라이언트 > 서버)만 보지 않고 인증서 정보(서버 > 클라이언트)까지 확인하는 로직이 추가된다고 가정하면 차단의 범위가 더 넓어질 것입니다. 예전 L7 스위치(방화벽)에서 통신 과정에 SNI가 존재하지 않는 경우(Internet Explorer 5이하의 버전에서는 SNI 정보가 없음) 특정 웹서버와의 SSL 통신을 차단하는데 이 기법을 자주 사용하곤 했습니다.

자, 이제 우회의 입장에서 얘기해 보겠습니다. 이걸 어떻게 하면 우회할 수 있을까요? 서버가 클라이언트에게 인증서 정보를 넘겨 줄 때 TCP Data를 fragmentation시켜 주면 우회할 수 있기는 합니다만, sex.com 사이트 운영자가 대한민국 사용자들을 위해 패킷을 분할해서 보내 줄 아량을 기대하는 건 무리이겠죠?

자, 그럼 이경우에는 어떻게 우회할 수 있을까요? 이건 차단 장비에서 지금 얘기하는 방식(인증서 확인)이 도입되는 시점이 왔을 때 구체적인 방법을 제시해 보도록 하겠습니다. ^^

힌트 : TCP Header 조작