ECDHE 복호화 - ECDHE boghohwa

회사에서 내가 만든 웹 서버와 IPS 사이의 통신 패킷을 분석해야 하는 상황이 있었다. 웹 서버가 Linux에서 동작하므로 Fiddler 대신 tcpdump로 패킷을 잡고 그걸 wireshark로 보는 방법을 택했다.

tcpdump로 잡은 패킷을 내 host PC로 옮긴 뒤 wireshark로 SSL key를 설정한 뒤 패킷을 보려했는데.. 뭘 잘못한거지? 복호화가 되질 않는다. key를 잘못 설정한건가? 삽질 ing..

암호화 되지않은 SSL Handshaking 패킷을 보던 중 Server가 선택한 암호화 알고리즘이 평소 보지 못한걸 깨달았다.

ECDHE?? 이게 무슨 알고리즘이지 검색 ㄱㄱ싱

ECDHE(Elliptic Curve Diffie-Hellman Exchange — 타원곡선 디피헬만 키교환)

ECDHE를 이해하기 위해 , ECC와 PFS 개념에 대해 알아보자.

ECC — Elliptic Curve cryptography

타원곡선(elliptic-curve)의 수학적 특성을 이용한 암호화 알고리즘이다. 동일한 보안성을 제공한다고 했을 때, ECC는 key길이가 더 짧은 특성이 있다.

PFS — Perfect Forward secrecy

SSL/TLS 통신에서 어떠한 경로로 비밀키가 누출 될 경우 모든 암호화 된 패킷이 누출될 수 있다. PFS란 비밀키가 누출되더라도, 과거 통신되었던 TLS 통신들이 보호된다. 암호화 과정에서 클라이언트와 서버만 알고있는 세션키가 사용되는데 이게 매우 짧은 주기로 지속적으로 변경되므로, 공격자가 특정 패킷의 비밀키를 알게 되더라도 그 전과 후의 패킷들은 지속적으로 보호된다는 특성이며 ECDHE는 PFS를 지원한다.

쉽게 정리하면, ECDHE 알고리즘이 사용되면 서버의 비밀키로 복호화 할 수 없다는 이야기

DHE and ECDHE provides Perfect Forward Secrecy(PFS), means session keys are not derived from private key. So the attacker can not decrypt the traffic even when he has the private key used in the session handshake.
In DHE(not DH) the session keys are calculated using the Random Numbers.
You can't decrypt the traffic using private key when DHE or ECDHE is used.

아니 그럼,,,,,, 나는 패킷을 복호화 해보고 싶은데 정녕 방법이 없는건가? 네 복호화는 할수 없어염.

SSH 핸드쉐이킹 과정에서 ECDHE를 빼는건 어때?

서버의 설정을 통해 ECDHE는 빼는건 어떨까? 구글 검색 결과 apache, nginx 같은 경우 SSL ciphers suites 설정 방법이 공유되어 있다. apache, nginx가 설치되어 있지 않은 환경이라면? 패킷 캡쳐하겠다고 apache랑 nginx를 설치할 순 없잖아.

분명 구글에서 검색해보면.. 방법이 있을것도 같은데 문제는 구체적으로 어떻게 하는지를 찾지 못하겠다. 하두 답답해 stackoverflow에 영어로 글을 올렸는데 하루째 묵묵부답.

나중에라도 그 방법을 찾아내 적용할 수 있다면 정말 기쁘겠다. 우선은 ECDHE 환경에선 HTTP 통신을 통해 패킷을 캡쳐하는 방법을 택하자.

회사에서 내가 만든 웹 서버와 IPS 사이의 통신 패킷을 분석해야 하는 상황이 있었다. 웹 서버가 Linux에서 동작하므로 Fiddler 대신 tcpdump로 패킷을 잡고 그걸 wireshark로 보는 방법을 택했다.

tcpdump로 잡은 패킷을 내 host PC로 옮긴 뒤 wireshark로 SSL key를 설정한 뒤 패킷을 보려했는데.. 뭘 잘못한거지? 복호화가 되질 않는다. key를 잘못 설정한건가? 삽질 ing..

암호화 되지않은 SSL Handshaking 패킷을 보던 중 Server가 선택한 암호화 알고리즘이 평소 보지 못한걸 깨달았다.

ECDHE 복호화 - ECDHE boghohwa
ECDHE 복호화 - ECDHE boghohwa

ECDHE?? 이게 무슨 알고리즘이지 검색 ㄱㄱ싱

ECDHE(Elliptic Curve Diffie-Hellman Exchange — 타원곡선 디피헬만 키교환)

ECDHE를 이해하기 위해 , ECC와 PFS 개념에 대해 알아보자.

ECC — Elliptic Curve cryptography

타원곡선(elliptic-curve)의 수학적 특성을 이용한 암호화 알고리즘이다. 동일한 보안성을 제공한다고 했을 때, ECC는 key길이가 더 짧은 특성이 있다.

PFS — Perfect Forward secrecy

SSL/TLS 통신에서 어떠한 경로로 비밀키가 누출 될 경우 모든 암호화 된 패킷이 누출될 수 있다. PFS란 비밀키가 누출되더라도, 과거 통신되었던 TLS 통신들이 보호된다. 암호화 과정에서 클라이언트와 서버만 알고있는 세션키가 사용되는데 이게 매우 짧은 주기로 지속적으로 변경되므로, 공격자가 특정 패킷의 비밀키를 알게 되더라도 그 전과 후의 패킷들은 지속적으로 보호된다는 특성이며 ECDHE는 PFS를 지원한다.

