특정 웹 사이트가 제공하는 SSL / TLS 암호화 제품군을 어떻게 나열합니까?


261

특정 웹 사이트에서 제공하는 SSL / TLS 암호화 제품군 목록을 어떻게 검색합니까?

openssl을 시도했지만 출력을 검사하면 :

$ echo -n | openssl s_client -connect www.google.com:443 
CONNECTED(00000003)
depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x
MTEyMTgyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA6PmGD5D6htffvXImttdEAoN4c9kCKO+IRTn7EOh8rqk41XXGOOsKFQebg+jN
gtXj9xVoRaELGYW84u+E593y17iYwqG7tcFR39SDAqc9BkJb4SLD3muFXxzW2k6L
05vuuWciKh0R73mkszeK9P4Y/bz5RiNQl/Os/CRGK1w7t0UCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQCfQ89bxFApsb/isJr/aiEdLRLDLE5a+RLizrmCUi3nHX4adpaQedEkUjh5
u2ONgJd8IyAPkU0Wueru9G2Jysa9zCRo1kNbzipYvzwY4OA8Ys+WAi0oR1A04Se6
z5nRUP8pJcA2NhUzUnC+MY+f6H/nEQyNv4SgQhqAibAxWEEHXw==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 316 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 748E2B5FEFF9EA065DA2F04A06FBF456502F3E64DF1B4FF054F54817C473270C
    Session-ID-ctx: 
    Master-Key: C4284AE7D76421F782A822B3780FA9677A726A25E1258160CA30D346D65C5F4049DA3D10A41F3FA4816DD9606197FAE5
    Key-Arg   : None
    Start Time: 1266259321
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

단지 암호 스위트가 AES256-SHA와 관련이 있음을 보여줍니다. 나는 대화의 16 진수 덤프를 통해 grep 할 수 있다는 것을 알고 있지만 조금 더 우아한 것을 원했습니다.

Linux 에서이 작업을 선호하지만 Windows (또는 다른)는 좋습니다. 이 질문은 PCI 및 일반 침투 테스트에 대한 보안 테스트에서 동기를 부여합니다.

최신 정보:

GregS는 아래에서 SSL 서버가 클라이언트의 암호화 제품군에서 선택한다는 것을 지적합니다. 따라서 모든 암호 제품군을 한 번에 하나씩 테스트해야 할 것 같습니다. 나는 함께 무언가를 해킹 할 수 있다고 생각하지만, 더 간단하고 미래 지향적 인 (예 : 새로운 암호) 방법이 있습니까?


아마도 gnutls-cli?
grawity

제목 변경 후이 질문은 실제로 소프트웨어 기록을 요구하지 않습니다. 재개 투표.

@ fixer1234 더 행복 해지면 "tool"이라는 단어를 제거했습니다. 핵심 과제는 어쨌든 특정 작업을 수행하는 방법을 묻는 것입니다. 이것은 사소한 문구이며 더 개방적인 "소프트웨어 목록"유형 질문과는 거리가 멀다.

@ 밥 : 나는 황홀하다. :-) 다시 열기 투표.
fixer1234

답변:


232

암호 모음을 테스트하기 위해 bash 스크립트를 작성했습니다. OpenSSL에서 지원되는 암호 제품군 목록을 가져 와서 각각을 사용하여 연결을 시도합니다. 핸드 셰이크가 성공하면을 인쇄합니다 YES. 핸드 셰이크에 실패하면을 인쇄 NO하고 OpenSSL 오류 텍스트가 표시됩니다.

#!/usr/bin/env bash

# OpenSSL requires the port number.
SERVER=$1
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
do
echo -n Testing $cipher...
result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
if [[ "$result" =~ ":error:" ]] ; then
  error=$(echo -n $result | cut -d':' -f6)
  echo NO \($error\)
else
  if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
    echo YES
  else
    echo UNKNOWN RESPONSE
    echo $result
  fi
fi
sleep $DELAY
done

다음은 지원되지 않는 3 개의 암호와 1 개의 지원되는 암호를 보여주는 샘플 출력입니다.

[@linux ~]$ ./test_ciphers 192.168.1.11:443
Obtaining cipher list from OpenSSL 0.9.8k 25 Mar 2009.
Testing ADH-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-DSS-AES256-SHA...NO (sslv3 alert handshake failure)
Testing AES256-SHA...YES

