本文介绍了使用半自动化工具执行SSL&TLS安全性评估的过程,以及如何使用手动及工具的测试方法验证并发现问题。目的是优化TLS和SSL安全测试流程,帮助信息安全顾问在渗透测试时在TLS / SSL上花费更少的时间。
什么是TLS和SSL?
安全套接层(SSL)和传输层安全(TLS)加密用于通过互联网提供通信安全(传输加密)和来保护网络流量和互联网上的隐私,用于诸如网络,电子邮件,即时消息(IM)和一些虚拟专用网络(VPN)。
因此,TLS安全配置很重要,应花时间学习如何识别常见的漏洞和安全配置错误。
TLS / SSL安全测试工具
testssl.sh
testssl.sh是我们首选的测试工具,它涵盖了TLS和SSL评估所需的所有测试所需工具,并定期更新。
安装
您可以通过执行其git clone来安装最新版本的tesetssl.sh:
git clone https://github.com/drwetter/testssl.sh.git
testssl.sh示例
有许多可以用于testssl.sh的测试选项,您应该使用的选项将在很大程度上取决于您的测试要求。以下是部分有关testssl.sh命令行选项的示例。运行./testssl.sh可以看到所有选项。
测试单个主机上的所有内容并输出到控制台
./testssl.sh -e -E -f -p -y -Y -S -P -c -H -U TARGET-HOST
测试单个主机上的所有内容并输出到HTML
./testssl.sh -e -E -f -p -y -Y -S -P -c -H -U TARGET-HOST | aha> OUTPUT-FILE.html
测试子网上的所有主机并输出到HTML
./testssl.sh -e -E -f -p -y -Y -S -P -c -H -U 192.168.1.0/24 | aha> OUTPUT-FILE.html
与上述相同,但只列举每个服务器支持的密码类型:
./testssl.sh -E 192.168.1.0/24 | aha> OUTPUT-FILE.html
控制台输出的截图
HTML输出的截图
TLS和SSL漏洞测试
常见的TLS和SSL漏洞已经列在下面了,每个漏洞都有一个说明,如果可能的话可以手动或自动测试漏洞
SWEET32(CVE-2016-2183)
定义
64位块大小(如Triple-DES(3DES))的传统块密码在CBC模式下使用,易受到攻击。当使用CBC模式操作时,使用simple birthday attack来识别64位块密码冲突。当碰撞发生时,这意味着输入与输出相同,使得可以执行BEAST style attack来渗透加密的数据。
作者Karthik Bhargavan和Gaetan Leurent能够在浏览器(作为MiTM)中运行JavaScript,并发送大量的数据导致冲突,然后使用此信息来恢复会话cookie。
测试SWEET32
确定服务器是否支持Triple-DES密码,如果服务器支持Triple-DES,则易受SWEET32攻击。
SWEET32 testssl.sh
使用testssl.sh识别弱密码:
./testssl.sh --ciphers TARGET
如果输出显示Tripe DES密码,就像下面的截图一样,目标服务器容易受到SWEET32的影响:
如果输出看起来像下面的截图,服务器不容易受到SWEET32的影响:
此外,您可以枚举服务器提供给每个协议的密码,方法如下:
./testssl.sh -E TARGET
使用3DES的任何密码都易受SWEET32影响。
SWEET32 Nmap测试
Nmap也可用于枚举服务器的密码,NSE插件还将通知是否有任何64位块密码可用。
nmap --script = ssl-enum-ciphers -p443 TARGET
如果您在输出中看到以下内容,则会发现64位块密码
warnings: | 64-bit block cipher 3DES vulnerable to SWEET32 attack
手动测试SWEET32
根据上面方法测试用Nmap NSE脚本枚举密码
DROWN(CVE-2016-0800)
DROWN定义
DROWN(使用过时和弱化的eNcryption解密RSA),DROWN攻击的最一般变体利用了SSLv2协议的一个根本缺点,允许中间人(MiTM)攻击者利用导入符合20世纪90年代美国政府的限制(EXPORT等级加密在下面的FREAK漏洞描述中详细描述)的密码学。
测试DROWN
testssl.sh DROWN测试
./testssl.sh -D TARGET
Nmap DROWN测试
nmap -p 443 -sV --script = sslv2-drown
FREAK(CVE-2015-0204)
FREAK定义
FREAK(破解RSA导出密钥),利用了TLS / SSL中的加密弱点,这是美国政府几十年前最初引入的。使用RSA_EXPORT密钥的想法是允许导出包含不能被大多数计算机破解的加密密钥。如果RSA_EXPORT密钥加密为512位或更少,那么以目前的计算机性能很容易破解。
FREAK执行降级攻击(强制服务器使用较弱的密码),当与中间人(MiTM)类型攻击相结合时,这允许攻击者捕获数据并中断弱密钥的解密。
FREAK攻击的自动测试
testssl.sh FREAK攻击测试
./testssl -F TARGET
手动测试FREAK攻击
使用./testssl.sh -E TARGET或者nmap -p 443 --script=ssl-enum-ciphers TARGET枚举服务器密码,确保服务器支持的以下类型密码不包含:EXPORT。
例:
Logjam(CVE-2015-4000)
Logjam问题利用TLS协议(1.2及更早版本)通过Diffie-Hellman组合交换的方式发现的漏洞。该漏洞允许中间人(MiTM)攻击者执行降级攻击,并使用Diffie-Hellman导出密码(DHE_EXPORT)。
Logjam自动测试
logjam的testssl.sh测试
./testssl.sh -J TARGET
手动测试Logjam
禁用EXPORT密码,说明与FREAK攻击相同,如上所述。
手动枚举由服务器提供的密码套件,使用./testssl.sh -E TARGET或nmap -p 443 --script=ssl-enum-ciphers TARGET。
Heartbleed(CVE-2014-0160)
心脏出血的定义
以OpenSSL处理TLS和DTLS心跳扩展数据包的方式发现了一个缺陷,允许攻击者从加密的TLS / DTLS数据中公开信息。恶意客户端可以发送特制的TLS或DTLS Heartbeat数据包,以便从连接的客户端或服务器的每个请求中获得内存部分。
公开的内存部分可能包含敏感信息,诸如私钥(由服务提供商用于加密数据),实际用户的姓名,用户名和密码。允许攻击者窃听通信,冒充用户并窃取数据。
自动化测试
使用testssl.sh进行测试:
# ./testssl.sh -B 10.0.1.159 ########################################################### testssl.sh 2.8rc1 from https://testssl.sh/dev/ (424cf23 2016-08-09 10:35:58 -- 1.531) This program is free software. Distribution and modification under GPLv2 permitted. USAGE w/o ANY WARRANTY. USE IT AT YOUR OWN RISK! Please file bugs @ https://testssl.sh/bugs/ ########################################################### Using "OpenSSL 1.0.2-chacha (1.0.2i-dev)" [~183 ciphers] on kali:./bin/openssl.Linux.x86_64 (built: "Jun 22 19:32:29 2016", platform: "linux-x86_64") Start 2017-01-20 22:43:38 -->> 10.0.1.159:443 (10.0.1.159) <<-- rDNS (10.0.1.159): -- Service detected: HTTP Testing for heartbleed vulnerability Heartbleed (CVE-2014-0160) VULNERABLE (NOT ok) Done 2017-01-20 22:43:41 -->> 10.0.1.159:443 (10.0.1.159) <<--
使用Nmap测试Heartbleed
# nmap -p 443 --script ssl-heartbleed --script-args vulns.showall 10.0.1.159 Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2017-01-20 22:45 EST Nmap scan report for 10.0.1.159 Host is up (0.00028s latency). PORT STATE SERVICE 443/tcp open https | ssl-heartbleed: | VULNERABLE: | The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. It allows for stealing information intended to be protected by SSL/TLS encryption. | State: VULNERABLE | Risk factor: High | OpenSSL versions 1.0.1 and 1.0.2-beta releases (including 1.0.1f and 1.0.2-beta1) of OpenSSL are affected by the Heartbleed bug. The bug allows for reading memory of systems protected by the vulnerable OpenSSL versions and could allow for disclosure of otherwise encrypted confidential information as well as the encryption keys themselves. | | References: | http://www.openssl.org/news/secadv_20140407.txt | http://cvedetails.com/cve/2014-0160/ |_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160 MAC Address: 00:0C:29:35:3D:E8 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.36 seconds
手动测试Heartbleed
使用Metasploit验证已存在的Heartbleed,使用详细设置将显示Heartbleed暴露的内存泄漏。
msf> use auxiliary/scanner/ssl/openssl_heartbleed msf> set rhosts TARGET-ADDRESS msf> set verbose true msf> run
POODLE SSLv3(CVE-2014-3566)
POODLE定义
Google的安全小组在2014年10月14日发现了POODLE攻击(Padding Oracle On Downgraded Legacy Encryption)。该漏洞利用了SSLv3处理填充字节的方式(密码块链接)CBC操作模式。
该缺陷允许中间人(MiTM)攻击者在少于256个SSLv3连接中解密密文的所选字节,如果他们能够强制受害者应用程序重复发送相同的数据通过新创建SSL 3.0连接。
自动测试POODLE
使用Nmap测试POODLE
# nmap -p 443 --script ssl-poodle --script-args vulns.showall 10.0.1.159 Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2017-01-20 22:50 EST Nmap scan report for 10.0.1.159 Host is up (0.00037s latency). PORT STATE SERVICE 443/tcp open https | ssl-poodle: | VULNERABLE: | SSL POODLE information leak | State: VULNERABLE | IDs: CVE:CVE-2014-3566 OSVDB:113251 | The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and other | products, uses nondeterministic CBC padding, which makes it easier | for man-in-the-middle attackers to obtain cleartext data via a | padding-oracle attack, aka the "POODLE" issue. | Disclosure date: 2014-10-14 | Check results: | TLS_RSA_WITH_AES_128_CBC_SHA | References: | http://osvdb.org/113251 | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566 | https://www.imperialviolet.org/2014/10/14/poodle.html |_ https://www.openssl.org/~bodo/ssl-poodle.pdf MAC Address: 00:0C:29:35:3D:E8 (VMware) Nmap done: 1 IP address (1 host up) scanned in 0.35 seconds
使用testssl.sh测试POODLE
./testssl.sh -O 10.0.1.159 ########################################################### testssl.sh 2.8rc1 from https://testssl.sh/dev/ (424cf23 2016-08-09 10:35:58 -- 1.531) This program is free software. Distribution and modification under GPLv2 permitted. USAGE w/o ANY WARRANTY. USE IT AT YOUR OWN RISK! Please file bugs @ https://testssl.sh/bugs/ ########################################################### Using "OpenSSL 1.0.2-chacha (1.0.2i-dev)" [~183 ciphers] on kali:./bin/openssl.Linux.x86_64 (built: "Jun 22 19:32:29 2016", platform: "linux-x86_64") Start 2017-01-20 22:52:59 -->> 10.0.1.159:443 (10.0.1.159) <<-- rDNS (10.0.1.159): -- Service detected: HTTP Testing for SSLv3 POODLE (Padding Oracle On Downgraded Legacy Encryption) POODLE, SSL (CVE-2014-3566) VULNERABLE (NOT ok), uses SSLv3+CBC (check TLS_FALLBACK_SCSV mitigation below) Testing for TLS_FALLBACK_SCSV Protection TLS_FALLBACK_SCSV (RFC 7507), experim. Downgrade attack prevention NOT supported
手动测试POODLE
Kali附带的openssl版本不再支持SSLv3。使用二进制码testssl.sh/bin/openssl.Linux.x86_64进行手动SSLv3测试。
./openssl.Linux.x86_64 s_client -ssl3 -connect 10.0.1.159:443
如果握手完成,则服务器容易受到POODLE的影响。
对于容易受到POODLE影响的服务器的输出示例(从响应中删除的证书):
--- No client certificate CA names sent Server Temp Key: DH, 1024 bits --- SSL handshake has read 1398 bytes and written 373 bytes --- New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : SSLv3 Cipher : DHE-RSA-AES256-SHA Session-ID: 0450660185C7B2623CB2145A1C6655BDD8CC281F882C3B9E0ED35E88360639BA Session-ID-ctx: Master-Key: 6A56AC01754D9441ACFD6C0B9E534E33450CD2F0E0D619F235E2ACC1780CFD86E769B9AE82D0D5AAA4C62B295B5BB598 Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None Start Time: 1484971085 Timeout : 7200 (sec) Verify return code: 9 (certificate is not yet valid) ---
如果服务器不容易受到POODLE的影响,握手将失败,发生如下错误:
CONNECTED(00000003) 28395584:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1475:SSL alert number 40 28395584:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656: --- no peer certificate available ---
CCS注入漏洞(CVE-2014-0224)
CCS注入定义
某些版本的OpenSSL存在弱点,允许客户端和服务器通过特制的握手包来强制使用弱密钥进行通信。允许中间人攻击者解密和修改客户端与服务器之间的流量。
受影响的OpenSSL版本:
- OpenSSL before 0.9.8za
- OpenSSL 1.0.0 before 1.0.0m
- OpenSSL 1.0.1 before 1.0.1
资料来源: https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2014-0224
CCS注入自动化测试
testssl.sh CCS注入测试
./testssl.sh -I TARGET
Nmap CCS注入测试
nmap -p 443 --script = ssl-ccs-injection TARGET
POODLE TLS(CVE-2014-8730)
POODLE TLS定义
由于TLS填充是SSLv3的一个子集,因此可以重新使用针对TLS的POODLE攻击。TLS对于它的填充格式是非常严格的,但是一些TLS实现在解密之后不执行填充结构的检查。即使使用TLS也不会容易受到POODLE攻击的影响。
资料来源:https://blog.qualys.com/ssllabs/2014/12/08/poodle-bites-tls
测试POODLE TLS
testssl.sh POODLE TLS测试
与以上针对POODLE SSL的testssl.sh指令相同
Nmap POODLE TLS测试
与上面针对POODLE SSL的Nmap说明相同
BREACH(CVE-2013-3587)
BREACH攻击定义
BREACH代表通过自适应压缩超文本进行浏览器检测和渗透。与CRIME相似之处是利用HTTP压缩中的漏洞,允许攻击者识别页面中是否存在文本。
BREACH攻击基本流程
当页面上发生文本重复时,将删除重复的术语,有助于减小页面的大小。这可以用于识别现有的页面内容,下面是Web应用程序的示例,显示当前登录的用户在页面中反映的用户名:
- 输入您认为不存在于搜索参数中的用户名
- 注意返回页面的大小
- 发送您认为存在的用户名的其他搜索请求
- 注意返回页面的大小,如果用户名与登录用户名匹配(确认存在),页面大小对比上次将会缩小
通过分析响应的大小可以预测文本,实际上没有流量被“解密”
为了使BREACH攻击成功地渗透数据,必须有一种机制来反映渲染页面中的用户输入,并且服务器必须支持HTTP压缩。
BREACH自动测试
使用testssl.sh测试BREACH
./testssl.sh -T TARGET
BREACH手动测试
openssl s_client -connect TARGET:443
输入以下内容来确定服务器是否使用压缩:
GET / HTTP / 1.1 主机:目标 Accept-Encoding:compress,gzip
如果服务器返回乱码的字符,如下面的截图所示,则服务器支持压缩,容易受到BREACH的攻击:
如果目标Web服务器不返回压缩数据输出,则它不容易受到BREACH的影响,并且是被禁用压缩。
RC4 CVE-2013-2566
TLS协议和SSL协议中使用的RC4算法具有许多单字节偏移。远程攻击者可以通过使用相同明文的大量会话中的密文统计分析来进行明文破解攻击。
自动RC4测试
testssl.sh RC4测试
./testssl.sh -4目标
手动RC4测试
使用./testssl.sh -E TARGET手动枚举服务器密码或者nmap -p 443 --script=ssl-enum-ciphers TARGET确保服务器支持密码类型不使用RC4。
CRIME(CVE-2012-4929)
CRIME攻击定义
CRIME是TLS 1.2漏洞,允许中间人(MiTM)攻击者识别加密数据,(潜在)执行会话劫持。攻击者可以通过检查密文的大小来识别加密数据,同时从浏览器引入多个有效载荷,当字符匹配在标题内时,其大小会有所不同,允许攻击者修改会话cookie。实际上没有使用CRIME攻击解密数据,TLS 1.2处理压缩的一个弱点使得攻击者可以通过比较返回的大小来识别头文件何时存在。
CRIME自动测试
使用testssl.sh测试CRIME
./testssl.sh -C TARGET
手动测试CRIME
Kali使用的openssl客户似乎不再允许TLS 1.2压缩。如果您使用此版本的openssl进行测试,即使目标服务器启用了TLS 1.2压缩,响应将始终为“Compression:NONE”。可以使用testssl.sh附带的openssl.Linux.x86_64二进制文件来解决此问题。
./bin/openssl.Linux.x86_64 s_client -connect 10.0.1.158:443
示例输出 – 不易受CRIME影响
如果服务器不容易受到CRIME的影响。“压缩:无”表示压缩在服务器上被禁用,并且不易受到CRIME的攻击。
Compression: NONE
示例输出 – 易受CRIME影响
如果服务器易受CRIME攻击:
Compression: zlib compression压缩:zlib压缩
Renegotiation(CVE-2009-3555)
TLS / SSL重新协商漏洞定义
2009年发现一个利用TLS和SSL协议Renegotiation的漏洞,允许攻击者将数据插入会话可危及其完整性。
条件
必须满足以下条件才能利用此漏洞:
- 服务器不支持secure renegotiation
- 服务器必须允许client side renegotiation
Renegotiation的自动测试
测试secure renegotiation 以及 client side renegotiation.
# ./testssl.sh -R 10.0.1.159 ########################################################### testssl.sh 2.8rc1 from https://testssl.sh/dev/ (424cf23 2016-08-09 10:35:58 -- 1.531) This program is free software. Distribution and modification under GPLv2 permitted. USAGE w/o ANY WARRANTY. USE IT AT YOUR OWN RISK! Please file bugs @ https://testssl.sh/bugs/ ########################################################### Using "OpenSSL 1.0.2-chacha (1.0.2i-dev)" [~183 ciphers] on kali:./bin/openssl.Linux.x86_64 (built: "Jun 22 19:32:29 2016", platform: "linux-x86_64") Start 2017-01-21 00:04:30 -->> 10.0.1.159:443 (10.0.1.159) <<-- rDNS (10.0.1.159): -- Service detected: HTTP Testing for Renegotiation vulnerabilities Secure Renegotiation (CVE-2009-3555) not vulnerable (OK) Secure Client-Initiated Renegotiation not vulnerable (OK) Done 2017-01-21 00:04:31 -->> 10.0.1.159:443 (10.0.1.159) <<--
手动测试Renegotiation
测试 Secure Renegotiation
openssl s_client -connect TARGET:443
Secure Renegotiation未启用的示例:
--- SSL handshake has read 1606 bytes and written 503 bytes --- New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA Server public key is 1024 bit Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session:
Secure Renegotiation启用的示例:
--- SSL handshake has read 1560 bytes and written 495 bytes --- New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384 Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session:
测试 Client Initiated Secure Renegotiation
openssl s_client -connect TARGET:443
类型:
HEAD / HTTP / 1.1 R
如果你看到响应:
HEAD / HTTP / 1.1 R RENEGOTIATING
即服务器允许client renegotiation。
如果你看到回应:
HEAD / HTTP/1.1 R RENEGOTIATING 139681067286040:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
则服务器不支持client renegotiation。
TLS和SSL证书
对没有加密的服务器证书应该被评估为配置错误和弱加密签名,下面是证书检查的项目列表:
使用以下方式获取目标服务器证书:
openssl s_client -connect TARGET:443 | openssl x509 -noout -text
证书检查项目表
名称 | 描述 |
---|---|
识别证书颁发者 | 确保证书颁发机构(CA)来自受信任的来源,不使用自签名证书,因为自签名证书允许中间人员攻击(除非是内部的,并且与内部CA签名)。 |
签名算法 | 用于确保证书完整性的算法,您应该确保密码是安全的,而不是使用MD5(已知不安全)或SHA1。 |
公钥 | 关键长度应该足够长以确保它不能被破解,最小值应该是2048位。 |
Not Before | 证书开始日期。 |
Not After | 证书结束日期。 |
Subject&Subject Alternative Name | Subject应该列出证书所涉及的DNS名称,如果这是不正确的浏览器会引发错误。Subject Alternative Name应列出通配符证书的DNS名称,应列出此证书的所有DNS名称。 |
HTTP Security Headers
什么是HTTP Security Headers?
如果配置正确,HTTP Security Headers可为您的域提供额外的安全功能。以下是主要HTTP安全头文件的概述:
可以使用Burp Suite,Curl或testssl.sh(任何许多其他工具)来检查HTTP Security Headers。
使用Curl检查HTTP安全头文件
curl -s -D - TARGET -o / dev / null
示例输出:
HTTP/1.1 301 Moved Permanently Date: Mon, 23 Jan 2017 16:15:51 GMT Server: Apache Content-Security-Policy: default-src 'self' *.target X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff Location: TARGET Cache-Control: max-age=3600 Expires: Mon, 23 Jan 2017 17:15:51 GMT Vary: Accept-Encoding Content-Length: 233 Content-Type: text/html; charset=iso-8859-1
使用testssl.sh检查HTTP安全头
./testssl.sh -H
HTTP安全性头文件
名称 | 定义 |
---|---|
HSTS | HSTS安全头文件强制Web浏览器或客户端仅通过HTTPS连接与服务器进行通信。HSTS确保连接仅使用HTTPS,并防止中间人(MiTM)攻击,降级攻击和cookie劫持。HSTS是Trust on First Use(TOFU),这意味着它必须通过HTTP发送至少一个不安全的连接到主机以传输安全的头。HSTS预载列表是为浏览器提供支持HSTS的站点列表,以避免最初不安全的连接。 |
内容安全策略(CSP) | 内容安全策略(CSP)是一个HTTP安全头文件策略,可帮助减轻某些类型的数据注入攻击(如XSS(跨站点脚本))的风险。CSP允许网站管理员通过定义一个策略来便面或减少XSS攻击,该策略规定了浏览器应该信任什么位置并允许脚本执行。 |
X-Frame选项 | 该X-Frame选项报头防止网站的代码部分展示出就像<IFRAME>,<FRAME>或<object>。通过防止这种内容在这些元素中呈现,站点可以使用X-Frame选项来防止点击劫持(clickjacking)。 |
X-XSS保护 | 较旧的HTTP安全header,可在Internet Explorer,Chrome和Firefox中启用XSS保护。虽然此功能现在由CSP内联JS提供,但是当与不支持CSP的旧浏览器配合使用时,此标头仍然可以提供保护。 |
X-Content-Type-Options | 通过强制由Content-Type指定的MIME类型来防止MIME-sniff类型攻击。 |
工具地址:
https://github.com/drwetter/testssl.sh
文章来自:https://www.infinisign.com/faq/tls-ssl-security-testing。