쉽게 정리하면, ECDHE 알고리즘이 사용되면 서버의 비밀키로 복호화 할 수 없다는 이야기

DHE and ECDHE provides Perfect Forward Secrecy(PFS), means session keys are not derived from private key. So the attacker can not decrypt the traffic even when he has the private key used in the session handshake.
In DHE(not DH) the session keys are calculated using the Random Numbers.
You can't decrypt the traffic using private key when DHE or ECDHE is used.

아니 그럼,,,,,, 나는 패킷을 복호화 해보고 싶은데 정녕 방법이 없는건가? 네 복호화는 할수 없어염.

SSH 핸드쉐이킹 과정에서 ECDHE를 빼는건 어때?

서버의 설정을 통해 ECDHE는 빼는건 어떨까? 구글 검색 결과 apache, nginx 같은 경우 SSL ciphers suites 설정 방법이 공유되어 있다. apache, nginx가 설치되어 있지 않은 환경이라면? 패킷 캡쳐하겠다고 apache랑 nginx를 설치할 순 없잖아.

분명 구글에서 검색해보면.. 방법이 있을것도 같은데 문제는 구체적으로 어떻게 하는지를 찾지 못하겠다. 하두 답답해 stackoverflow에 영어로 글을 올렸는데 하루째 묵묵부답.

나중에라도 그 방법을 찾아내 적용할 수 있다면 정말 기쁘겠다. 우선은 ECDHE 환경에선 HTTP 통신을 통해 패킷을 캡쳐하는 방법을 택하자.

참조: Walkthrough: Decrypt SSL/TLS traffic (HTTPS and HTTP/2) in Wireshark

  최근 웹서버가 탑재된 카메라, NVR 장비의 TTA 인증으로 인해, 서버에 대한 보안 작업이 증가하고 있다. 문제는 보안을 적용하는 방법이 아니라, 제대로 적용됐는지를 TTA에 확인할 수 있는 방법이 필요했다. 장비를 최초 부팅할때마다 인증서를 생성하는 것은 문제가 없으나, 인증서를 장비 외부로 반출하여 '정말로 해당 인증서를 사용하여 HTTPS 통신을 하고 있는지'를 보여주는 게 문제였다.

  여튼 테스트 중에 RSA키를 사용하여 TLSv1.2로 전송되는 패킷의 복호화를 시도했으나, 정상적으로 복호화가 진행되지 않았다. 서버에 대한 지식이 부족했던 나로써는 꽤나 골치아픈 일이었는데, 문제는 TTA쪽에서도 딱히 복호화하는 방법은 인지하지 못하고 있던 것이었다.

  한참동안 인터넷을 찾아본 결과, Walkthrough: Decrypt SSL/TLS traffic (HTTPS and HTTP/2) in Wireshark라는 글을 발견할 수 있었다. 문제의 요지를 요약하자면, RSA키가 있더라도 Diffie-Hellman 암호화(DHE, ECDHE)는 Wireshark상에서 복호화가 불가능하다는 얘기였다. 동적으로 생성된 키 한 쌍을 이용하여 만들어진 세션 키를 이용하는 방식이니, 그럴수밖에. 서버에서 DHE, ECDHE를 비활성화하는 방식도 있지만, 서버에서 굳이 강력한 보안을 비활성화하는 건 사실상 말이 안되는 얘기다. 그렇기에, 브라우저에서 Diffie-Hellman 암호화 방식을 비활성화 하는 방식을 이용한다.

IE) 

  1. '실행'에서 gpedit.msc를 실행하여, 로컬 컴퓨터 정책을 연다.
  2. 컴퓨터 구성 -> 관리 템플릿 -> 네트워크 -> SSL 구성 설정 -> SSL 암호 그룹 순서로 이동한다.
  3. 'SSL 암호 그룹'에 작성된 내용이, 기본으로 사용되고 있는 SSL 암호 그룹(SSL Cipher suite order)이다. 복사 후 텍스트 에디터로 열어준다.
  4. 'ECDHE'나 DHE가 포함된 항목을 모두 지워준다.
  5. 수정된 내용을 복사하여, 기본값을 대체해준다. (3번의 스크린샷에서 커서가 위치한 곳이, SSL 암호 그룹의 기본값이다. 필자처럼 도움말을 복사해놓고 어떻게 해야하는지 몰라서, 허둥대는 일은 없기를 바란다.)
  6. 수정이 끝났으면 '확인'을 누른 후, PC를 재부팅한다.
  7. Wireshark로 패킷을 캡쳐한 후, Client Hello를 찾는다. Secure Sockets Layer -> TLSv1.2 Record Layer: Handshake Protocol: Client Hello -> Handshake protocol: Client Hello -> Cipher Suites 항목에서 DHE, ECDHE가 포함되지 않았음을 확인할 수 있다.

참조에는 크롬과 파이어폭스에서 Diffie-Hellman 암호화를 비활성화하는 방법도 나와있으나, IE만 테스트해도 충분했으므로 별도 기재하지 않는다. 어렵지 않은 내용인데 작성된 내용이 많지는 않아서, 나중에 또 고생할까봐 블로그에 작성해놓기로 했다. 모쪼록 나처럼 쓸데없는 삽질로 고생하는 사람이 없기를 바란다. ㅠ ㅅㅜ)