echo Q | openssl s_client -ssl3 -connect HOSTNAME:PORT 2>/dev/null | grep 'Cipher is'
但是,如果计算机上没有安装任何 openssl,如何测试 SSLv3 连接呢?
更新:机器不面向互联网
答案1
如果nmap
在您的系统上可用。假设您将针对端口 443 检查 SSLv3,您可以使用nmap
以下选项:
nmap --script ssl-enum-ciphers -p 443 <hostname/IP> | grep SSLv3
如果grep
不返回任何内容,则意味着 SSLv3 协议已禁用,如果返回某些内容(它将返回支持的协议和使用的密码),则意味着目标主机上仍启用 SSLv3。
查看这看看 ssl-enum-ciphers 做了什么。
如果 SSLv3 我
答案2
我会推荐 wget
或者curl
,您可能已经拥有其中一项或两项:
wget --secure-protocol=SSLv3 https://zmap.io/
curl --sslv3 https://zmap.io/
或以其他方式socat
:
socat stdio openssl-connect:zmap.io:443,method=sslv3
socat
需要 OpenSSL 的 libssl 和 libcrypto 来支持 SSL,wget
并且curl
需要 OpenSSL 或 GnuTLS。 zmap.io 是一个禁用 SSLv3 的安全相关网站,
否则,在紧要关头你可以这样做bash
(并暂时搁置怀疑)。获取最小的 SSlv3“client hello”,并将其以二进制形式写入文件:
( echo 16 03 00 00 49
echo 01 00 00 45 03 00 54 46 2c 8b a0 70 ac c5 9f 96
echo 60 b9 d0 97 af a5 95 c4 41 3b fa 49 dc cd eb 63
echo df df cf 66 95 29 00 00 1e 00 39 00 38 00 35 00
echo 16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
echo 15 00 12 00 09 00 ff 01 00 ) | xxd -r -p > ssl3.bin
那么就很简单(!):
$ exec 4<> /dev/tcp/zmap.io/443
$ cat ssl3.bin >&4
$ hexdump -C <&4
00000000 15 03 00 00 02 02 28 |......(|
这里重要的字节是前导 0x15(SSL 警报记录)和 0x28,握手失败。如果连接有效,您应该取回第一个字节 0x16(SSL 握手记录)和包含证书等的大块。您可以在此处使用任何主机名或 IP 地址,即/dev/tcp/hostname/port/
。
您可以使用以下方法从另一台具有 OpenSSL 的计算机上创建自己的握手s_client
。
echo Q | openssl s_client -ssl3 -msg -debug -cipher 'DEFAULT:!EXPORT' \
-connect www.google.com:443 >debug.log
主要要求是您connect
的主机将接受连接。没有神经网络研究所在这里,因此我们捕获的有效负载可用于测试任何服务器(尽管如果强制执行严格的 SNI,服务器可能会拒绝连接,但未为 SSlv3 定义 SNI)。
$ head -15 debug.log
CONNECTED(00000003)
write to 0x80c6ed0 [0x80d0c88] (78 bytes => 78 (0x4E))
0000 - 16 03 00 00 49 01 00 00-45 03 00 54 46 2c 8b a0 ....I...E..TF,..
[...]
>>> SSL 3.0 Handshake [length 0049], ClientHello
01 00 00 45 03 00 54 46 2c 8b a0 70 ac c5 9f 96
60 b9 d0 97 af a5 95 c4 41 3b fa 49 dc cd eb 63
df df cf 66 95 29 00 00 1e 00 39 00 38 00 35 00
16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
15 00 12 00 09 00 ff 01 00
read from 0x80c6ed0 [0x80cc478] (5 bytes => 5 (0x5))
-msg
(使用代替的输出-debug
更简洁,但它省略了 SSL 记录的前 5 个字节,并且-debug
毫无帮助地砍掉了重要的尾部 0 字节,因此我们需要同时使用两者。)
取出以 0000 开头的行上的前 5 个字节的十六进制(这是下一个十六进制块省略的 SSL 记录头),然后取出“SSL 3.0 Handshake”行之后的整个十六进制块,并将该批次转换为xxd
如上所述使用二进制文件。
这里唯一的变量是随机数的前 4 个字节(记录的八位字节 11-14)将是客户端时间戳。这可以被足够偏执的服务器检测到,但在 SSLv3 中客户端时钟不需要正确(甚至在 TLS 1.2 及之前的版本中也不行)。