使用 Nikto 扫描特定虚拟主机

Kali LinuxBeginner
立即练习

引言

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

一种常见的 Web 服务器配置是虚拟主机(virtual hosting),即一台具有单个 IP 地址的服务器托管多个网站(例如 site1.example.comsite2.example.com)。当你直接扫描服务器的 IP 地址时,像 Nikto 这样的扫描器可能只会测试服务器上配置的 默认 网站,而完全忽略其他网站。

在本实验(lab)中,你将学习如何使用 Nikto 的 -vhost 选项来专门定位服务器上的某个虚拟主机,以确保你的扫描准确且有针对性。

识别在一台 IP 上托管多个网站的服务器

在本步骤中,你将验证我们环境中 Web 服务器在同一 IP 地址(127.0.0.1)上托管了两个不同的网站。我们可以通过使用 curl 命令发送带有不同 Host 标头的 HTTP 请求来做到这一点。Host 标头告诉 Web 服务器客户端想要访问哪个网站。

首先,让我们发送一个请求到 site1.labex.io--header "Host: site1.labex.io" 选项告诉 curl 发送指定的 host 标头。

curl --header "Host: site1.labex.io" http://127.0.0.1

你应该会看到第一个网站的 HTML 内容:

<html><body><h1>Welcome to Site 1</h1></body></html>

接下来,让我们通过更改 Host 标头来发送一个请求到 site2.labex.io

curl --header "Host: site2.labex.io" http://127.0.0.1

这次,你将看到第二个网站的内容:

<html><body><h1>This is Site 2</h1><p>This site has a test.txt file.</p></body></html>

这证实了我们位于 127.0.0.1 的服务器根据主机名提供不同的内容,这就是虚拟主机的定义。

查找特定目标虚拟主机的名称

在本步骤中,我们将确认我们本地服务器配置的名称。在实际场景中,你将使用侦察技术,如 DNS 枚举或分析 SSL 证书来查找虚拟主机。在本实验(lab)中,名称已在 /etc/hosts 文件中预先配置。操作系统使用此文件将名称映射到 IP 地址。

让我们使用 cat 命令检查 /etc/hosts 文件的内容,以查看映射关系。

cat /etc/hosts

输出将显示标准的 localhost 映射,以及我们为虚拟主机添加的两个自定义条目:

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 site1.labex.io
127.0.0.1 site2.labex.io

从此输出中,我们可以确认 site1.labex.iosite2.labex.io 是我们可以用于目标扫描的名称。在接下来的步骤中,我们将以 site2.labex.io 为目标。

使用 -vhost 选项指定目标主机名

在本步骤中,你将了解用于扫描特定虚拟主机的 Nikto 选项。默认情况下,nikto -h 127.0.0.1 会扫描配置的第一个虚拟主机(site1.labex.io)。要让 Nikto 扫描另一个虚拟主机,我们必须使用 -vhost(或 -host+)选项。

此选项指示 Nikto 在所有 HTTP 请求中使用提供的名称,以确保 Web 服务器将请求路由到正确的网站。

语法是:nikto -h <IP_ADDRESS> -vhost <HOSTNAME>

让我们做一个快速测试,而不是运行完整的扫描。我们可以使用 -Display V 选项来打印详细输出,这将向我们展示扫描的有效配置。我们将以 site2.labex.io 为目标。

nikto -h 127.0.0.1 -vhost site2.labex.io -Display V

输出将显示扫描配置的详细信息。查找 Host 标头值以确认其设置正确。

...
---------------------------------------------------------------------------
- Nikto 2.x
---------------------------------------------------------------------------
...
- Scan Options:
    ...
    Host -> 127.0.0.1
    ...
    VHost -> site2.labex.io
...
- Headers:
    ...
    Host: site2.labex.io
    ...
---------------------------------------------------------------------------
+ 1 host(s) to test

输出清楚地表明 Nikto 将在请求中使用 Host: site2.labex.io,这正是我们想要的。

使用 vhost 标志针对服务器 IP 执行扫描

现在你已经了解了 -vhost 选项的工作原理,是时候针对我们的目标虚拟主机 site2.labex.io 执行完整扫描了。

在你的终端中运行以下命令。扫描需要几分钟时间才能完成,因为 Nikto 会运行各种测试。

nikto -h 127.0.0.1 -vhost site2.labex.io

扫描开始后,你将看到类似以下的输出。请注意,输出显示 Target Hostsite2.labex.io,这证实我们正在扫描正确的虚拟主机。

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    site2.labex.io
+ Target Port:        80
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server: Apache/2.4.52 (Ubuntu)
+ 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
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ /test.txt: A text file was found.
+ 7 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time:           ...
+ 1 host(s) tested

请注意 + /test.txt: A text file was found. 这一行。该文件仅存在于 site2.labex.io 上,这进一步证实了我们的扫描目标是正确的。

确认结果特定于目标 vhost

在最后一步中,我们将执行另一次扫描,但这次 不带 -vhost 标志,以展示结果的差异。这将证明 -vhost 选项对于在虚拟主机环境中准确扫描特定站点至关重要。

针对服务器 IP 地址执行标准的 Nikto 扫描:

nikto -h 127.0.0.1

观察这次新扫描的输出。

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        80
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server: Apache/2.4.52 (Ubuntu)
...
(other findings)
...
+ End Time:           ...
+ 1 host(s) tested

将此输出与上一步的扫描进行比较。你将注意到两个关键区别:

  1. Target Hostname 现在是 localhost(或 127.0.0.1),这是服务器的默认值。
  2. + /test.txt: A text file was found. 的发现已丢失。这是因为 test.txt 不存在于默认站点(site1.labex.io)上,并且此扫描未将 site2.labex.io 作为目标。

此比较清楚地表明,没有 -vhost,你将会错过特定于 site2.labex.io 的漏洞和信息。

总结

在本实验中,你学习了一项关键的 Web 服务器漏洞扫描技术。你现在理解了什么是虚拟主机,以及为什么在安全评估期间需要对其进行特殊处理。

你练习了:

  • 使用带有自定义 Host 头的 curl 手动检查同一 IP 上的不同网站。
  • 识别 Nikto 的 -vhost 选项的目的。
  • 使用 nikto -h <IP> -vhost <HOSTNAME> 对特定虚拟主机执行目标扫描。
  • 比较目标扫描和默认扫描的结果,以理解此技术的重要性。

这项技能对于任何渗透测试人员或安全分析师来说都至关重要,以确保服务器上的所有 Web 应用程序都经过彻底测试,而不仅仅是默认的那个。