使用 Nmap 检测 SSL 证书

NmapNmapBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 Nmap 的 ssl-cert 脚本检测 SSL 证书。本实验将指导你扫描 IP 地址和域名,以检索并显示 SSL/TLS 证书信息,包括主题、颁发者和有效期。

你将在 Xfce 终端中执行诸如 nmap --script ssl-cert 192.168.1.1nmap --script ssl-cert scanme.nmap.org 之类的命令,探索指定端口、增加详细程度以及将结果保存到文件的选项。最后,你将查看证书详细信息并将其与服务检测结果进行比较。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/output_formats("Output Formats") nmap/NmapGroup -.-> nmap/save_output("Save Output to File") nmap/NmapGroup -.-> nmap/port_scanning("Port Scanning Methods") nmap/NmapGroup -.-> nmap/target_specification("Target Specification") nmap/NmapGroup -.-> nmap/verbosity("Verbosity Levels") nmap/NmapGroup -.-> nmap/service_detection("Service Detection") nmap/NmapGroup -.-> nmap/scripting_basics("Scripting Engine Basics") nmap/NmapGroup -.-> nmap/script_management("Script Categories and Updating") subgraph Lab Skills nmap/output_formats -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/save_output -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/port_scanning -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/target_specification -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/verbosity -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/service_detection -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/scripting_basics -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} nmap/script_management -.-> lab-547096{{"使用 Nmap 检测 SSL 证书"}} end

使用 nmap --script ssl-cert 192.168.1.1 运行 SSL 证书扫描

在本步骤中,我们将使用 Nmap 对指定的 IP 地址执行 SSL 证书扫描。Nmap 是一个强大的网络扫描工具,其脚本引擎使我们能够扩展其功能。ssl-cert 脚本旨在从目标服务器检索并显示有关 SSL/TLS 证书的信息。

首先,让我们了解一下基本的命令结构:

nmap --script ssl-cert <目标 IP>

这里,<目标 IP> 是你要扫描的服务器的 IP 地址。在这种情况下,我们将扫描 IP 地址 192.168.1.1

现在,打开你的 Xfce 终端。确保你在 ~/project 目录中。如果不在,使用 cd 命令导航到该目录:

cd ~/project

接下来,执行以下命令以运行 SSL 证书扫描:

sudo nmap --script ssl-cert 192.168.1.1

系统可能会提示你输入密码。由于 labex 用户具有无密码的 sudo 权限,只需按回车键即可。

注意192.168.1.1 是一个私有 IP 地址,根据你当前的网络配置可能无法访问。如果你在该地址没有服务器,扫描可能不会返回任何结果或可能超时。出于测试目的,你可以使用你知道具有 SSL 证书的公共 IP 地址,例如 scanme.nmap.org8.8.8.8

让我们尝试改为扫描 scanme.nmap.org

sudo nmap --script ssl-cert scanme.nmap.org

此命令将尝试连接到 scanme.nmap.org 并检索其 SSL 证书信息。输出将显示诸如证书主题、颁发者、有效期以及任何主题备用名称 (SAN) 等详细信息。

示例输出(实际输出会有所不同):

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:00 UTC
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.031s latency).
Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f

PORT   STATE SERVICE
22/tcp open  ssh
| ssl-cert: Subject: commonName=scanme.nmap.org
| Issuer: commonName=Let's Encrypt Authority X3
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-03-18T14:23:03+00:00
| Not valid after:  2020-06-16T14:23:03+00:00
| MD5:   ...
| SHA1:  ...
| -----BEGIN CERTIFICATE-----
| ...
| -----END CERTIFICATE-----

Nmap done: 1 IP address (1 host up) scanned in 2.18 seconds

此输出显示了 scanme.nmap.org 的 SSL 证书详细信息,包括主题、颁发者和有效期。

使用 nmap --script ssl-cert -p 443 127.0.0.1 扫描端口 443

在本步骤中,我们将重点使用 Nmap 和 ssl-cert 脚本扫描特定端口 443。端口 443 是用于 HTTPS(超文本传输协议安全)流量的标准端口,用于通过互联网进行安全通信。通过指定端口,我们可以缩小扫描范围,并专门获取在该端口上运行的服务的 SSL 证书信息。

我们将使用的命令是:

