ฉันจะแสดงรายการชุดรหัส 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 ฉันรู้ว่าฉันสามารถพูดคุยผ่านบทสนทนา hex hex แต่ฉันหวังว่าจะได้อะไรที่หรูหรากว่านี้สักหน่อย

ฉันต้องการทำสิ่งนี้บน Linux แต่ Windows (หรืออื่น ๆ ) น่าจะใช้ได้ คำถามนี้เกิดจากการทดสอบความปลอดภัยที่ทำกับ PCI และการทดสอบการเจาะระบบทั่วไป

ปรับปรุง:

GregS ชี้ให้เห็นด้านล่างว่าเซิร์ฟเวอร์ SSL เลือกจากชุดรหัสของลูกค้า ดังนั้นดูเหมือนว่าฉันจะต้องทดสอบชุดรหัสทั้งหมดทีละตัว ฉันคิดว่าฉันสามารถแฮ็กบางอย่างเข้าด้วยกัน แต่มีวิธีที่ง่ายกว่าและปลอดภัยกว่าในอนาคต (เช่นยันต์ใหม่) หรือไม่?


อาจจะgnutls-cli?
grawity

หลังจากเปลี่ยนชื่อคำถามนี้ไม่ได้ถามหาซอฟต์แวร์ การลงคะแนนเพื่อเปิดใหม่
Bob

@ fixer1234 หากมันทำให้คุณมีความสุขมากขึ้นฉันได้ลบคำว่า "เครื่องมือ" ออกแล้ว คำถามหลักคือถามว่าจะทำภารกิจเฉพาะให้สำเร็จได้อย่างไร มันเป็นการใช้ถ้อยคำเล็กน้อยและอยู่ไกลจากคำถามประเภท "รายการซอฟต์แวร์" ที่เปิดกว้างมากขึ้น
Bob

@ บ๊อบ: ฉันดีใจ :-) การลงคะแนนเพื่อเปิดใหม่
fixer1234

คำตอบ:


232

ฉันเขียนสคริปต์ทุบตีเพื่อทดสอบชุดรหัส จะได้รับรายการของชุดรหัสที่รองรับจาก 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 ciphers ที่ไม่รองรับและ 1 cipher ที่รองรับ:

