Questão Como faço para listar os conjuntos de criptografia SSL / TLS que um determinado site oferece?


Como posso recuperar uma lista dos conjuntos de criptografia SSL / TLS que um determinado site oferece?

Eu tentei openssl, mas se você examinar a saída:

$ 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)
---

apenas mostra que o conjunto de criptografia é algo com o AES256-SHA. Eu sei que eu poderia passar pelo buraco hex da conversa, mas eu estava esperando por algo um pouco mais elegante.

Eu preferiria fazer isso no Linux, mas o Windows (ou outro) estaria bem. Esta questão é motivada pelos testes de segurança que faço para PCI e testes gerais de penetração.

Atualizar: 

GregS aponta abaixo que o servidor SSL escolhe os conjuntos de criptografia do cliente. Então, parece que eu precisaria testar todos os conjuntos de criptografia, um de cada vez. Eu acho que posso hackear algo juntos, mas existe uma maneira mais simples, mais à prova do futuro (por exemplo, novas cifras) de fazer isso?


229


origem


Talvez gnutls-cli? - grawity
Após a mudança de título, esta questão não está realmente pedindo por um software rec. Votar para reabrir. - Bob
@ fixer1234 Se isso te faz mais feliz, eu removi qualquer ocorrência da palavra "ferramenta". A questão central é perguntar como realizar uma tarefa específica de qualquer maneira; é uma pequena reformulação e longe de perguntas do tipo "lista de software" mais abertas. - Bob
@Bob: Estou em êxtase. :-) Votando para reabrir. - fixer1234


Respostas:


Eu escrevi um script bash para testar os pacotes de criptografia. Ele obtém uma lista de conjuntos de criptografia com suporte do OpenSSL e tenta se conectar usando cada um deles. Se o handshake for bem sucedido, imprime YES. Se o handshake não for bem sucedido, imprime NO, seguido pelo texto de erro do 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

Aqui está uma saída de exemplo mostrando 3 cifras não suportadas e 1 cifra suportada:

