#keywords 프로그래밍,tls,ssl,pcap,analysis,algorithm,openssl #title TLS(SSL) 연결이 어떤 알고리즘으로 선택되어 암복호화가 진행된건지 확인하는 방법 [wiki:Home 대문] / [wiki:CategoryProgramming 프로그래밍], [wiki:CategoryHowTo 활용] / [wiki:HowTo_tls_ssl_pcap_analysis TLS(SSL) 연결이 어떤 알고리즘으로 선택되어 암복호화가 진행된건지 확인하는 방법] ---- == [wiki:HowTo_tls_ssl_pcap_analysis TLS(SSL) 연결이 어떤 알고리즘으로 선택되어 암복호화가 진행된건지 확인하는 방법] == * 작성자 조재혁([mailto:minzkn@minzkn.com]) * 고친과정 2018년 7월 23일 : 처음씀 [[TableOfContents]] === 개요 === 1. 사전준비 * Wireshark 를 적절한 PC에 설치합니다. (pcap 포함) 1. 장비에서 원하는 TCP 연결 포트에 대한 캡쳐를 tcpdump를 이용하여 캡쳐합니다. {{{#!plain # tcpdump 'tcp port <캡쳐할 TCP 포트번호>' -i <캡쳐할 인터페이스명> -w <캡쳐된 내용을 저장할 pcap 파일 저장경로> => 만약 캡쳐할 인터페이스명을 모르거나 여러개인 경우 any 로 지정할 수 있습니다. => '-i any' }}} {{{#!plain 예) https://:8443 에 대한 캡쳐 # tcpdump 'tcp port 8443' -i eth1 -w /tmp/mytrace.pcap }}} * 캡쳐(HTTPS/443) 예제 파일 : [^https://www.minzkn.com/public/sample/protocol/https/https.pcap] 1. tcpdump 캡쳐준비가 되면 실제 연결을 수행합니다. (정확히는 첫 연결부가 캡쳐되어야 합니다.) * 캡쳐된 파일은 wireshark 가 설치된 PC로 다운로드 받습니다. 1. Wireshark로 캡쳐된 pcap 파일을 Open 합니다. 1. (중요) Wireshark 의 "Analyze > Decode As"를 선택하고 "Current" 항목에 "HTTPS"인 경우 "HTTP" 검색 후 "SSL"검색하여 확인을 누릅니다. * 이제 캡쳐된 내용이 TLS 해석된 사항으로 보이게 됩니다. 마찬가지로 "SSH"인 경우 "SSH" 검색 후 "SSL"검색하여 확인 누르는 식으로 진행할 수 있습니다. * Decode As 를 잘 선택해야지만 올바른 해석뷰가 보입니다. 이는 Application layer 이기 때문에 Wireshark가 직접 판단할 수 없기 때문에 사용자가 지정해야 합니다. 1. 이제 "Info" 항목에 "Client Hello" 인 부분을 찾아서 세부 내용으로 "Cipher Suites"를 찾아보면 Client 에서 지원가능한 목록이 확인됩니다. 1. 그리고 "Info"항목에 "Server Hello"인 부분을 찾아서 "Cipher Suites"를 보면 최종 서버로부터 선택된 알고리즘이 확인 가능합니다. * 아래 그림에서 보면 우리 장비의 웹 서버측에서는 Server Hello 에서 AES128GCM-SHA256 이 선택되었다는 것을 알 수 있습니다. [[attachment:wireshark-http-ssl-cipher-suites.png]] {{{#!plain tshark -nr mytrace.pcap -Y "ssl.handshake.ciphersuites" -Vx > ssl.output.txt Secure Sockets Layer SSL Record Layer: Handshake Protocol: Client Hello Content Type: Handshake (22) Version: TLS 1.0 (0x0301) Length: 512 Handshake Protocol: Client Hello Handshake Type: Client Hello (1) Length: 508 Version: TLS 1.2 (0x0303) Random GMT Unix Time: Jun 28, 2097 09:17:21.000000000 W. Europe Daylight Time Random Bytes: 577f9fb99f0e042633046e9b969fd957b903edb4bbb77449... Session ID Length: 32 Session ID: 888489fa25a177efb30c21cc89b6e447ae680357a0b762b6... Cipher Suites Length: 32 Cipher Suites (16 suites) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a) Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014) }}} === 참고자료 === * [wiki:GenerateCertificate 인증서 만들기] * https://osqa-ask.wireshark.org/questions/62098/how-to-find-out-which-ssl-cipher-suite-is-being-used * Wireshark 로 볼 때 checksum 오류가 뜰 경우 해당 wireshark 실행환경의 TCP offload (TSO => 예: "ethtool -K eth0 tso off gso off") 를 끄고 해보세요. * checksum offload 기능이 활성화 된 장비에서 packet capture 를 하는 경우 checksum 오류가 표시될 수 있으며 문제가 있는 것이 아니고 capture 단계가 checksum offload 계산보다 먼저 수행되어 발생되는 것으로 이해하시면 됩니다. * [^https://www.roe.ch/SSLsplit] * [^https://testssl.sh/openssl-rfc.mapping.html OpenSSL Cipher Suite Name mapping]