편집 : 호스트 및 포트가 스크립트에 매개 변수로 제공되므로 유연성 추가


7
openssl 1.0은 변경이 필요합니다. if [[ "$result" =~ "Cipher :" ]] ; then대신 if [[ "$result" =~ "Cipher is " ]] ; thenSSL2를 테스트하고 재협상을 확보하십시오.echo -n Testing ssl2... result=$(echo -n | openssl s_client -ssl2 -connect $SERVER 2>&1) if [[ "$result" =~ "Cipher :" ]] ; then echo supported. INSECURE! else echo no support, OK fi echo -n Testing SSL secure renegotiation... echo -n "" | openssl s_client -connect $SERVER 2>&1 | grep 'Secure Renegotiation'
Hubert Kario

9
sslscan과 openssl을 사용하는 매우 정교한 쉘 스크립트가 있습니다. TLSSLed
Robert

2
I은 OpenSSL을 호출해야합니다 다른 스크립트 아래에 나열했습니다 CipherScan
interfaSys - 올리비에을

1
이 스크립트 는 서버가 OpenSSL이 지원하지 않는 암호 제품군을 지원하는지 알려주지 않을 수 있습니다.
sampablokuper

2
TLSSLed에 대한 @Robert 의 제안 은 환상적이었습니다. 1.3으로 업데이트되었으며 더 많은 기능이 있습니다. 보안 테스트에 사용해 왔으며 감동을 받았습니다.
John Yeary

162

Nmap을 가진 SSL-열거-암호

네트워크 서비스에서 사용 가능한 암호 목록을 얻는 더 좋은 방법은 없습니다. 또한 nmap 은 사용 가능한 각 암호에 대해 강력하거나 약하거나 알 수없는 강도 등급을 제공합니다.

먼저 ssl-enum-ciphers.nse nmap 스크립트를 다운로드하십시오 ( 여기 설명 ). 그런 다음 스크립트와 동일한 디렉토리에서 다음과 같이 nmap을 실행하십시오.

HTTP 서버가 지원하는 암호 목록

$ nmap --script ssl-enum-ciphers -p 443 www.example.com

IMAP 서버가 지원하는 암호 목록

$ nmap --script ssl-enum-ciphers -p 993 mail.example.com

다음은 Dovecot IMAP 서버의 출력 스 니펫입니다.

993/tcp open  imaps
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|_  least strength: weak

Nmap done: 1 IP address (1 host up) scanned in 1.03 seconds

2
STARTTLS와 함께 IMAP에서이 스크립트를 사용하는 방법이 있습니까? SMTP의 STARTTLS는 작동하는 것 같지만 IMAP에서는 스크립트가 실행되지 않는 것 같습니다.
Giel

몇 가지 : 다운로드 한 것이 아니라 nmap 배포판에서 스크립트를 실행하고있을 수 있습니다. 이름을 바꾸어 확인하십시오. 그런 다음 일부 버전에서는 일반적으로 사용되는 포트 번호를 확인하는 "portrule"을 확인하십시오. 다음으로 교체portrule = function() \n return true \n end
slim

... IMAP STARTTLS, FTPS AUTH TLS등 을 사용하려면 해킹이 필요 하지만 가능합니다.
날씬한

1
한 가지주의 할 점은 배포판 / 패키지에 포함될 수있는 이전 스크립트는 서버 (또는 클라이언트) 우선 순서가 아니라 알파벳 순서로 암호를 나열한다는 것입니다 . 위의 코멘트를 참조하십시오 @slim
Clint Pachl

3
이 답변이 작성된 후 2 년 동안 Nmap은 FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC 및 MS SQL을 통한 STARTTLS에 대한 지원은 물론 단순히 지원되는 암호를 나열하는 것 외에도 여러 가지 개선 사항을 추가했습니다. .
bonsaiviking

104

특정 웹 사이트가 제공하는 SSL / TLS 암호화 제품군을 테스트 할 수있는 도구가 있습니까?

예, SSL Labs 웹 사이트 의 온라인 도구 를 사용하여 공개 SSL 서버 데이터베이스를 쿼리 할 수 있습니다 .

다음은 제공하는 정보 스 니펫입니다.

대체 텍스트

(google.com 결과의 스크린 샷)


이것이 바로 내가 찾던 것입니다! 고마워요!
Jeremy Powell

