Como faço para listar os conjuntos de cifras SSL / TLS que um site específico oferece?

261

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?

Jeremy Powell
fonte
Talvez gnutls-cli?
grawity
Após a alteração do título, essa pergunta realmente não está solicitando um registro de software. Votação para reabrir.
Bob
@ fixer1234 Se isso o deixa mais feliz, removi qualquer ocorrência da palavra "ferramenta". A questão central é perguntar como realizar uma tarefa específica de qualquer maneira; é uma reformulação menor e está longe de ser uma questão mais aberta do tipo "lista de software".
Bob
@ Bob: Estou em êxtase. :-) Votação para reabrir.
precisa saber é o seguinte

Respostas:

232

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á impresso 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á um exemplo de saída mostrando três cifras não suportadas e uma 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

indiv
fonte
7
openssl 1.0 precisa de uma mudança: if [[ "$result" =~ "Cipher :" ]] ; thenem vez de if [[ "$result" =~ "Cipher is " ]] ; thenEu 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'
Hubert Kario
9
Existe outro script shell muito sofisticado disponível que usa sslscan e openssl: TLSSLed
Robert
2
Eu listei abaixo outro script que requer apenas OpenSSL chamado CipherScan
Olivier - interfaSys
1
Observe que esse script provavelmente não informa se um servidor suporta conjuntos de cifras que o OpenSSL não suporta.
Sampablokuper 19/09/16
2
A sugestão do @Robert para TLSSLed foi fantástica. Foi atualizado para 1.3 e tem muito mais funcionalidade. Eu tenho usado para testes de segurança e devo dizer que estou impressionado.
precisa saber é o seguinte
162

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

$ 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 IMAP Dovecot:

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
Clint Pachl
fonte
2
Existe alguma maneira de usar esse script no IMAP com STARTTLS? STARTTLS no SMTP parece funcionar, mas no IMAP o script nem parece ser executado.
Giel 11/07
Algumas coisas: você pode estar executando o script na sua distribuição nmap, em vez da que você baixou. Verifique renomeando o seu. Em seguida, verifique o "portrule", que em algumas versões verifica os números de porta mais usados. Substitua porportrule = function() \n return true \n end
slim
... e precisaria de alguns hackers para trabalhar com IMAP STARTTLS, FTPS AUTH TLSetc, mas é possível.
magro
1
Uma ressalva é que os scripts mais antigos, que podem ser incluídos na sua distribuição / pacote, listam as cifras em ordem alfabética, não a ordem preferida do servidor (ou cliente). Veja o comentário acima de @slim
Clint Pachl
3
Nos 2 anos desde que essa resposta foi escrita, o Nmap adicionou suporte ao STARTTLS sobre FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC e MS SQL, além de muitas outras melhorias além de simplesmente listar cifras suportadas .
bonsaiviking 19/09/16
104

Existe uma ferramenta que possa testar quais conjuntos de cifras SSL / TLS um determinado site oferece?

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:

texto alternativo

(captura de tela dos resultados do google.com.br)

Kez
fonte
Era exatamente isso que eu estava procurando! Muito obrigado!
Jeremy Powell
11
Infelizmente, não suportam apenas HTTPS na porta padrão, não pode usá-lo para verificar POP3S, IMAPS ou IMAP com TLS
Hubert Kario
1
E embora ele suporte apenas HTTPS, ele ainda não suporta SNI.
Gurken Papst
12
E embora seja ótimo para sites voltados para o público, você não pode usá-lo para sites em redes isoladas da Internet.
Iszi
53

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

$ 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
indiv
fonte
1
yum install sslscantrabalha no CentOS 6.
um codificador
1
sudo dnf install sslscanno Fedora 22 também.
Zayne S Halsall
2
brew install sslscanem OSX
Xiao
sudo apt-get install sslscanno Ubuntu (12.04 - todas as versões posteriores devem estar bem).
balu
3
Atualização: Note-se que a versão oficial do sslscan encontrada nos repositórios Debian e Ubuntu (atualmente 1.8.2 a partir de 2009) não suporta 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 se vinculou.
balu
15

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