nmap --script ssl-cert -p 443 127.0.0.1

让我们来分析一下这个命令:

  • nmap:Nmap 命令行扫描器。
  • --script ssl-cert:指定我们要使用 ssl-cert 脚本检索 SSL 证书信息。
  • -p 443:此选项告诉 Nmap 仅扫描端口 443。
  • 127.0.0.1:这是回环地址,也称为本地主机。它指的是你自己的机器。

现在,打开你的 Xfce 终端,并确保你在 ~/project 目录中:

cd ~/project

执行以下命令以扫描本地主机上的端口 443:

sudo nmap --script ssl-cert -p 443 127.0.0.1

由于 127.0.0.1 指的是你自己的机器,此命令将尝试从你的 LabEx 虚拟机上在端口 443 上运行的任何服务中检索 SSL 证书。如果没有服务在端口 443 上监听,Nmap 将报告该端口已关闭。

如果你在 LabEx 虚拟机上配置了使用 HTTPS 的 Web 服务器或其他服务,你应该会看到类似于以下的输出(实际输出将根据证书和服务器配置而有所不同):

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).

PORT    STATE SERVICE
443/tcp closed https

Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds

在此示例中,输出显示端口 443 已关闭。这意味着在本地主机上没有服务在该端口上监听。如果有服务正在运行,输出将包括 SSL 证书详细信息,类似于上一步。

如果你想针对你知道在端口 443 上启用了 HTTPS 的服务器测试此命令,你可以将 127.0.0.1 替换为该服务器的 IP 地址或域名。例如:

sudo nmap --script ssl-cert -p 443 scanme.nmap.org

这将扫描 scanme.nmap.org 上的端口 443 并检索其 SSL 证书信息。

使用 nmap -v --script ssl-cert 192.168.1.1 添加详细输出

在本步骤中,我们将为 Nmap 命令添加详细输出。Nmap 中的详细输出意味着在扫描过程中增加显示的信息量。这有助于理解 Nmap 正在做什么以及排查任何问题。-v 选项会增加详细程度。多次使用 -v(例如 -vv-vvv)会进一步增加详细程度。

我们将使用的命令是:

nmap -v --script ssl-cert 192.168.1.1

让我们来分析一下这个命令:

  • nmap:Nmap 命令行扫描器。
  • -v:此选项增加详细程度,提供更详细的输出。
  • --script ssl-cert:指定我们要使用 ssl-cert 脚本检索 SSL 证书信息。
  • 192.168.1.1:这是目标 IP 地址。

现在,打开你的 Xfce 终端,并确保你在 ~/project 目录中:

cd ~/project

执行以下命令以运行带有详细输出的 SSL 证书扫描:

sudo nmap -v --script ssl-cert 192.168.1.1

如前所述,192.168.1.1 是一个私有 IP 地址,可能无法访问。如果你在该地址没有服务器,扫描可能不会返回任何结果或可能超时。出于测试目的,你可以使用你知道具有 SSL 证书的公共 IP 地址,例如 scanme.nmap.org

让我们尝试使用详细输出扫描 scanme.nmap.org

sudo nmap -v --script ssl-cert scanme.nmap.org

现在输出将包括有关扫描过程的更多信息,例如 Nmap 经历的不同阶段、它正在探测的端口以及发生的任何错误或警告。

示例输出(实际输出会有所不同):

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:00 UTC
NSE: Loaded 1 script for scanning.
Initiating Ping Scan at 10:00
Scanning scanme.nmap.org (45.33.32.156) [2 ports]
Completed Ping Scan at 10:00, 0.03s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 10:00
Completed Parallel DNS resolution of 1 host. at 10:00, 0.01s elapsed
Initiating Connect Scan at 10:00
Scanning scanme.nmap.org (45.33.32.156) [1000 ports]
Discovered open port 22/tcp on 45.33.32.156
Completed Connect Scan at 10:00, 2.15s elapsed (1000 total ports)
NSE: Script scanning scanme.nmap.org (45.33.32.156)
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 10:00
Completed NSE at 10:00, 0.02s elapsed
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.031s latency).
Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f