11
불행히도 표준 포트에서 HTTPS 만 지원합니다. TLS로 POP3S, IMAPS 또는 IMAP를 확인하는 데 사용할 수 없습니다
Hubert Kario

1
또한 HTTPS 만 지원하지만 SNI에 대한 지원도 부족합니다.
Gurken Papst 2016 년

12
공용 사이트에는 적합하지만 인터넷과 격리 된 네트워크의 사이트에는 사용할 수 없습니다.
Iszi

53

sslscan 은 멋진 작은 유틸리티입니다.

TLS 및 SSL 로의 연결을 테스트하고 (구체적인 SSL 버전도 검사 할 수 있도록 빌드 스크립트가 자체 OpenSSL 사본과 링크 될 수 있음) 서버의 암호화 제품군 및 인증서에 대해보고합니다.

다음에 대한 출력 예 google.com(가독성을 위해 줄임) :

$ sslscan google.com
Testing SSL server google.com on port 443

 TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  AES128-GCM-SHA256
Accepted  TLSv1.2  128 bits  AES128-SHA
<snip>
Preferred TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  AES128-SHA
<snip>
Preferred TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  AES128-SHA
<snip>
Preferred SSLv3    128 bits  RC4-SHA
Accepted  SSLv3    128 bits  RC4-MD5
<snip>

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  *.google.com
Altnames: DNS:*.google.com, DNS:*.android.com, <snip>
Issuer:   Google Internet Authority G2

Not valid before: Apr  7 08:24:31 2016 GMT
Not valid after:  Jun 30 08:20:00 2016 GMT

1
yum install sslscanCentOS 6에서 작동합니다.
코더

1
sudo dnf install sslscanFedora 22에서도 마찬가지입니다.
Zayne S Halsall

2
brew install sslscanOSX에서
Xiao

sudo apt-get install sslscan우분투 (12.04 – 따라서 모든 이후 버전은 괜찮을 것입니다).
balu

3
업데이트 : 데비안 및 우분투 저장소 (현재 2009 년 1.8.2)에있는 공식 sslscan 버전은 TLS v1.1 및 1.2를 지원 하지 않습니다. bugs.launchpad.net/ubuntu/+source/sslscan을 참조하십시오 . / + 버그 / 1372741 . 따라서 OP가 연결된 GitHub의 버전을 사용해야합니다.
balu

15

이것은 SSL 스캐닝 도구에 대한 훌륭한 참조 스레드이므로 1 년 전에 작성된 CipherScan을 나열하고 키 교환 암호의 문제점을 식별 할 수도 있습니다. https://github.com/jvehent/cipherscan

SNI와 FreeBSD를 지원하는 포크를 원한다면 URL은 https://github.com/oparoz/cipherscan입니다.

openssl s_client다가오는 기능이나 새로운 암호 (예 : chacha20 + poly1305)를 테스트 할 수 있도록 자체 OpenSSL 바이너리를 사용하여 호출 하고 지원 하는 스크립트입니다 .

또한 원하는 포트에 연결하고 starttlss를 사용할 수 있습니다.

전형적인 출력은 다음과 같습니다

# ./cipherscan -o ./openssl api.mycompany.com:443
...................
prio  ciphersuite                  protocols              pfs_keysize
1     DHE-RSA-AES256-GCM-SHA384    TLSv1.2                DH,4096bits
2     DHE-RSA-AES256-SHA256        TLSv1.2                DH,4096bits
3     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2                ECDH,P-384,384bits
4     ECDHE-RSA-AES256-SHA384      TLSv1.2                ECDH,P-384,384bits
5     DHE-RSA-AES128-GCM-SHA256    TLSv1.2                DH,4096bits
6     DHE-RSA-AES128-SHA256        TLSv1.2                DH,4096bits
7     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2                ECDH,P-384,384bits
8     ECDHE-RSA-AES128-SHA256      TLSv1.2                ECDH,P-384,384bits
9     DHE-RSA-CAMELLIA256-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
10    DHE-RSA-AES256-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
11    ECDHE-RSA-AES256-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
12    DHE-RSA-CAMELLIA128-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
13    DHE-RSA-AES128-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
14    ECDHE-RSA-AES128-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
15    CAMELLIA256-SHA              TLSv1,TLSv1.1,TLSv1.2
16    AES256-SHA                   TLSv1,TLSv1.1,TLSv1.2
17    CAMELLIA128-SHA              TLSv1,TLSv1.1,TLSv1.2
18    AES128-SHA                   TLSv1,TLSv1.1,TLSv1.2