[@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 " ]] ; thenทดสอบ SSL2 และการเจรจาต่อรองใหม่อย่างปลอดภัย: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
โรเบิร์ต

2
ฉันได้แสดงรายการไว้ด้านล่างสคริปต์อื่นซึ่งต้องการ OpenSSL ชื่อCipherScan
Olivier - interfaSys

1
โปรดทราบว่าสคริปต์นี้อาจไม่บอกคุณหากเซิร์ฟเวอร์รองรับชุดรหัสที่ OpenSSL ไม่รองรับ
sampablokuper

2
คำแนะนำจาก@RobertสำหรับTLSSLedนั้นยอดเยี่ยม มันได้รับการอัพเดตเป็น 1.3 และมีฟังก์ชั่นเพิ่มเติมมากมาย ฉันใช้สำหรับการทดสอบความปลอดภัยและต้องบอกว่าฉันประทับใจ
John Yeary

162

Nmap ที่มีssl-enum-ciphers

ไม่มีวิธีที่ดีกว่าหรือเร็วกว่าในการรับรายการของรหัสที่มีอยู่จากบริการเครือข่าย ยิ่งไปกว่านั้น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

นี่คือตัวอย่างของการส่งออกจากเซิร์ฟเวอร์ 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

2
มีวิธีใช้สคริปต์นี้ใน IMAP กับ STARTTLS หรือไม่ STARTTLS บน SMTP ดูเหมือนว่าจะใช้งานได้ แต่ใน IMAP สคริปต์จะไม่ทำงาน
Giel

สองสามสิ่ง: คุณอาจเรียกใช้สคริปต์ใน nmap distro แทนที่จะเป็นสคริปต์ที่คุณดาวน์โหลด ตรวจสอบโดยการเปลี่ยนชื่อคุณ จากนั้นตรวจสอบ "portrule" ซึ่งในบางรุ่นจะตรวจสอบหมายเลขพอร์ตที่ใช้กันทั่วไป แทนที่ด้วยportrule = function() \n return true \n end
slim

... และต้องมีการแฮ็กเพื่อทำงานกับ IMAP STARTTLS, FTPS และAUTH TLSอื่น ๆ แต่เป็นไปได้
ผอม

1
หนึ่งข้อแม้คือสคริปต์ที่เก่ากว่าซึ่งอาจรวมอยู่ใน distro / package ของคุณแสดงรายการ ciphers ตามลำดับตัวอักษรไม่ใช่ลำดับเซิร์ฟเวอร์ที่แนะนำ (หรือไคลเอนต์) ของเซิร์ฟเวอร์ ดูความคิดเห็นข้างต้นจาก @slim
Clint Pachl

3
ใน 2 ปีตั้งแต่คำตอบนี้ถูกเขียน Nmap ได้เพิ่มการสนับสนุนสำหรับ STARTTLS ผ่าน FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC และ MS SQL รวมถึงการปรับปรุงอื่น ๆ .
bonsaiviking

104

มีเครื่องมือที่สามารถทดสอบชุดตัวเข้ารหัส SSL / TLS ใดที่เว็บไซต์เสนอให้หรือไม่

ใช่คุณสามารถใช้เครื่องมือออนไลน์บนเว็บไซต์ของLabs SSLเพื่อสอบถามฐานข้อมูลเซิร์ฟเวอร์ SSL สาธารณะ

นี่คือตัวอย่างของข้อมูลที่ให้:

ข้อความแสดงแทน

(ภาพหน้าจอจากผลลัพธ์ของ google.com)


นี่คือว่าสิ่งที่ฉันกำลังมองหา! ขอบคุณมาก!
Jeremy Powell

11
น่าเสียดายที่มันรองรับเฉพาะ HTTPS บนพอร์ตมาตรฐานไม่สามารถใช้เพื่อตรวจสอบ POP3S, IMAPS หรือ IMAP ด้วย TLS
Hubert Kario

1
และในขณะที่รองรับ HTTPS เท่านั้น แต่ก็ยังขาดการรองรับ SNI
Gurken Papst

12
และในขณะที่มันยอดเยี่ยมสำหรับไซต์สาธารณะคุณไม่สามารถใช้สำหรับไซต์บนเครือข่ายที่แยกได้จากอินเทอร์เน็ต
Iszi

53

sslscanเป็นยูทิลิตี้เล็ก ๆ น้อย ๆ ที่ดี

มันทดสอบการเชื่อมต่อกับ TLS และ SSL (และบิลด์สคริปต์สามารถเชื่อมโยงกับสำเนาของ OpenSSL เพื่อให้ SSL รุ่นที่ล้าสมัยนั้นได้รับการตรวจสอบด้วย) และรายงานเกี่ยวกับชุดเข้ารหัสและใบรับรองของเซิร์ฟเวอร์

ตัวอย่างผลลัพธ์สำหรับ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 sslscanทำงานบน CentOS 6
coder

1
sudo dnf install sslscanใน Fedora 22 เช่นกัน
Zayne S Halsall

2
brew install sslscanบน OSX
เซียว

sudo apt-get install sslscanบน Ubuntu (12.04 - ดังนั้นรุ่นที่ใหม่กว่าทั้งหมดควรจะใช้ได้)
balu

3
อัปเดต: ควรสังเกตว่ารุ่นอย่างเป็นทางการของ sslscan ที่พบในที่เก็บ Debian และ Ubuntu (ปัจจุบัน 1.8.2 จาก 2009) ไม่สนับสนุน TLS v1.1 และ 1.2 ดูที่bugs.launchpad.net/ubuntu/+source/sslscan / หนึ่งควรใช้รุ่นใน GitHub ที่ OP เชื่อมโยงกับ
balu

15

เนื่องจากนี่เป็นเธรดอ้างอิงที่ยอดเยี่ยมสำหรับเครื่องมือการสแกน SSL ฉันจะแสดงรายการ CipherScan ซึ่งสร้างขึ้นเมื่อปีที่แล้วและยังสามารถระบุปัญหาของรหัสแลกเปลี่ยนที่สำคัญได้ https://github.com/jvehent/cipherscan

หากคุณต้องการส้อมของฉันที่รองรับ SNI และ FreeBSD URL คือ https://github.com/oparoz/cipherscan

เป็นสคริปต์ที่โทรopenssl s_clientและสนับสนุนโดยใช้ไบนารี OpenSSL ของคุณเองเพื่อให้คุณสามารถทดสอบคุณสมบัติที่จะเกิดขึ้นหรือ ciphers ใหม่ (chacha20 + poly1305 ต่อตัวอย่าง)

นอกจากนี้ยังช่วยให้คุณเชื่อมต่อกับพอร์ตใด ๆ ที่คุณต้องการและใช้ 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 มีประโยชน์หากคุณเรียกใช้สคริปต์นี้จากสคริปต์อื่น


"ไม่รองรับการกำหนดค่า SSLv3 ขนาดใหญ่การเชื่อมต่อล้มเหลว"
coder


8

หลังจาก googling เล็กน้อยฉันพบว่าการทดสอบนี้สำหรับ SSL-TLS (OWASP-CM-001) :

nmapสแกนเนอร์ผ่านทาง“-sV” ตัวเลือกการสแกนสามารถระบุบริการ SSL เครื่องตรวจจับช่องโหว่นอกเหนือจากการค้นหาบริการอาจรวมถึงการตรวจสอบกับยันต์ที่อ่อนแอ (ตัวอย่างเช่นเครื่องสแกน Nessusมีความสามารถในการตรวจสอบบริการ SSL บนพอร์ตโดยพลการและจะรายงานเลขศูนย์อ่อนแอ)

และยัง: Foundstone SSL Diggerเป็นเครื่องมือในการประเมินความแข็งแกร่งของเซิร์ฟเวอร์ SSL โดยการทดสอบ ciphers ที่รองรับ ยันต์เหล่านี้บางส่วนนั้นไม่ปลอดภัย




2

สคริปต์ssl-enum-ciphersของ Nmap สามารถแสดงรายการ ciphers และรุ่น SSL / TLS ที่รองรับรวมถึงคอมเพรสเซอร์ที่รองรับ


1
คำตอบของคุณคือก่อนหน้านี้ แต่คำตอบของ Clint Pachl อธิบายได้ละเอียดกว่า ssl-enum-ciphers
sampablokuper

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_1และtls1_2แต่พวกเขาจะปรากฏเฉพาะในรุ่นต้นแบบของ openssl และไม่ได้ใน 1.0.2 .... )
Marki

