如何使用特定的 SSL 密码连接到 HTTPS 网站并查看输出?
这在进行漏洞分析和清除误报时很有用,例如当设备宣传它支持弱密码但显示一个页面通知必须使用强密码时。
如何使用特定的 SSL 密码连接到 HTTPS 网站并查看输出?
这在进行漏洞分析和清除误报时很有用,例如当设备宣传它支持弱密码但显示一个页面通知必须使用强密码时。
完成您所要求的最简单的方法就是使用openssl s_client连接到具有受限密码列表的站点。而且,事实上,同样的方法适用于许多工具——当然适用于大多数编程或脚本语言(Python(正如@terry-chia 建议的那样)、Perl、tcl、C...)和浏览器(一些有用的评论在这里)。
让我们来看看如何使用 openssl 做到这一点。
确定要尝试的密码
您可以使用工具sslscan确定给定站点接受或拒绝的密码:
$ sslscan www.google.com | grep Rejected | head -1
Rejected SSLv3 256 bits ECDHE-ECDSA-AES256-SHA
$ sslscan www.google.com | grep Accepted | head -1
Accepted SSLv3 256 bits ECDHE-RSA-AES256-SHA
$
这告诉我们一种密码 www.google.com 拒绝和一种接受。现在我们可以使用 openssl s_client 测试两者。
测试被拒绝的密码
只需使用 openssl 的“-cipher”参数来将您的客户端支持的密码套件限制为您要测试的一种密码。在这里,我选择被 sslscan 标记为 Rejected 的那个:
$ openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect www.google.com:443
CONNECTED(00000003)
140465833367232:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:741:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 127 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$
我们在顶部附近看到握手失败,然后我们看到“密码为 (NONE)”,这清楚地表明服务器不愿意与只协商我们指定的一个密码的客户端达成一致。我想这就是您说要使用特定的 SSL 密码连接并“查看输出”时的意思。
测试接受的密码
现在,如果我们对我们知道服务器支持的密码执行相同的操作,我们会看到一个完整的连接,我们可以输入 HTTP 命令。在输出下方,我将列出一些需要注意的事项:
$ openssl s_client -cipher 'ECDHE-RSA-AES256-SHA' -connect www.google.com:443
CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global 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=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEdjCCA16gAwIBAgIIRYUpUVjSfHQwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
...
OEK3nH1sBk2Hy5ZBcyludHyUzqTHsXSjnIjwZNPpihVmFrs5I1Ma7iEj
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
---
SSL handshake has read 3750 bytes and written 277 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.1
Cipher : ECDHE-RSA-AES256-SHA
Start Time: 1385691323
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
TRACE / HTTP/1.0
HTTP/1.0 405 Method Not Allowed
Content-Type: text/html; charset=UTF-8
Content-Length: 960
Date: Fri, 29 Nov 2013 02:15:31 GMT
Server: GFE/2.0
...
请注意以下标志:
注意事项
这在 openssl 命令行中相对容易。根据所使用的语言和库,在代码中执行此操作可能会更难。在浏览器中执行此操作可能会很痛苦,因为这种细粒度的控制不容易访问 - 例如,如果 Chrome 在 Windows 上使用 SSL 操作系统,您需要找出用于操作 SSL 的注册表项。
另一个问题可能是确定要测试的密码字符串。如果您正在调查另一个工具的报告,正如您的问题所暗示的那样,它可能没有描述它在 OpenSSL 密码字符串方面看到的密码问题。不止一次,我在电话中遇到支持人员询问“当你说‘弱密码’时,你到底指的是什么?”