[@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

EDIT: Adicione flexibilidade como host e porta são fornecidos como parâmetro para o script


199



O openssl 1.0 precisa de uma mudança: if [[ "$result" =~ "Cipher :" ]] ; then ao invés de if [[ "$result" =~ "Cipher is " ]] ; then Eu também testo para SSL2 e renegociação segura: 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
Existe outro script de shell muito sofisticado disponível que usa sslscan e openssl: TLSSLed - Robert
Eu listei abaixo outro script que requer apenas OpenSSL chamado CipherScan - Olivier - interfaSys
Note que este script provavelmente não vai informa se um servidor suporta pacotes de criptografia que o OpenSSL não suporta. - sampablokuper
A sugestão do @Robert para TLSSLed Foi fantástico. Ele foi atualizado para 1.3 e tem muito mais funcionalidade. Eu tenho usado para testes de segurança e devo dizer que estou impressionado. - John Yeary


Nmap com cifras ssl-enum

Não há maneira melhor ou mais rápida de obter uma lista de códigos disponíveis em um serviço de rede. Mais, nmap fornecerá uma classificação de força forte, fraca ou desconhecida para cada cifra disponível.

Primeiro, baixe o ssl-enum-ciphers.nse script nmap (explicação aqui). Então, no mesmo diretório do script, execute o nmap da seguinte maneira:

Listar cifras suportadas por um servidor HTTP

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

Listar cifras suportadas por um servidor IMAP

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

Aqui está um trecho de saída de um servidor 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

128



Existe alguma maneira de usar este script no IMAP com STARTTLS? STARTTLS no SMTP parece funcionar, mas no IMAP o script nem parece ser executado. - Giel
Algumas coisas: você pode estar executando o script em sua distro nmap, em vez daquele que você baixou. Cheque renomeando o seu. Em seguida, verifique o "portrule", que em algumas versões verifica os números de porta comumente usados. Substituir com portrule = function() \n return true \n end - slim
... e precisaria de algum hacking para trabalhar com IMAP STARTTLS, FTPS AUTH TLSetc, mas é possível. - slim
Uma ressalva é que os scripts mais antigos, que podem ser incluídos na sua distribuição / pacote, listam cifras em ordem alfabética, não ordem preferida do servidor (ou cliente). Veja o comentário acima de @slim - Clint Pachl
Nos 2 anos desde que esta resposta foi escrita, o Nmap adicionou suporte para STARTTLS sobre FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC e MS SQL, bem como muitas outras melhorias além da simples listagem de cifras suportadas. . - bonsaiviking


Existe uma ferramenta que pode testar o que   Conjuntos de cifras SSL / TLS um particular   website oferece?

Sim, você poderia usar a ferramenta online em Laboratórios SSL'site para consultar o banco de dados público do servidor SSL.

Aqui está um trecho de informação que ele fornece:

alt text

(captura de tela dos resultados do google.com)


94



legal, obrigado por descobrir isso. - James K Polk
Isto é exatamente o que eu estava procurando! Muito obrigado! - Jeremy Powell
Infelizmente suporta apenas HTTPS na porta padrão, não pode usá-lo para verificar POP3S, IMAPS ou IMAP com TLS - Hubert Kario
E enquanto ele suporta apenas HTTPS, ele ainda não tem suporte para SNI. - Gurken Papst
E, embora seja ótimo para sites públicos, você não pode usá-lo para sites em redes isoladas da Internet. - Iszi


sslscan é um bom pequeno utilitário.

Ele testa a conexão com o TLS e o SSL (e o script de construção pode vincular com sua própria cópia do OpenSSL para que versões SSL obsoletas também sejam verificadas) e relata sobre os conjuntos de criptografia e certificado do servidor.

Exemplo de saída para google.com (aparado para legibilidade):

$ 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

47



yum install sslscan funciona no CentOS 6. - a coder
sudo dnf install sslscan no Fedora 22 também. - Zayne S Halsall
brew install sslscan no OSX - Xiao
sudo apt-get install sslscan no Ubuntu (12.04 - então todas as versões posteriores devem estar bem). - balu
Atualização: Deve-se notar que a versão oficial do sslscan foi encontrada nos repositórios Debian e Ubuntu (atualmente 1.8.2 de 2009) não suporte TLS v1.1 e 1.2, consulte bugs.launchpad.net/ubuntu/+source/sslscan/+bug/1372741. Portanto, deve-se usar a versão no GitHub à qual o OP está vinculado. - balu


Como esse é um excelente thread de referência para ferramentas de varredura SSL, listarei o CipherScan, que foi criado há um ano e também pode identificar problemas com chaves de troca de chaves. https://github.com/jvehent/cipherscan

Se você quer meu fork que suporta SNI e FreeBSD, o URL é https://github.com/oparoz/cipherscan

É um script que chama openssl s_cliente suporta o uso de seu próprio binário OpenSSL para que você possa testar recursos futuros ou novas cifras (chacha20 + poly1305 por exemplo).

Ele também permite que você se conecte a qualquer porta desejada e use starttlss.

Aqui está uma saída típica

# ./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

E aqui está uma lista de opções

-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.

A saída do json é útil se você estiver chamando isso de outros scripts.


14



"configuração big-SSLv3 não suportada, falha na conexão" - a coder


https://github.com/iSECPartners/sslyze

Este é baseado em Python, funciona em Linux / Mac / Windows a partir da linha de comando.


12





Depois de um pouco de googling eu encontrei este Teste para SSL-TLS (OWASP-CM-001):

o nmap O scanner, através da opção de verificação “–sV”, é capaz de identificar serviços SSL. Os scanners de vulnerabilidade, além de executar a descoberta de serviços, podem incluir verificações contra cifras fracas (por exemplo, Scanner Nessus tem a capacidade de verificar serviços SSL em portas arbitrárias e informará cifras fracas).

e também: Localizador do Foundstone SSL é uma ferramenta para avaliar a força dos servidores SSL testando as cifras suportadas. Algumas dessas cifras são conhecidas por serem inseguras.


8





Eu estou usando para a maioria dos testes SSL testssl.sh (ver https://testssl.sh / devel version @ https://github.com/drwetter/testssl.sh. Ele testa vulnerabilidades, cifras, protocolos, etc.


4





SSLScan é ótimo; uma nova ferramenta SSLDiagnos funciona para o Windows, ou você pode simplesmente escrever um script usando o s_client openssl.


2