使用 Nikto 扫描启用 SSL 或 TLS 的网站

Kali LinuxBeginner
立即练习

引言

Nikto 是一个流行的开源 Web 服务器扫描器,它针对 Web 服务器进行全面的测试,检查超过 6700 个潜在危险文件/程序,检查超过 1250 个服务器的过时版本,以及超过 270 个服务器的版本特定问题。

虽然 Nikto 可以轻松扫描标准的 HTTP 网站,但扫描使用 SSL/TLS (HTTPS) 的网站需要一个特定的选项。在本实验中,你将学习如何使用 Nikto 扫描启用了 SSL/TLS 的网站。我们将使用一个本地托管的安全 Web 服务器进行测试。你将学习如何发起 SSL 扫描,将其指向特定端口,并解读扫描结果中的 SSL 相关信息。

识别 HTTPS 目标网站

在此步骤中,我们将确认我们的目标安全 Web 服务器正在运行且可访问。本实验的设置脚本已启动一个简单的 Python Web 服务器,该服务器使用 SSL/TLS。它正在 localhost4433 端口上监听。

为了验证服务器是否正在运行,我们可以使用 curl 命令。由于我们的服务器使用自签名证书(未被证书颁发机构信任),我们必须在 curl 中使用 -k--insecure 标志,告知它在证书不受信任的情况下继续进行。

在你的终端中执行以下命令:

curl -k https://localhost:4433

你应该会看到服务器主页的 HTML 内容,这证实了服务器正在运行并通过 HTTPS 提供内容。

<html><body><h1>Welcome to the Secure Test Server!</h1></body></html>

现在我们已经确认了目标正在运行,可以继续对其进行扫描了。

使用 -ssl 标志启用 SSL 模式

在此步骤中,我们将了解为什么 -ssl 标志对于扫描 HTTPS 网站至关重要。默认情况下,Nikto 会尝试在端口 80 上通过标准 HTTP 扫描目标。如果你将它指向一个需要 SSL/TLS 连接的端口,而没有指定使用 SSL,扫描将会失败,因为初始通信握手是错误的。

让我们尝试在不带 -ssl 标志的情况下,针对我们位于端口 4433 的安全服务器运行 Nikto,以观察这种行为。

nikto -h localhost -p 4433

你将看到一个指示未找到 Web 服务器的输出,或者你可能会看到一条错误消息。这是因为 Nikto 正在尝试与一个监听 HTTPS 的端口进行 HTTP 通信。

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        4433
---------------------------------------------------------------------------
+ Start Time:         ...
---------------------------------------------------------------------------
+ ERROR: No web server found on localhost:4433
---------------------------------------------------------------------------
+ 0 host(s) tested

这证明了 -ssl 标志的必要性。此标志明确告诉 Nikto 将其 Web 请求封装在 SSL/TLS 层中,使其能够与安全服务器进行通信。在下一步中,我们将使用此标志执行正确的扫描。

对 HTTPS 目标运行扫描

在此步骤中,你将使用 -ssl 标志对我们的安全 Web 服务器执行正确的漏洞扫描。通过组合 -h (host)、-p (port) 和 -ssl 标志,我们可以指示 Nikto 连接到正确的主机和端口,并使用 SSL/TLS 连接。

在你的终端中运行以下命令以启动扫描:

nikto -h localhost -p 4433 -ssl

Nikto 现在将开始扫描。由于我们的服务器正在使用自签名证书,Nikto 很可能会显示关于证书颁发者不受信任的警告,这在此情况下是符合预期的。然后扫描将继续进行。

输出将类似于:

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        4433
+ SSL Info:           Self-signed certificate.
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server:             SimpleHTTP/0.6 Python/3.10.12
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
...
+ 1 host(s) tested

你现在已经成功使用 Nikto 扫描了一个启用了 SSL 的网站。

观察输出中的 SSL 特定检查

在此步骤中,我们将分析先前扫描的输出,以识别与 SSL/TLS 连接特定的信息。当使用 -ssl 标志时,Nikto 不仅扫描通用的 Web 漏洞,还会提供服务器 SSL/TLS 证书和配置的详细信息。

如果你滚动回看上一步命令的输出,你会找到与 SSL 证书相关的信息。为了隔离这些信息,你可以重新运行扫描并使用 grep 来过滤输出。让我们搜索证书的 "Subject" 行。

nikto -h localhost -p 4433 -ssl | grep "Subject"

此命令将再次运行扫描,但只显示包含 "Subject" 一词的行。

+ Subject: C=US, ST=California, L=MountainView, O=LabEx, OU=IT, CN=localhost

此行显示了服务器 SSL 证书中嵌入的详细信息,例如国家 (C)、州 (ST) 和通用名称 (CN)。在安全评估期间,这些信息对于验证服务器的身份非常有用。Nikto 还会检查密码套件信息和其他 SSL 相关漏洞,从而提供对安全服务器配置更完整的了解。

在非标准端口上强制 SSL 模式

在此步骤中,我们将探讨如何“强制”Nikto 在任何端口上使用 SSL,即使是通常处理未加密流量的端口。这对于识别可能在非标准端口(如 8080)上运行 HTTPS 的配置错误的服务器非常有用。

首先,我们需要停止现有服务器,并在端口 8080 上启动一个新的服务器。

## Stop the previous server
pkill -f "python3 /home/labex/project/https_server/server.py"

## Create a new server configuration for port 8080
cat << EOF > /home/labex/project/https_server/server_8080.py
import http.server
import ssl
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
server_address = ('0.0.0.0', 8080)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='cert.pem',
                               keyfile='key.pem',
                               ssl_version=ssl.PROTOCOL_TLS)
httpd.serve_forever()
EOF

## Start the new server in the background and wait a moment
python3 /home/labex/project/https_server/server_8080.py &> /dev/null &
sleep 3

现在,我们的安全服务器正在端口 8080 上运行。如果没有 -ssl 标志,Nikto 会假定这是一个标准的 HTTP 端口。通过包含 -ssl,我们强制它启动一个 TLS 握手。

对端口 8080 运行扫描:

nikto -h localhost -p 8080 -ssl

输出将与之前的扫描类似,确认 Nikto 已成功使用 SSL/TLS 连接到非标准端口并执行了其测试。

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        8080
+ SSL Info:           Self-signed certificate.
...

这证实了你能够使用 Nikto 扫描任何任意端口上的 SSL/TLS 服务。

总结

在本实验中,你学习了使用 Nikto 扫描启用 SSL/TLS 的网站的基本过程。你首先识别并验证了一个目标 HTTPS 服务器。然后,你亲眼看到了为什么仅仅将 Nikto 指向 HTTPS 端口会失败,并了解到需要使用 -ssl 标志来启用 SSL/TLS 通信。

你成功地对一个安全服务器执行了扫描,分析了输出中的 SSL 特定信息(如证书详情),最后,你学会了如何在非标准端口上强制 SSL 模式。这项技能对于对依赖 HTTPS 来保障安全的现代 Web 应用程序进行彻底的安全评估至关重要。