PORT   STATE SERVICE
22/tcp open  ssh
| ssl-cert: Subject: commonName=scanme.nmap.org
| Issuer: commonName=Let's Encrypt Authority X3
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-03-18T14:23:03+00:00
| Not valid after:  2020-06-16T14:23:03+00:00
| MD5:   ...
| SHA1:  ...
| -----BEGIN CERTIFICATE-----
| ...
| -----END CERTIFICATE-----

NSE: Script Post-scanning.
Initiating NSE at 10:00
Completed NSE at 10:00, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.34 seconds

注意有关扫描过程的其他信息,例如“Initiating Ping Scan”(发起 Ping 扫描)、“Completed Connect Scan”(完成连接扫描)和“NSE: Script scanning”(NSE:脚本扫描)。这些额外的细节对于理解 Nmap 的工作方式以及诊断任何问题可能会很有用。

使用 nmap --script ssl-cert -oN ssl.txt 127.0.0.1 保存 SSL 结果

在本步骤中,我们将学习如何将 Nmap 扫描的结果保存到文件中。这对于后续分析或与他人共享结果很有用。Nmap 提供了几种以不同格式保存输出的选项。-oN 选项以“正常”的人类可读格式保存输出。

我们将使用的命令是:

nmap --script ssl-cert -oN ssl.txt 127.0.0.1

让我们来分析一下这个命令:

  • nmap:Nmap 命令行扫描器。
  • --script ssl-cert:指定我们要使用 ssl-cert 脚本检索 SSL 证书信息。
  • -oN ssl.txt:此选项告诉 Nmap 将输出以正常格式保存到名为 ssl.txt 的文件中。
  • 127.0.0.1:这是目标 IP 地址(本地主机)。

现在,打开你的 Xfce 终端,并确保你在 ~/project 目录中:

cd ~/project

执行以下命令以运行 SSL 证书扫描并将结果保存到 ssl.txt

sudo nmap --script ssl-cert -oN ssl.txt 127.0.0.1

扫描完成后,你将在 ~/project 目录中找到一个名为 ssl.txt 的文件。此文件包含 Nmap 扫描的输出,包括目标的 SSL 证书信息(如果有)。

要验证文件是否已创建并包含扫描结果,你可以使用 cat 命令显示文件内容:

cat ssl.txt

如果在 127.0.0.1 上运行了带有 SSL 证书的服务,你将在输出中看到证书详细信息。如果没有服务运行,文件将包含有关扫描的信息,但没有证书详细信息。

例如,如果端口 443 已关闭,ssl.txt 文件可能包含:

## Nmap 7.80 scan initiated Tue Oct 27 10:00:00 2023
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
PORT    STATE SERVICE
443/tcp closed https
## Nmap done at Tue Oct 27 10:00:00 2023 -- 1 IP address (1 host up) scanned in 0.07 seconds

如果你想扫描不同的目标并保存结果,只需将 127.0.0.1 替换为所需的 IP 地址或域名。例如:

sudo nmap --script ssl-cert -oN ssl.txt scanme.nmap.org

这将扫描 scanme.nmap.org 并将结果保存到 ssl.txt。记得使用 cat ssl.txt 检查 ssl.txt 的内容以确认扫描结果。

在 Xfce 终端中查看证书详细信息

在本步骤中,我们将查看上一步中保存在 ssl.txt 文件里的 SSL 证书详细信息。我们会使用 cat 命令在 Xfce 终端中显示文件内容,然后检查证书信息。

首先,确保你在 ~/project 目录中:

cd ~/project

现在,使用 cat 命令显示 ssl.txt 文件的内容:

cat ssl.txt

输出将显示 Nmap 扫描结果,若在目标上找到带有 SSL 证书的服务,还会包括 SSL 证书详细信息。

让我们来分析一下输出。SSL 证书信息的重要部分通常包括:

  • 主题:此字段包含证书所颁发给的域名或实体。在主题字段中查找 通用名称(CN)属性。
  • 颁发者:此字段标识颁发证书的证书颁发机构(CA)。同样,查找 通用名称(CN)属性。
  • 公钥类型:指示所使用的公钥算法类型(例如,RSA、DSA、ECDSA)。
  • 公钥位数:指定密钥大小(例如,2048、4096)。较大的密钥大小通常提供更强的安全性。
  • 签名算法:指示用于签署证书的算法(例如,sha256WithRSAEncryption)。
  • 有效期开始:证书开始有效的日期和时间。
  • 有效期结束:证书过期的日期和时间。确保证书未过期至关重要。
  • MD5/SHA1:这些是证书的哈希值。虽然 MD5 被认为安全性较弱,但 SHA1 也正在逐步淘汰。首选 SHA256 或更高版本。
  • -----BEGIN CERTIFICATE-----... -----END CERTIFICATE-----:这是以 PEM 格式编码的实际证书数据。

