Como recuperar uma lista dos conjuntos de cifras SSL / TLS que um site específico oferece?
Eu tentei o 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 cifras é semelhante ao AES256-SHA. Eu sei que poderia passar pela confusão hexadecimal da conversa, mas esperava algo um pouco mais elegante.
Eu preferiria fazer isso no Linux, mas o Windows (ou outro) ficaria bem. Essa pergunta é motivada pelos testes de segurança que faço para PCI e testes de penetração geral.
Atualizar:
O GregS aponta abaixo que o servidor SSL escolhe os conjuntos de criptografia do cliente. Parece que eu precisaria testar todos os conjuntos de cifras, um de cada vez. Eu acho que posso hackear algo juntos, mas existe uma maneira mais simples e à prova de futuro (por exemplo, novas cifras) para fazer isso?
gnutls-cli
?Respostas:
Eu escrevi um script bash para testar conjuntos de cifras. Ele obtém uma lista de pacotes de cifras suportados do OpenSSL e tenta se conectar usando cada um. Se o aperto de mão for bem-sucedido, ele será impresso
YES
. Se o handshake não for bem-sucedido, ele será impressoNO
, seguido pelo texto de erro do OpenSSL.Aqui está um exemplo de saída mostrando três cifras não suportadas e uma cifra suportada:
EDIT: adicione flexibilidade como host e porta são fornecidos como parâmetro para o script
fonte
if [[ "$result" =~ "Cipher :" ]] ; then
em vez deif [[ "$result" =~ "Cipher is " ]] ; then
Eu também testar SSL2 e renegociação seguro: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'
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. Além disso, o nmap fornecerá uma classificação de força forte, fraca ou desconhecida para cada cifra disponível.
Primeiro, faça o download do script nmap ssl-enum-ciphers.nse ( explicação aqui ). Em seguida, no mesmo diretório que o script, execute o nmap da seguinte maneira:
Listar cifras suportadas por um servidor HTTP
Listar cifras suportadas por um servidor IMAP
Aqui está um trecho de saída de um servidor IMAP Dovecot:
fonte
portrule = function() \n return true \n end
AUTH TLS
etc, mas é possível.Sim, você pode usar a ferramenta online no site do SSL Labs para consultar o banco de dados público do servidor SSL.
Aqui está um trecho de informação que ele fornece:
(captura de tela dos resultados do google.com.br)
fonte
sslscan é um pequeno utilitário agradável.
Ele testa a conexão com TLS e SSL (e o script de construção pode ser vinculado à sua própria cópia do OpenSSL, para que também sejam verificadas versões obsoletas de SSL) e relatórios sobre os conjuntos de criptografia e certificado do servidor.
Exemplo de saída para
google.com
(aparado para facilitar a leitura):fonte
yum install sslscan
trabalha no CentOS 6.sudo dnf install sslscan
no Fedora 22 também.brew install sslscan
em OSXsudo apt-get install sslscan
no Ubuntu (12.04 - todas as versões posteriores devem estar bem).Como esse é um ótimo encadeamento de referência para ferramentas de varredura SSL, listarei o CipherScan, que foi criado há um ano e também pode identificar problemas com as cifras de troca de chaves. https://github.com/jvehent/cipherscan
Se você quiser o meu fork que suporta SNI e FreeBSD, o URL é https://github.com/oparoz/cipherscan
É um script que chama
openssl s_client
e suporta o uso de seu próprio binário OpenSSL, para que você possa testar os próximos recursos ou novas cifras (chacha20 + poly1305 por exemplo).Também permite conectar a qualquer porta desejada e usar o starttlss.
Aqui está uma saída típica
E aqui está uma lista de opções
A saída json é útil se você estiver chamando isso de outros scripts.
fonte
https://github.com/iSECPartners/sslyze
Este é baseado em Python, funciona em Linux / Mac / Windows a partir da linha de comando.
fonte
Depois de pesquisar um pouco, encontrei este teste para SSL-TLS (OWASP-CM-001) :
e também: O Foundstone SSL Digger é uma ferramenta para avaliar a força dos servidores SSL testando as cifras suportadas. Algumas dessas cifras são conhecidas por serem inseguras.
fonte
Estou usando a maioria dos testes SSL testssl.sh (consulte https://testssl.sh / devel versão @ https://github.com/drwetter/testssl.sh . Ele testa vulnerabilidades, cifras, protocolos etc.
fonte
O SSLScan é ótimo; uma nova ferramenta SSLDiagnos funciona para Windows, ou você pode simplesmente escrever um script usando o openssl s_client.
fonte
O script ssl-enum-ciphers do Nmap pode listar as cifras e versões SSL / TLS suportadas, bem como os compressores suportados.
fonte
ssl-enum-ciphers
muito mais abrangente.Se você deseja uma boa saída grepable (e suporte para verificar todas as versões SSL / TLS)
Uso: ./script.sh www.url.com
fonte
openssl ciphers -tls1.1
e,openssl ciphers -tls1.2
no entanto, esses parâmetros não parecem existir ... Existem apenas-tls1
(pelo menos nas plataformas que eu tentei).tls1_1
etls1_2
mas eles só são mostrados na versão principal do OpenSSL e nem mesmo em 1.0.2 ....)Existe um pequeno script interessante em pentesterscripting.com para utilizar o SSLScan e o OpenSSL para verificar:
http://www.pentesterscripting.com/discovery/ssl_tests (via Internet Archive Wayback Machine )
Duplicado aqui para o futuro como o site principal está morto:
Uso: ./ssltest.sh HOST PORT
fonte
Com base na resposta e na sugestão do @ indiv para publicá-lo como sua própria resposta, estou fornecendo minha versão aprimorada do script do @ indiv. Você pode fornecer um host como o primeiro argumento, e ele produzirá os mesmos resultados que o script original, mas um pouco mais formatado:
fonte
O OpenSSL Cookbook (gratuito) de Ivan Ristić, que desenvolveu a ferramenta on-line SSL Labs observada na resposta de Kez , declara:
(Minha ênfase.)
Uma ferramenta que não vi mencionada em outras respostas é o SSLTest de Stephen Bradshaw , que, entre outras coisas, pretende comparar "as cifras e protocolos detectados com os padrões de conformidade, como DSD ISM e PCI-DSS".
Portanto, tente esta ou uma das ferramentas mencionadas nas outras respostas, ou então crie sua própria e considere usar a abordagem de Ristić de handshakes parciais.
fonte
Eu escrevi uma ferramenta que faz exatamente isso. É chamado tlsenum e está disponível no GitHub .
Aqui está um exemplo de saída da ferramenta contra
twitter.com
.É semelhante ao que o SSL Lab faz, mas acho que ter uma ferramenta de linha de comando que você pode automatizar e analisar é muito mais útil.
fonte
O SSLyze, originalmente em https://github.com/iSECPartners/sslyze , agora está em https://github.com/nabla-c0d3/sslyze . Foi mencionado em outra resposta , mas sem muitos detalhes.
O SSLyze é baseado em Python e funciona no Linux / Mac / Windows a partir da linha de comando. Ele usa o OpenSSL e, no Windows, vem com uma cópia do OpenSSL em pacote.
Lista protocolos, conjuntos de cifras e detalhes importantes, além de testes para algumas vulnerabilidades comuns. É possível ativar ou desativar verificações específicas, obter mais dados ou acelerar a verificação.
fonte
A única coisa que você pode fazer é experimentar todos eles, um de cada vez, e ver quais são aceitos. Não conheço uma ferramenta para fazer isso, embora não deva ser difícil reunir uma delas com as ferramentas de script e
openssl s_client
.Enquanto o cliente anuncia quais ciphersuites serão aceitos, o servidor simplesmente escolhe um e o usa ou falha na conexão se não encontrar nada do que goste.
fonte
Todas essas respostas estão bem. Uma parte da resposta poderia explicar por que precisamos de uma ferramenta para descobrir a lista de servidores e não perguntar diretamente no TLS que o servidor fornece todos os seus conjuntos de cifras suportados, assim como o cliente TLS quando se conecta a um servidor.
A resposta é que o servidor nunca envia uma lista , basta selecionar na lista de cifras do cliente a cifra que deseja usar; é assim que o protocolo SSL / TLS é escrito: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites
É por isso que o cliente precisa enumerar as cifras para poder encontrar as suportadas pelo servidor e, para isso, fazer pelo menos um novo handshake de início (ClientHello) para cada conjunto de cifras.
fonte
Ao procurar algo que faz
AUTH TLS
no FTP, descobri esta ferramenta: ssl-cipher-suite-enumÉ um script perl que basicamente faz o que o shell script do hackajar faz, apenas mais sofisticado.
Ele também oferece uma avaliação básica das cifras e protocolos oferecidos. É um pouco como as ferramentas SSL Labs, apenas para uso doméstico. :)
Por padrão, ele suporta apenas
AUTH SSL
no FTP, mas uma simples pesquisa e substituição pode corrigir isso. Como um bônus, ele também afirma apoiar SMTP comSTARTTLS
e RDP.fonte
TestSSLServer é uma solução puramente baseada em Java. Vantagens:
está funcionando em um nível muito baixo, apenas em soquetes simples, portanto, é independente das possíveis cifras indisponíveis do JDK ou do OpenSSL .
não requer que nenhuma porta adicional (como ICMP para ping) seja aberta
está trabalhando com certificados de cliente presentes
Desvantagens:
Minha experiência pessoal: dado um servidor rígido com apenas uma única porta HTTPS aberta (nenhuma outra porta), certificados de cliente necessários e iptables ativas, ele ainda era capaz de listar cifras disponíveis, enquanto as soluções mais votadas não eram (eu estava tentando pequeno script de shell, SSL Labs, NMap, sslscan)
fonte