โปรดทราบว่าสคริปต์นี้อาจไม่บอกคุณหากเซิร์ฟเวอร์รองรับชุดรหัสที่ OpenSSL ไม่รองรับ
sampablokuper

2

มีสคริปต์เล็ก ๆ น้อย ๆ ที่pentesterscripting.comเพื่อใช้ทั้ง SSLScan และ OpenSSL เพื่อตรวจสอบ:

  • SSL v2;
  • ชุดยันต์ประจำสัปดาห์
  • MD5; และ
  • ช่องโหว่การเจรจา TLS ใหม่

http://www.pentesterscripting.com/discovery/ssl_tests (ผ่านเครื่องจัดเก็บข้อมูลย้อนกลับทางอินเทอร์เน็ต)

ทำซ้ำที่นี่เพื่อการป้องกันในอนาคตเนื่องจากไซต์หลักนั้นตายแล้ว:

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


2

จากคำตอบและข้อเสนอแนะของ @ indiv เพื่อโพสต์มันเป็นคำตอบของตัวเองฉันกำลังจัดทำสคริปต์เวอร์ชัน @ tweaked ของฉัน คุณสามารถระบุโฮสต์เป็นอาร์กิวเมนต์แรกและมันจะออกผลลัพธ์เช่นเดียวกับสคริปต์ต้นฉบับ แต่มีการจัดรูปแบบเพิ่มเติมเล็กน้อย:

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