Certificate: trusted, 4096 bit, sha256WithRSAEncryption signature
TLS ticket lifetime hint: 300
OCSP stapling: supported

다음은 옵션 목록입니다

-a | --allciphers   Test all known ciphers individually at the end.
-b | --benchmark    Activate benchmark mode.
-d | --delay        Pause for n seconds between connections
-D | --debug        Output ALL the information.
-h | --help         Shows this help text.
-j | --json         Output results in JSON format.
-o | --openssl      path/to/your/openssl binary you want to use.
-v | --verbose      Increase verbosity.

json 출력은 다른 스크립트에서 이것을 호출하는 경우 유용합니다.


"big-SSLv3 구성이 지원되지 않고 연결에 실패했습니다"
코더


8

약간의 인터넷 검색 후 SSL-TLS 테스트 (OWASP-CM-001)를 발견했습니다 .

nmap이 스캐너는 "-sV"스캔 옵션을 통해, SSL 서비스를 식별 할 수 있습니다. 취약점 검색기에는 서비스 검색 외에도 취약한 암호에 대한 검사가 포함될 수 있습니다 (예 : Nessus 스캐너 는 임의 포트에서 SSL 서비스를 검사하는 기능이 있으며 취약한 암호를보고 함).

또한 : 파운드 스톤 SSL 파는 지원되는 암호를 테스트하여 SSL 서버의 강도를 평가하기위한 도구입니다. 이러한 암호 중 일부는 안전하지 않은 것으로 알려져 있습니다.



2

SSLScan은 훌륭합니다. 새로운 도구 SSLDiagnos 는 Windows에서 작동하거나 openssl s_client를 사용하여 스크립트를 작성할 수 있습니다.



2

멋진 grepable 출력을 원할 경우 (및 모든 SSL / TLS 버전 확인 지원)

사용법 : ./script.sh www.url.com

