引言
Nikto 是一个流行的开源 Web 服务器扫描器,它针对 Web 服务器进行全面的测试,检查超过 6700 个潜在危险文件/程序,检查超过 1250 个服务器的过时版本,以及超过 270 个服务器的版本特定问题。
一种常见的 Web 服务器配置是虚拟主机(virtual hosting),即一台具有单个 IP 地址的服务器托管多个网站(例如 site1.example.com 和 site2.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.io 和 site2.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 Host 是 site2.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
将此输出与上一步的扫描进行比较。你将注意到两个关键区别:
Target Hostname现在是localhost(或127.0.0.1),这是服务器的默认值。+ /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 应用程序都经过彻底测试,而不仅仅是默认的那个。