OpenSSL Cookbook (ฟรี) โดย Ivan Ristićผู้พัฒนาเครื่องมือออนไลน์ SSL Labs ที่ระบุไว้ในคำตอบของ Kezกล่าวว่า:

หากคุณต้องการพิจารณาชุดทั้งหมดที่รองรับโดยเซิร์ฟเวอร์เฉพาะให้เริ่มโดยเรียกใช้openssl ciphers ALLเพื่อรับรายการชุดโปรแกรมทั้งหมดที่รองรับโดย OpenSSL เวอร์ชันของคุณ จากนั้นส่งพวกเขาไปยังเซิร์ฟเวอร์ทีละคนเพื่อทดสอบพวกเขาเป็นรายบุคคล ฉันไม่แนะนำให้คุณทำสิ่งนี้ด้วยตนเอง นี่เป็นสถานการณ์ที่ระบบอัตโนมัติขนาดเล็กไปไกล ในความเป็นจริงนี้เป็นสถานการณ์ที่มองไปรอบ ๆ สำหรับเครื่องมือที่ดีอาจจะเหมาะสม

อย่างไรก็ตามมีข้อเสียคือการทดสอบด้วยวิธีนี้ คุณสามารถทดสอบชุดโปรแกรมที่ OpenSSL รองรับได้เท่านั้น ...

ไม่มีไลบรารี SSL / TLS เดียวที่รองรับชุดรหัสทั้งหมดและทำให้การทดสอบที่ครอบคลุมนั้นทำได้ยาก สำหรับ SSL Labs, ฉันหันไปจับมือโดยใช้บางส่วนเพื่อวัตถุประสงค์นี้มีลูกค้าที่กำหนดเองที่อ้างเพื่อสนับสนุนสวีทพล ที่จริงแล้วมันไม่สามารถต่อรองได้แม้แต่ชุดเดียว แต่เพียงเสนอให้เจรจาก็เพียงพอสำหรับเซิร์ฟเวอร์ที่จะบอกคุณว่าพวกเขาสนับสนุนชุดหรือไม่ ไม่เพียง แต่คุณสามารถทดสอบห้องสวีททั้งหมดด้วยวิธีนี้ แต่คุณสามารถทำได้อย่างมีประสิทธิภาพ

(ความสำคัญของฉัน)

เครื่องมือหนึ่งที่ฉันไม่ได้กล่าวถึงในคำตอบอื่น ๆ คือSSLTestของสตีเฟ่นแบรดชอว์ซึ่งเหนือสิ่งอื่นใดมีวัตถุประสงค์เพื่อเปรียบเทียบ "ciphers และโปรโตคอลที่ตรวจพบกับมาตรฐานความสอดคล้องเช่น 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

SSLyze เดิมที่https://github.com/iSECPartners/sslyzeคือตอนนี้ที่https://github.com/nabla-c0d3/sslyze มันถูกกล่าวถึงในคำตอบอื่นแต่ไม่มีรายละเอียดมาก

SSLyze ใช้ Python และทำงานบน Linux / Mac / Windows จากบรรทัดคำสั่ง มันใช้ OpenSSL และบน Windows มันมาพร้อมกับสำเนาของ OpenSSL

แสดงรายการโปรโตคอลชุดรหัสและรายละเอียดที่สำคัญรวมถึงการทดสอบหาช่องโหว่ทั่วไป เป็นไปได้ที่จะเปิดใช้งานหรือปิดใช้งานการตรวจสอบเฉพาะเพื่อรับข้อมูลเพิ่มเติมหรือเพิ่มความเร็วในการสแกน


0

สิ่งเดียวที่คุณสามารถทำได้คือลองพวกเขาทั้งหมดทีละคนและดูว่าคนไหนยอมรับ openssl s_clientผมไม่ได้ตระหนักถึงเครื่องมือในการทำเช่นนี้แม้ว่ามันไม่ควรจะเป็นเรื่องยากที่จะซ่อมแซมหนึ่งด้วยกันจากเครื่องมือการเขียนสคริปต์และ