#!/usr/bin/env bash
ciphers2=$(openssl ciphers -ssl2 'ALL:eNULL' | sed -e 's/:/ /g')
ciphers3=$(openssl ciphers -ssl3 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst1=$(openssl ciphers -tls1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst11=$(openssl ciphers -tls1.1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst12=$(openssl ciphers -tls1.2 'ALL:eNULL' | sed -e 's/:/ /g')

SSL2="SSL2("
for cipher in ${ciphers2[@]}
do
result=$(echo -n | openssl s_client -ssl2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL2="${SSL2}${cipher}:"
fi
done
SSL2=$(echo "${SSL2})" | sed -e 's/:)/)/g')

SSL3="SSL3("
for cipher in ${ciphers3[@]}
do
result=$(echo -n | openssl s_client -ssl3 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL3="${SSL3}${cipher}:"
fi
done
SSL3=$(echo "${SSL3})" | sed -e 's/:)/)/g')
TLS1="TLS1("
for cipher in ${cipherst1[@]}
do
result=$(echo -n | openssl s_client -tls1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS1="${TLS1}${cipher}:"
fi
done
TLS1=$(echo "${TLS1})" | sed -e 's/:)/)/g')

TLS11="TLS1.1("
for cipher in ${cipherst11[@]}
do
result=$(echo -n | openssl s_client -tls1_1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS11="${TLS11}${cipher}:"
fi
done
TLS11=$(echo "${TLS11})" | sed -e 's/:)/)/g')

TLS12="TLS1.2("
for cipher in ${cipherst12[@]}
do
result=$(echo -n | openssl s_client -tls1_2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS12="${TLS12}${cipher}:"
fi
done
TLS12=$(echo "${TLS12})" | sed -e 's/:)/)/g')

echo "$1,$SSL2,$SSL3,$TLS1,$TLS11,$TLS12";

당신은 수행 openssl ciphers -tls1.1하고 openssl ciphers -tls1.2있지만 그 매개 변수는 존재하지 않는 것 같습니다 ... -tls1적어도 (내가 시도한 플랫폼 에만 ) 있습니다.
Marki

(이 형태의 추가 옵션이 될 것으로 보인다 tls1_1tls1_2하지만 만에 표시되는 마스터 버전 의 OpenSSL과 심지어 1.0.2에서 ....)
Marki 사용자

이 스크립트 는 서버가 OpenSSL이 지원하지 않는 암호 제품군을 지원하는지 알려주지 않을 수 있습니다.
sampablokuper

2

pentesterscripting.com 에는 SSLScan과 OpenSSL을 모두 사용하여 다음을 확인 하는 멋진 스크립트 가 있습니다.

  • SSL v2;
  • 주 암호 정장;
  • MD5; 과
  • TLS 재협상 취약점

http://www.pentesterscripting.com/discovery/ssl_tests(Internet Archive Wayback Machine을 통해 )

메인 사이트가 이제 죽었으므로 미래 보장을 위해 여기에 복제되었습니다.

#!/usr/bin/env bash

# Description:
#       Script to extract the most security relevant details from a 
#       target SSL/TLS implementation by using sslscan.
# Author:  Raul Siles (raul _AT_ taddong _DOT_ com)
#          Taddong (www.taddong.com)
# Date:    2011-05-27
# Version: 1.0
#
# - Current SSL/TLS tests: 
#   SSLv2, NULL cipher, weak ciphers -key length-, strong 
#   ciphers -AES-, MD5 signed cert, SSL/TLS renegotiation
#
# Requires: 
# - sslscan
# https://sourceforge.net/projects/sslscan/
#
# Credits: Based on ssl_test.sh by Aung Khant, http://yehg.net.
# 

#
# /**************************************************************************
# *   Copyright 2011 by Taddong (Raul Siles)                                *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 3 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU General Public License for more details.                          *
# *                                                                         *
# *   You should have received a copy of the GNU General Public License     *
# *   along with this program. If not, see <http://www.gnu.org/licenses/>.  *
# *                                                                         *
# **************************************************************************/
#

VERSION=1.0

OPENSSLVERSION=$(openssl version)
SSLSCANVERSION=$(sslscan --version | grep version | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")

echo ------------------------------------------------------
echo " TLSSLed - ($VERSION) based on sslscan and openssl"
echo " by Raul Siles (www.taddong.com)"
echo " ( inspired by ssl_test.sh by Aung Khant )"
echo ------------------------------------------------------
echo + openssl version: $OPENSSLVERSION
echo + $SSLSCANVERSION
echo ------------------------------------------------------
echo

if [ $# -ne 2 ]; then 
   echo Usage: $0 IP PORT
   exit
fi

HOST=$1
PORT=$2

echo  [*] Analyzing SSL/TLS on $HOST:$PORT ...
echo 

# Run sslcan once, store the results to a log file and
# analyze that file for all the different tests:
DATE=$(date +%F_%R:%S)
TARGET=$HOST:$PORT
LOGFILE=sslscan\_$TARGET\_$DATE.log
ERRFILE=sslscan\_$TARGET\_$DATE.err

echo [*] Running sslscan on $HOST:$PORT...
sslscan $HOST:$PORT > $LOGFILE 2> $ERRFILE

echo
echo [*] Testing for SSLv2 ...
cat $LOGFILE | grep "Accepted  SSLv2"
echo
echo [*] Testing for NULL cipher ...
cat $LOGFILE | grep "NULL" | grep Accepted
echo
echo [*] Testing for weak ciphers \(based on key length\) ...
cat $LOGFILE | grep " 40 bits" | grep Accepted
echo 
cat $LOGFILE | grep " 56 bits" | grep Accepted
echo
echo [*] Testing for strong ciphers \(AES\) ...
cat $LOGFILE | grep "AES" | grep Accepted

echo 
echo [*] Testing for MD5 signed certificate ...
#cat $LOGFILE | grep -E 'MD5WithRSAEncryption|md5WithRSAEncryption'
cat $LOGFILE | grep -i 'MD5WithRSAEncryption'

echo 
echo [*] Checking preferred server ciphers ...
cat $LOGFILE | sed '/Prefered Server Cipher(s):/,/^$/!d' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

echo
echo [*] Testing for SSLv3/TLSv1 renegotiation vuln. \(CVE-2009-3555\) ...
#echo [*] echo R \| openssl s_client -connect $HOST:$PORT \| grep "DONE"
#
# Renegotiation details go to stderr (2>)
#
# if $OPENSSLVERSION is updated (version?) it supports RFC5746 and will print:
# Secure Renegotiation IS NOT supported
# Secure Renegotiation IS supported
#

echo R | openssl s_client -connect $HOST:$PORT | grep -E "Secure Renegotiation IS|DONE"

echo
echo [*] New files created:
ls -l $LOGFILE
if [ ! -s $ERRFILE ]; then
        # Error file is empty
        rm $ERRFILE
else
        ls -l $ERRFILE
fi

echo
echo 
echo [*] done
echo

사용법 : ./ssltest.sh 호스트 포트


2

@indiv의 답변 과 자체 답변으로 게시 할 것을 제안하여 @indiv 스크립트의 조정 버전을 제공하고 있습니다. 호스트를 첫 번째 인수로 제공 할 수 있으며 원래 스크립트와 동일한 결과를 출력하지만 좀 더 형식이 지정됩니다.

#!/usr/bin/env bash
# adapted from https://superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-particular-website-offers

# OpenSSL requires the port number.
# SERVER=192.168.1.1:443
SERVER=$1
if [[ -z "$SERVER" ]]; then echo "ERROR: no server specified"; exit 1; fi;

## Set up colors, if possible
if [[ $(tput colors) ]];then
  COLOR_BOLD="$(tput bold)"     # "\e[1;32m"
  COLOR_GREEN="$(tput setaf 2)" # "\e[1;32m"
  COLOR_RESET="$(tput sgr0)"    # "\e[0m"
fi


SERVER=$1:443
echo Server is ${COLOR_BOLD}"$SERVER"${COLOR_RESET}

DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
  do
  printf "%-42s" "Testing $cipher... "
  result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
  if [[ "$result" =~ ":error:" ]] ; then
    error=$(echo -n $result | cut -d':' -f6)
    echo NO \($error\)
  else
    if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
      echo ${COLOR_BOLD}${COLOR_GREEN}YES${COLOR_RESET}
    else
      echo UNKNOWN RESPONSE
      echo $result
    fi
  fi
  sleep $DELAY
done

2

Kez의 답변에 명시된 SSL Labs 온라인 도구를 개발 한 Ivan Ristić 의 (무료) OpenSSL Cookbook다음 과 같이 말합니다.

특정 서버에서 지원하는 모든 제품군을 확인하려면 시작 openssl ciphers ALL하여 사용중인 OpenSSL 버전에서 지원하는 모든 제품군 목록을 얻습니다. 그런 다음 하나씩 서버에 제출하여 개별적으로 테스트하십시오. 이 작업을 수동으로 수행 할 것을 제안하지는 않습니다. 이것은 약간의 자동화가 먼 길을가는 상황입니다. 실제로 이것은 좋은 도구찾는 것이 적절할 수 있는 상황입니다 .

그러나이 방법으로 테스트하면 단점이 있습니다. OpenSSL이 지원하는 제품군 만 테스트 할 수 있습니다. ...

단일 SSL / TLS 라이브러리는 모든 암호화 제품군을 지원 하지 않으므로 포괄적 인 테스트가 어렵습니다. SSL Labs의 경우 임의의 제품군을 지원하는 척하는 맞춤형 클라이언트와 함께 이러한 목적으로 부분 핸드 셰이크를 사용했습니다 . 실제로 단일 제품군조차도 협상 할 수 없지만 협상을 제안하는 것만으로도 서버가 제품군을 지원하는지 여부를 알 수 있습니다. 이 방법으로 모든 제품군을 테스트 할 수있을뿐만 아니라 매우 효율적으로 수행 할 수도 있습니다.

(내 강조)

다른 답변에서 언급하지 않은 도구 중 하나 인 Stephen Bradshaw의 SSLTest 는 무엇보다도 "DSD ISM 및 PCI-DSS와 같은 준수 표준과 감지 된 암호 및 프로토콜을 비교하기위한 것입니다."

따라서이 답변이나 다른 답변에 언급 된 도구 중 하나를 시도하거나 직접 구성하고 Ristić의 부분 핸드 셰이크 접근 방식을 사용하십시오.


1

나는 정확하게 이것을하는 도구를 썼다. tlsenum이라고하며 GitHub 에서 사용할 수 있습니다 .

[ayrx@division tlsenum]$ ./tlsenum.py twitter.com 443
TLS Versions supported by server: 3.0, 1.0, 1.1, 1.2
Supported Cipher suites in order of priority:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

다음은에 대한 도구 출력 예 twitter.com입니다.

SSL Lab의 기능과 비슷하지만 자동화하고 구문 분석 할 수있는 명령 줄 도구를 사용하는 것이 훨씬 유용하다는 것을 알았습니다.


1

원래 https://github.com/iSECPartners/sslyze에있는 SSLyze 는 이제 https://github.com/nabla-c0d3/sslyze에 있습니다. 다른 답변 에서 언급 되었지만 자세한 내용은 없습니다.

SSLyze는 Python 기반이며 명령 줄에서 Linux / Mac / Windows에서 작동합니다. OpenSSL을 사용하며 Windows에서는 번들로 제공되는 OpenSSL 사본이 제공됩니다.

프로토콜, 암호 제품군 및 주요 세부 정보와 몇 가지 일반적인 취약점에 대한 테스트를 나열합니다. 더 많은 데이터를 얻거나 스캔 속도를 높이기 위해 특정 검사를 활성화 또는 비활성화 할 수 있습니다.


0

당신이 할 수있는 유일한 것은 한 번에 하나씩 모두 시도하고 어느 것이 허용되는지 확인하는 것입니다. 스크립팅 도구와에서 도구를 하나로 묶는 것은 어렵지 않지만이 작업을 수행하는 도구는 알지 못합니다 openssl s_client.

클라이언트는 어떤 암호를 수용 할 것인지를 광고하는 반면 서버는 단순히 암호를 선택하여 사용하거나 원하는 것을 찾지 못하면 연결을 끊습니다.


오 예. 어떤 이유로 나는 그것이 다른 방향이라고 생각하고있었습니다. 어쩌면 내가 미리 자갈길 도구 ... :) 찾을 수 있습니다
제레미 파월

0

모든 대답은 괜찮습니다. 대답의 한 부분은 왜 우리가 서버 목록을 발견하고 TLS에서 서버에 연결할 때 TLS 클라이언트와 마찬가지로 지원되는 모든 암호 제품군을 제공하는지 TLS에서 직접 묻지 않는 도구가 필요한 이유를 설명 할 수 있습니다.

대답은 서버가 목록을 보내지 않는다는 것입니다. 클라이언트 암호 목록에서 사용하려는 암호를 선택하면 SSL / TLS 프로토콜이 작성되는 방식입니다 .http : //wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

그렇기 때문에 클라이언트는 서버가 지원하는 암호를 찾아서 각 암호 제품군에 대해 적어도 하나의 새로운 시작 핸드 셰이크 (ClientHello)를 수행하기 위해 암호를 열거해야합니다.


0

AUTH TLSFTP에서 수행하는 작업을 찾는 동안 이 도구를 발견했습니다. ssl-cipher-suite-enum

기본적으로 hackajar의 쉘 스크립트가 수행하는 작업을보다 정교하게 수행하는 펄 스크립트입니다.

또한 제공된 암호 및 프로토콜에 대한 기본 평가도 제공합니다. 가정용으로 만 사용되는 SSL Labs 도구와 다소 비슷합니다. :)

기본적 AUTH SSL으로 FTP 에서만 지원 되지만 간단한 검색 및 바꾸기로 문제를 해결할 수 있습니다. 보너스로 SMTP와 STARTTLSRDP 를 지원한다고 주장합니다 .


0

TestSSLServer 는 순수한 Java 기반 솔루션입니다. 장점 :

  • 일반 소켓에서만 매우 저수준으로 작동하므로 JDK 또는 OpenSSL 의 사용 가능한 암호 독립적 입니다 .

  • 핑을위한 ICMP와 같은 추가 포트를 열 필요가 없습니다.

  • 현재 클라이언트 인증서로 작업 중입니다.

단점 :

  • 2016 년 현재, 암호 목록이 오래되었을 수 있습니다 (그러나 이것을 판단 할 전문가는 없지만)

내 개인적인 경험 : 단 하나의 HTTPS 포트가 열려 있고 (다른 포트는 필요하지 않음) 클라이언트 인증서가 필요하고 iptables가 활성화되어있는 단단히 묶인 서버가 주어 졌을 때 여전히 사용 가능한 암호를 나열 할 수 있었지만 최고 투표 솔루션은 없었습니다 ( 작은 쉘 스크립트 시도, SSL Labs, NMap, sslscan)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.