例如,如果你扫描了 scanme.nmap.org 并将输出保存到 ssl.txt,输出的相关部分可能如下所示:

PORT   STATE SERVICE
22/tcp open  ssh
| ssl-cert: Subject: commonName=scanme.nmap.org
| Issuer: commonName=Let's Encrypt Authority X3
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-03-18T14:23:03+00:00
| Not valid after:  2020-06-16T14:23:03+00:00
| MD5:   ...
| SHA1:  ...
| -----BEGIN CERTIFICATE-----
| ...
| -----END CERTIFICATE-----

在此示例中,你可以看到该证书是针对 scanme.nmap.org 的,由 Let's Encrypt Authority X3 颁发,使用 2048 位的 RSA 密钥,并使用 SHA256 进行签名。

通过查看这些详细信息,你可以深入了解目标服务所使用的 SSL 证书的安全性和有效性。

如果你扫描了 127.0.0.1 且没有运行 SSL 服务,ssl.txt 文件将不包含详细的证书信息。在这种情况下,你可能需要安装一个启用了 SSL 的简单 Web 服务器(不在本实验范围内)来生成证书进行测试。

在 Xfce 终端中与服务检测结果进行比较

在本步骤中,我们将把通过 Nmap 获取的 SSL 证书信息与它的服务检测功能进行比较。这能让我们验证检测到的服务是否与证书详细信息匹配,并找出任何潜在的差异。

首先,让我们对目标运行一次标准的 Nmap 服务检测扫描。在这个例子中,我们将使用 127.0.0.1 作为目标。确保你在 ~/project 目录中:

cd ~/project

执行以下命令:

sudo nmap -sV 127.0.0.1

-sV 选项启用服务版本检测。Nmap 将尝试确定在每个开放端口上运行的服务。

输出将显示开放端口和检测到的服务。例如:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:30 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000058s latency).
Not shown: 999 closed ports
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (protocol 2.0)
443/tcp open  ssl/http  ## 示例:如果运行着一个带有 SSL 的 Web 服务器

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 5.23 seconds

现在,将服务检测结果与你在上一步中查看的 SSL 证书详细信息(来自 ssl.txt 文件)进行比较。

例如,如果 Nmap 的服务检测将端口 443 识别为运行 ssl/http,并且 SSL 证书的主题 通用名称 与 Web 服务器关联的域名匹配,那么服务检测和证书详细信息就是一致的。

然而,如果存在不匹配的情况,可能表明存在潜在问题:

  • 服务识别错误:Nmap 可能错误地识别了在某个端口上运行的服务。
  • 证书配置错误:证书可能是为与所提供服务不同的域名颁发的。
  • 中间人攻击:攻击者可能正在拦截连接并呈现不同的证书。

为了进一步调查差异,你可以使用更具体的 Nmap 脚本或像 openssl 这样的工具直接检查证书。

例如,如果服务检测显示端口 443 上运行 http,但 SSL 证书是针对不同的域名,这就是一个危险信号。这可能表明配置错误或潜在的攻击。

总之,将 Nmap 的服务检测与 SSL 证书详细信息进行比较有助于你验证目标上运行的服务的完整性和安全性。

总结

在本实验中,我们使用了带有 ssl-cert 脚本的 Nmap 来扫描并从目标服务器检索 SSL/TLS 证书信息。我们学习了如何执行基本命令 nmap --script ssl-cert <目标IP> 来扫描特定的 IP 地址,并且通过使用像 scanme.nmap.org 这样的公共地址进行测试,解决了私有 IP 地址的相关问题。

我们还练习了使用 sudo 运行扫描,并观察输出,其中包括证书的主题、颁发者和有效期等详细信息。这为进一步探索 Nmap 在 SSL 证书分析方面的功能奠定了基础。