实现原理是利用TLS协议的特点和握手过程来进行测试和解析响应来确定目标服务器支持哪些TLS协议和密码套件。
在TLS握手过程中,客户端和服务器会协商并使用相同的TLS协议版本和密码套件来进行通信。通过发送特定的握手请求并分析响应,可以确定目标服务器所支持的TLS协议和密码套件等信息。
使用namp工具快速确定目标服务器支持哪些协议和密码套件
在Linux下,可以使用nmap工具来快速确定目标服务器支持哪些TLS协议和密码套件。具体实现如下:
安装nmap工具:首先需要在Linux系统上安装nmap工具。可以通过包管理器(如apt、yum等)进行安装,或者从官方网站下载并编译安装。
运行nmap扫描:使用以下命令运行nmap扫描,以获取目标服务器支持的TLS协议和密码套件信息:
nmap --script ssl-enum-ciphers -p 443 <目标IP地址>
其中,--script ssl-enum-ciphers
表示使用ssl-enum-ciphers脚本,该脚本可以列出目标服务器支持的TLS协议和密码套件;-p 443
表示只扫描目标服务器的443端口(HTTPS默认端口);<目标IP地址>
是目标服务器的IP地址。
nmap扫描完成后,会输出目标服务器支持的TLS协议和密码套件信息。可以根据需要对结果进行分析和处理。
sslcan工具快速定位目标服务器支持哪些协议和密码套件
sslscan工具的主要工作原理是:通过创建多个HTTPS连接来试探服务器支持的加密方式。当使用HTTPS连接到服务器时,会交换双方所支持的加密方式,之后选择双方都能够支持的方式进行通信。
在这个过程中,如果https服务器配置不当,就会存在MITM(中间人)攻击的风险,攻击者可能利用客户端支持的较弱加密算法来欺骗服务器。例如,如果使用的是SSLV2的56位DES加密方式,那么一旦攻击者成功拦截并使用了这种加密流量,他们可能在很短的时间内就能够破解加密密钥。
此外,值得注意的是,sslscan还具有检测heartbleed漏洞的功能。Heartbleed是一个出现在OpenSSL TSL中的安全漏洞,它源于一个缓冲区的错误处理,这个错误处理允许从内存中读取数据。所以,除了探测服务器支持的协议和密码套件外,sslscan还能帮助发现并防备一些潜在的安全风险。
运行sslcan扫描:使用以下命令运行sslcan扫描,以获取目标服务器支持的协议和密码套件信息:
sslscan -h <目标IP地址>
其中,-h
表示使用HTTP方式进行扫描;<目标IP地址>
是目标服务器的IP地址。sslcan扫描完成后,会输出目标服务器支持的协议和密码套件信息。可以根据需要对结果进行分析和处理。
openssl ciphers密码套件
可以使用OpenSSL工具来查看Linux系统支持的TLS密码套件列表:
openssl ciphers -V | column -t
将显示您的Linux系统支持的所有TLS密码套件的列表
运行openssl扫描:使用以下命令运行openssl扫描,以获取目标服务器支持的协议和密码套件信息:
openssl s_client -connect <目标IP地址>:443 -cipher <密码套件>
其中,-connect <目标IP地址>:443
表示连接到目标服务器的443端口;-cipher <密码套件>
表示指定要测试的密码套件。
客户端和服务器不支持SSL协议或密码套件,会怎么样?
如果客户端和服务器不支持SSL协议或密码套件,可能会导致通信过程中数据的安全性受到威胁。在这种情况下,应该考虑以下解决方案:
升级客户端和服务器端的软件版本,以确保它们支持最新的SSL协议和密码套件。
如果无法立即升级软件版本,可以考虑使用其他加密协议,如TLS(传输层安全性)来替代SSL协议。
对于服务器端,可以考虑配置SSL证书和相应的密码套件,以确保通信过程中的数据安全。
对于客户端,可以考虑配置相应的安全选项,确保能够与服务器端建立安全的连接。
如果以上方法都无法解决问题,建议寻求专业的网络安全团队或厂商的帮助,以确保客户端和服务器的通信安全。
Linux下快速确定目标服务器支持哪些协议和密码套件(shell脚本实现)
#!/bin/bash
...
TLS_VERSIONS_WITH_CIPHER=(ssl2 ssl3 tls1 tls1_1 tls1_2)
TLS_VERSIONS_WITH_CIPHERSUITES=(tls1_3)
# 删除`openssl的本地副本不支持的旧TLS版本`
for (( i=${#TLS_VERSIONS_WITH_CIPHER[@]}-1; i>=0; i-- )); do
if ! grep -qxF -- "-${TLS_VERSIONS_WITH_CIPHER[$i]}" <(openssl s_client -help 2>&1 | awk '{print $1}'); then
unset "TLS_VERSIONS_WITH_CIPHER[$i]"
fi
done
# TLS_VERSIONS_WITH_CIPHERSUITES创建反向查找数组
...
# 查找任何密码{,suite}名称的最大长度
MAX_NAME_LEN=$(openssl ciphers ALL:COMPLEMENTOFALL | tr ':' '\n' | wc -L)
printf "%*s" $((MAX_NAME_LEN - 2)) ""
for tlsv in "${TLS_VERSIONS_WITH_CIPHER[@]}" "${TLS_VERSIONS_WITH_CIPHERSUITES[@]}"; do
printf "%10s" "$tlsv"
done
echo
for cipher in $(openssl ciphers 'ALL:COMPLEMENTOFALL' | sed 's/:/ /g'); do
#for cipher in $(openssl ciphers 'RSA-PSK-AES256-GCM-SHA384' | sed 's/:/ /g'); do
tput sc
found=0
printf "%*s" "$MAX_NAME_LEN" "$cipher"
if ! openssl ciphers "$cipher" >/dev/null 2>/dev/null; then
...
else
cipherarg=("-cipher" "$cipher")
APPLICABLE_TLS_VERSIONS=("${TLS_VERSIONS_WITH_CIPHER[@]}")
fi
for tlsv in "${APPLICABLE_TLS_VERSIONS[@]}"; do
if [ "${TLS_VERSIONS_WITHOUT_CIPHERS+0}" = 1 ]; then
rv=-1
else
...
rv=$?
fi
printf "%5s%1s%4s" "" "$([ $rv -eq 0 ] && echo "√" || :)" ""
[ $rv -eq 0 ] && found=1
done
if [ $found -eq 0 ]
then tput rc
else echo
fi
done
printf "%78s" " "
tput rc
If you need the complete source code, please add the WeChat number (c17865354792)
总结
对目标服务器开放的端口进行详细扫描,以确定使用的协议。例如,通过连接到80端口可以确定使用HTTP协议,通过连接到443端口可以确定使用HTTPS协议。对HTTPS协议的端口进行进一步扫描,以确定服务器支持的密码套件。可以使用工具如sslscan或openssl s_client,通过连接到目标服务器的443端口,并通过协商SSL/TLS握手过程来获取支持的密码套件列表。
主要通过发送网络请求并解析服务器响应来获取目标服务器开放的端口和服务信息,再通过SSL/TLS握手获取服务器支持的密码套件列表。
Welcome to follow WeChat official account【程序猿编码】