如果服务器上没有任何 openssl 软件包,如何检查服务器是否有 SSLv3 连接?

如果服务器上没有任何 openssl 软件包,如何检查服务器是否有 SSLv3 连接?
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 及之前的版本中也不行)。

您可以阅读更多有关SSL 记录格式在这里,还有这里注册密码

相关内容