# ./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 json é útil se você estiver chamando isso de outros scripts.

Olivier - interfaSys
fonte
"configuração big-SSLv3 não suportada, conexão falhou"
um codificador
8

Depois de pesquisar um pouco, encontrei este teste para SSL-TLS (OWASP-CM-001) :

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

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.

fluxtendu
fonte
2

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

Dwayne
fonte
2

O script ssl-enum-ciphers do Nmap pode listar as cifras e versões SSL / TLS suportadas, bem como os compressores suportados.

bonsaiviking
fonte
1
Sua resposta foi anterior, mas a resposta de Clint Pachl explica de maneira ssl-enum-ciphersmuito mais abrangente.
Sampablokuper 19/09/16
2

Se você deseja uma boa saída grepable (e suporte para verificar todas as versões SSL / TLS)

Uso: ./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";
hackajar
fonte
Você está executando openssl ciphers -tls1.1e, openssl ciphers -tls1.2no entanto, esses parâmetros não parecem existir ... Existem apenas -tls1(pelo menos nas plataformas que eu tentei).
Marki
(Parece haver opções adicionais na forma de tls1_1e tls1_2mas eles só são mostrados na versão principal do OpenSSL e nem mesmo em 1.0.2 ....)
Marki
Observe que esse script provavelmente não informa se um servidor suporta conjuntos de cifras que o OpenSSL não suporta.
precisa saber é o seguinte
2

Existe um pequeno script interessante em pentesterscripting.com para utilizar o SSLScan e o OpenSSL para verificar:

  • SSL v2;
  • Ternos de cifras da semana;
  • MD5; e
  • Vulnerabilidade de renegociação do TLS

http://www.pentesterscripting.com/discovery/ssl_tests (via Internet Archive Wayback Machine )

Duplicado aqui para o futuro como o site principal está morto:

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

Uso: ./ssltest.sh HOST PORT

Pi3cH
fonte
2

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:

#!/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
insaner
fonte
2

O OpenSSL Cookbook (gratuito) de Ivan Ristić, que desenvolveu a ferramenta on-line SSL Labs observada na resposta de Kez , declara:

Se você deseja determinar todos os conjuntos suportados por um servidor específico, comece chamando openssl ciphers ALLpara obter uma lista de todos os conjuntos suportados pela sua versão do OpenSSL. Em seguida, envie-os ao servidor, um por um, para testá-los individualmente. Não estou sugerindo que você faça isso manualmente; Essa é uma situação na qual um pouco de automação percorre um longo caminho. De fato, é uma situação em que procurar uma boa ferramenta pode ser apropriado .

Há uma desvantagem em testar dessa maneira, no entanto. Você só pode testar os pacotes que o OpenSSL suporta. ...

Nenhuma biblioteca SSL / TLS suporta todos os conjuntos de criptografia e isso dificulta o teste abrangente. Para o SSL Labs, recorri ao uso de handshakes parciais para esse fim, com um cliente personalizado que finge suportar pacotes arbitrários . Na verdade, ele não pode negociar nem mesmo um único conjunto, mas apenas propor negociar é suficiente para os servidores dizerem se eles suportam um conjunto ou não. Não apenas você pode testar todos os conjuntos dessa maneira, mas também pode fazê-lo com muita eficiência.

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

sampablokuper
fonte
1

Eu escrevi uma ferramenta que faz exatamente isso. É chamado tlsenum e está disponível no 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

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.

Ayrx
fonte
1

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.

CBHacking
fonte
0

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.

James K Polk
fonte
Ah sim ... por algum motivo eu estava pensando que era o contrário. Talvez eu possa encontrar uma ferramenta de pré-pavimentada ... :)
Jeremy Powell
0

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.

philippe lhardy
fonte
0

Ao procurar algo que faz AUTH TLSno 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 SSLno FTP, mas uma simples pesquisa e substituição pode corrigir isso. Como um bônus, ele também afirma apoiar SMTP com STARTTLSe RDP.

Daniel B
fonte
0

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:

  • a partir de 2016, a lista de cifras pode estar desatualizada (embora eu não seja especialista aqui para julgar isso)

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)

mstrap
fonte