서버에 openssl 패키지가 없는 경우 서버에 SSLv3 연결이 있는지 확인하는 방법은 무엇입니까?

서버에 openssl 패키지가 없는 경우 서버에 SSLv3 연결이 있는지 확인하는 방법은 무엇입니까?
echo Q | openssl s_client -ssl3 -connect HOSTNAME:PORT 2>/dev/null | grep 'Cipher is'

하지만 컴퓨터에 openssl이 설치되어 있지 않은 경우 SSLv3 연결을 어떻게 테스트합니까?

업데이트: 컴퓨터가 인터넷에 연결되어 있지 않습니다.

답변1

nmap시스템에서 사용 가능한 경우 . 포트 443에 대해 SSLv3을 확인한다고 가정하면 nmap다음 옵션을 사용할 수 있습니다.

nmap --script ssl-enum-ciphers  -p 443 <hostname/IP>  | grep SSLv3

아무것도 반환 되지 않으면 grepSSLv3 프로토콜이 비활성화되었음을 의미하고, 무언가가 반환되면(지원되는 프로토콜과 사용된 암호가 반환됨) 대상 호스트에서 SSLv3가 여전히 활성화되어 있음을 의미합니다.

확인하다이것ssl-enum-ciphers의 기능을 확인하세요.

SSLv3 I인 경우

답변2

나는 추천하고 싶다 wget또는curl, 다음 중 하나 또는 둘 모두가 이미 있을 수 있습니다.

wget --secure-protocol=SSLv3 https://zmap.io/
curl --sslv3 https://zmap.io/

또는 그렇지 않으면socat:

socat stdio openssl-connect:zmap.io:443,method=sslv3

socatSSL을 지원하려면 OpenSSL의 libssl 및 libcrypto가 필요하며 wgetOpenSSL curl또는 GnuTLS가 필요합니다. zmap.io는 SSLv3를 비활성화하는 보안 관련 웹사이트입니다.

그렇지 않으면, 위기에 처해 이를 수행할 수 있습니다 bash(그리고 불신을 중지할 수 있습니다). 최소 SSlv3 "client hello"를 가져와서 바이너리 형식으로 파일에 씁니다.

( echo 16 03 00 00 49
  echo 01 00 00 45 03 00 54 46 2c 8b a0 70 ac c5 9f 96
  echo 60 b9 d0 97 af a5 95 c4 41 3b fa 49 dc cd eb 63
  echo df df cf 66 95 29 00 00 1e 00 39 00 38 00 35 00
  echo 16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
  echo 15 00 12 00 09 00 ff 01 00 ) | xxd -r -p > ssl3.bin

그렇다면 간단합니다(!).

$ exec 4<> /dev/tcp/zmap.io/443
$ cat ssl3.bin >&4
$ hexdump -C <&4
00000000  15 03 00 00 02 02 28                              |......(|

여기서 중요한 바이트는 선행하는 0x15(SSL 경고 로깅) 및 0x28, 핸드셰이크 실패입니다. 연결이 유효하면 첫 번째 바이트 0x16(SSL 핸드셰이크 기록)과 인증서 등이 포함된 큰 청크를 가져와야 합니다. 여기서는 호스트 이름이나 IP 주소를 사용할 수 있습니다 /dev/tcp/hostname/port/.

다음 방법을 사용하여 OpenSSL을 사용하는 다른 컴퓨터에서 자신만의 핸드셰이크를 만들 수 있습니다 s_client.

echo Q | openssl s_client -ssl3 -msg -debug -cipher 'DEFAULT:!EXPORT' \
   -connect www.google.com:443 >debug.log

주요 요구 사항은 connect호스트가 연결을 수락한다는 것입니다. 아니요신경망연구소여기서 캡처한 페이로드는 모든 서버를 테스트하는 데 사용할 수 있습니다(비록 엄격한 SNI가 적용되는 경우 서버가 연결을 거부할 수 있지만 SNI는 SSlv3에 대해 정의되지 않습니다).

$ head -15 debug.log
CONNECTED(00000003)
write to 0x80c6ed0 [0x80d0c88] (78 bytes => 78 (0x4E))
0000 - 16 03 00 00 49 01 00 00-45 03 00 54 46 2c 8b a0   ....I...E..TF,..
[...]
>>> SSL 3.0 Handshake [length 0049], ClientHello
    01 00 00 45 03 00 54 46 2c 8b a0 70 ac c5 9f 96
    60 b9 d0 97 af a5 95 c4 41 3b fa 49 dc cd eb 63
    df df cf 66 95 29 00 00 1e 00 39 00 38 00 35 00
    16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
    15 00 12 00 09 00 ff 01 00
read from 0x80c6ed0 [0x80cc478] (5 bytes => 5 (0x5))

-msg(대신 사용하는 출력은 -debug더 깔끔하지만 SSL 레코드의 처음 5바이트를 생략하고 -debug중요한 후행 0바이트를 도움이 되지 않게 잘라내므로 둘 다 사용해야 합니다.)

0000으로 시작하는 줄에서 처음 5바이트의 16진수(다음 16진수 블록에서 생략된 SSL 레코드 헤더)를 가져온 다음 "SSL 3.0 Handshake" 줄 블록 뒤의 전체 16진수를 가져와 배치를 xxd이진 파일 로 변환합니다. 위에서 설명한대로 사용합니다.

여기서 유일한 변수는 nonce의 처음 4바이트(레코드의 옥텟 11-14)가 클라이언트 타임스탬프가 된다는 것입니다. 이는 충분히 편집증적인 서버에서 감지할 수 있지만 SSLv3에서는클라이언트 시계가 정확할 필요는 없습니다.(TLS 1.2 이하 버전에서도 마찬가지입니다.)

다음에 대해 더 자세히 읽을 수 있습니다.SSL 레코드 형식여기, 그리고 여기로그인 비밀번호.

관련 정보