ในขณะที่ลูกค้าโฆษณาว่ามันจะยอมรับ ciphersuites เซิร์ฟเวอร์เพียงแค่เลือกหนึ่งและใช้มันหรือล้มเหลวในการเชื่อมต่อหากไม่พบสิ่งที่มันชอบ


โอ้ใช่ ... ด้วยเหตุผลบางอย่างที่ฉันคิดว่ามันเป็นวิธีอื่น ๆ บางทีฉันอาจจะสามารถหาก่อนที่ปูด้วยหินเครื่องมือ ... :)
เจเรเวลล์

0

คำตอบทั้งหมดนั้นใช้ได้ ส่วนหนึ่งของคำตอบสามารถอธิบายได้ว่าเหตุใดเราจึงต้องมีเครื่องมือในการค้นหารายการเซิร์ฟเวอร์และไม่ถามโดยตรงใน TLS เซิร์ฟเวอร์นั้นให้ชุดรหัสที่รองรับทั้งหมดเหมือนกับ TLS ไคลเอ็นต์เมื่อเชื่อมต่อกับเซิร์ฟเวอร์

คำตอบคือเซิร์ฟเวอร์ไม่ส่งรายการเลยเพียงแค่เลือกในรายการรหัสลูกค้าที่ต้องการใช้นี่คือวิธีเขียนโปรโตคอล SSL / TLS: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

นั่นเป็นสาเหตุที่ลูกค้าต้องระบุเลขศูนย์เพื่อให้สามารถค้นหาสิ่งที่รองรับโดยเซิร์ฟเวอร์และเพื่อทำการเริ่มต้นจับมือเริ่มต้นใหม่อย่างน้อยหนึ่งครั้ง (ClientHello) สำหรับชุดรหัสแต่ละชุด


0

ในขณะที่กำลังมองหาบางอย่างที่ทำAUTH TLSบน FTP ฉันค้นพบเครื่องมือนี้: ssl-cipher-suite-enum

มันเป็นสคริปต์ Perl ที่โดยทั่วไปแล้วทำในสิ่งที่เชลล์สคริปต์ของ Hackajar ทำนั้นซับซ้อนกว่าเท่านั้น

นอกจากนี้ยังมีการประเมินขั้นพื้นฐานของยันต์ที่นำเสนอและโปรโตคอล มันค่อนข้างเหมือนกับเครื่องมือ SSL Labs สำหรับใช้ในบ้านเท่านั้น :)

โดยค่าเริ่มต้นรองรับเฉพาะAUTH SSLบน FTP แต่การค้นหาและแทนที่แบบง่ายสามารถแก้ไขได้ เป็นโบนัสมันยังอ้างว่าสนับสนุน SMTP ด้วยSTARTTLSและ RDP


0

TestSSLServerเป็นโซลูชั่นที่ใช้ Java ล้วนๆ ข้อดี:

  • มันทำงานในระดับต่ำมากเพียงแค่เสียบธรรมดาจึงเป็นอิสระของยันต์ไม่พร้อมใช้งานที่เป็นไปได้จาก JDK หรือ OpenSSL

  • ไม่จำเป็นต้องเปิดพอร์ตเพิ่มเติมใด ๆ (เช่น ICMP สำหรับการปิง)

  • มันทำงานกับใบรับรองลูกค้าปัจจุบัน

ข้อเสีย:

  • ในปี 2559 รายชื่อยันต์อาจล้าสมัย (แม้ว่าฉันจะไม่มีความเชี่ยวชาญในการตัดสินสิ่งนี้)

ประสบการณ์ส่วนตัวของฉัน: เมื่อเปิดเซิร์ฟเวอร์ HTTPS ที่เปิดเพียงพอร์ตเดียว (ไม่มีพอร์ตอื่น) ต้องใช้ใบรับรองไคลเอ็นต์และ iptables ใช้งานอยู่ก็ยังสามารถแสดงรายการ ciphers ที่ใช้ได้ในขณะที่โซลูชันที่ได้รับคะแนนสูงสุดไม่ใช่ (ฉันคือ ลองเชลล์สคริปต์ขนาดเล็ก, Labs SSL, NMap, sslscan)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.