在 Linux 系统中,对于给定的 IP 范围,我需要检查每个开放端口以查看是否正在使用 SSL 证书。例如,我想检查地址范围 192.168.22.0/24 上的端口 1 - 9999。如果开放端口正在使用 SSL 证书,我想检索 CN 名称、到期日期等... 我发现了很多工具可以检查常用端口(如 443 或 8443),但我需要查找非标准端口上使用的 SSL 证书。任何工具建议或意见都值得赞赏。谢谢。
答案1
从技术上讲,如果服务器使用 SNI,你将无法提取全部证书,因为您需要在 SSL 协商期间(在客户端 hello 上)指定每个主机名。
不指定主机名会向您发送默认站点,但您将无法知道它托管的其他站点,因为反向 DNS 不是很可靠。
此脚本将花费一些时间,因为它将达到默认openssl
超时时间,但将获取服务器的每个“默认”证书的日期、颁发者和主题(最后是找到证书的端口)。将其放在另一个循环中以执行 IP 范围,但将需要很长时间才能完成。
for (( i=1; i<10000; i++ )) ; do openssl s_client -connect SITENAME:$i </dev/null 2>/dev/null | awk 'BEGIN {a=0} /BEGIN CERT/ {a=1} (a>0) {print} /END CERT/ {a=0}' | openssl x509 -noout -subject -issuer -dates 2>/dev/null && echo On port $i; done
答案2
按照惯例,应用程序在加密时会使用特定端口(例如 http 为 80,https 为 443)。因此,您无需扫描所有端口,只需检查应用程序是否正在使用加密端口即可。如下所示:
nmap -sT -p 443 -oG – 192.168.1.0/24 | grep open
替换 443与您的应用程序用于加密通信的端口。此外,替换 192.168.1.0/24与您想要使用的目标规范一致。
要获取证书,你需要使用命令像这样:
openssl s_client -showcerts -connect host.host:9999 </dev/null
host.host:9999
用您想要的特定主机和端口替换。
如果您愿意,您可以在任何主机和端口组合上使用它,但如果您真的打算扫描 PC 上的所有端口,请准备好在每台机器上等待很长时间。如果您想对网络上的许多计算机执行此操作,则需要更多时间。 65k 是一个很大的数字,网络操作开始时很慢,但我怀疑这需要每个端口超时,因此散弹枪方法实际上根本不可行;您需要大大缩小要检查的端口池。