brunch

매거진 Security

You can make anything
by writing

C.S.Lewis

by sokoban Aug 24. 2018

SNI 를 이용한 HTTPS 모니터링

SNI-Based HTTPS Moniroting

 요즘 인터넷을 사용하다 보니 심심치 않게 정부기관에서 인터넷 사이트를 차단 한 것을 볼수 있다. 이는 주로 DNS 서버를 활용하여 차단하는 방식을 사용하는 경우도 있고 실질적으로 기업등과 같은 곳에서는 접속 URL을 이용하여 차단 하는 경우도 흔히 사용되는 방식이다. 

  다만 HTTP의 경우에는 평문 통신이므로 URL을 분석하고 이러한 트래픽을 차단하는게 손쉽지만 HTTPS의 경우 암호화된 트래픽으로서 패킷 스니핑이 쉬운 편이 아니다. 그리고 최근에 나온 E2E 개념의 ECDH 방식의 경우에는 패킷 스니핑이 아직은 불가능하다고 보인다.


  그렇다면 어떻게 HTTPS에 접속하는 사이트를 모니터링 할수 있을것인가 ? 라는 질문을 던져 볼수 있을 것이다. 방법이 전혀 없을까 ? 


   우선은 방법을 찾기전에 HTTPS에서 사용되는 TLS (Transport Layer Security) Handshake 프로토콜에 대해서 간단하게 알아보는것이 우선일것 이다. TLS는 Client와 Server간의 통신을 이루기 위해서 먼저 ClientHello 메시지를 Server에 전송하고 Server는 이에 대한 답변으로 ServerHello라는 응답을 준다.그 이후 Server는 Server의 공개키와 인증서를 포함한 메시지를 보내고 다시 Server는 ServerHello 메시지에 대한 종료의 메시지인 ServerHelloDone을 보내 준다. 


  위의 표에서의 ServerHello 이후의 과정은 별도로 참고 자료를 통해서 파악할수 있다. 그리고 위의 Handshake가 종료 된 이후 데이터를 주고 받은 이후에 다시 TLS 통신을 하기 위한 Handshake 과정이 발생하였을때에는 아래와 같은 과정을 따르게 된다.


  전반적으로 간결해졌지만 ClientHello 과정에서 포함되는 SNI 값은 포함되어 있게 된다. SNI란 Server Name Indication으로서 TLS 프로토콜 상에서 접속하고자 하는 호스트이름을 포함하는 평문값이다. SNI 값을 통해서 HTTPS 통신상에 동일 IP주소와 TCP 포트를 사용하는 서버에서 다수의 인증서를 사용할 수 있게 해주고 이로 인해 모든 사이트가 같은 인증서를 사용하지 않아도 동일 서버에서 여러개의 HTTPS 사이트를 운영 할수 있게 해준다. 하지만 보안적으로는 평문으로 전송되므로 이를 통해서 사용자가 접속하는 사이트를 알수 있게 된다.


테스트


 실제로 WireShark를 통해서 패킷을 스니핑 해 보면 ClientHello 패킷의 Server Name Indication extension에서 Server Name으로 researchgate-d.openx.net와 같이 접속했던 주소를 발견 할수 있게 된다. 당연히 이는 암호화 되지 않은 평문이므로 단순한 패킷 스니핑 작업으로도 이를 볼수 있게 된다. 


 tcpdump를 이용하여 CLI 모드에서 캡쳐를 해서 볼수도 있고 그럴 경우 아래와 같이 노출되게 된다. 

#tcpdump -i any -s 1500 '(tcp[((tcp[12:1] & 0xf0) >> 2)+5:1] = 0x01) and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)' -XX


 혹은 캡쳐된 패킷상에서 SNI 리스트만을 추출해 내어 볼수도 있다.


#tshark -r ./tls.pcapng -T fields -e ssl.handshake.extensions_server_name

researchgate-d.openx.net

fastlane.rubiconproject.com

prebid.adnxs.com

ib.adnxs.com

ib.adnxs.com

fastlane.rubiconproject.com

fastlane.rubiconproject.com

fastlane.rubiconproject.com

fastlane.rubiconproject.com

fastlane.rubiconproject.com

aax.amazon-adsystem.com


  만약 개발에 조금 익숙한 사람이라면 위의 tcpdump에 사용되는 pcap 라이브러리를 통해서 네트워크 트래픽을 스니핑 하여 SNI 값만을 추출하도록 개발 할 수 있을것이다. 그러면 이를 통해서 HTTPS를 모니터링 할수 있고 만약 약의적인 사이트 중 HTTPS를 사용할 경우 기존에 탐지가 불가능한 부분을 충분히 보완 할수 있을거라고 보인다. 


Fake-SNI

작성중


참고 자료


https://hal.inria.fr/hal-01349710/file/SNI_HTTPS_Security_Monitoring.pdf


https://www.researchgate.net/figure/SNI-extension-of-the-TLS-handshake-protocol_fig6_321580115


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari