使用代理进行 Nikto 扫描

Kali LinuxBeginner
立即练习

引言

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

在此上下文中,代理(proxy)是一个位于你的工具(Nikto)和目标服务器之间的中间服务器。像 Burp Suite、OWASP ZAP 或 mitmproxy 等工具常用于此目的。通过代理路由 Nikto 的流量是安全专业人士的一项强大技术。它允许你确切地看到扫描器发送的请求以及接收到的响应。这对于调试扫描、理解扫描器的行为,甚至实时修改流量以绕过安全措施都非常有价值。

在本实验中,你将学习如何设置本地代理,配置 Nikto 使用它,运行扫描并分析截获的流量。我们将使用 mitmproxy 作为我们的代理,并使用一个简单的本地 Python Web 服务器作为我们的目标。

设置本地代理,如 Burp Suite 或 OWASP ZAP

在此步骤中,你将启动一个简单的 Web 服务器作为我们的扫描目标,然后启动 mitmproxy,一个轻量级的命令行代理,来拦截我们的流量。所有操作都将在终端中进行。

首先,让我们启动一个基本的 Python Web 服务器。该服务器将托管我们当前目录 ~/project 下的一个简单的 index.html 文件。我们将在后台的 8000 端口运行它,以便我们可以继续使用同一个终端。

执行以下命令:

python3 -m http.server 8000 &

命令末尾的 & 会将进程置于后台运行。你应该会看到一个指示进程 ID 的输出。

接下来,让我们启动我们的代理。我们将使用 mitmweb,这是 mitmproxy 的基于 Web 的界面。它提供了一种用户友好的方式来查看捕获的流量。它默认监听 8080 端口的代理流量,并在 8081 端口提供其 Web 界面。

运行以下命令在后台启动 mitmweb

mitmweb --web-host 0.0.0.0 &

你将看到一些 mitmweb 启动时的输出。现在你已经有一个在 8000 端口运行的目标服务器和一个在 8080 端口运行的代理。你可以通过在实验环境中打开浏览器并导航到 http://127.0.0.1:8081 来查看代理的流量。目前,它将是空的。

使用 -useproxy 配置 Nikto 以使用代理

在此步骤中,你将学习如何指示 Nikto 将其流量通过我们刚刚启动的 mitmproxy 实例发送。Nikto 有一个专门的命令行选项 -useproxy 用于此目的。

此选项的语法是 -useproxy http://<proxy_host>:<proxy_port>。由于我们的 mitmproxy 在本地机器 (127.0.0.1) 的 8080 端口上运行,因此正确的 URL 将是 http://127.0.0.1:8080

在运行完整扫描之前,让我们进行一个简单的测试,以确保 Nikto 可以通过代理连接到目标服务器。我们将使用 -Plugins '@@NONE' 选项,它告诉 Nikto 连接并打印服务器 banner,但不运行任何漏洞测试。这是验证我们代理配置的一种快速有效的方法。

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

nikto -h 127.0.0.1 -p 8000 -useproxy http://127.0.0.1:8080 -Plugins '@@NONE'

你应该会看到类似以下的输出,显示 Nikto 的 banner 和目标服务器的信息:

- Nikto v2.x.x
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    127.0.0.1
+ Target Port:        8000
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.6
+ END TIME:           ...
---------------------------------------------------------------------------
+ 1 host(s) tested

现在,如果你在浏览器中访问 http://127.0.0.1:8081 查看 mitmweb 界面,你将看到从 Nikto 捕获的第一个请求。这证实了代理配置正在正常工作。

运行一次通过已配置代理进行的扫描

在此步骤中,在验证了代理配置后,你将使用 Nikto 执行实际的漏洞扫描。这将产生大量流量,所有这些流量都将通过 mitmproxy 进行路由和记录。

为了使本次实验的扫描时间合理,我们将使用 -Tuning 1 选项。Nikto 中的 tuning 选项控制执行的测试类型。-Tuning 1 侧重于“有趣的 文件 / 日志中可见”检查,这是一个很好的起点。

执行以下命令开始扫描:

nikto -h 127.0.0.1 -p 8000 -useproxy http://127.0.0.1:8080 -Tuning 1

Nikto 现在将开始扫描目标服务器。你将在终端中直接看到其进度和任何发现。输出可能看起来像这样,具体取决于发现结果:

- Nikto v2.x.x
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    127.0.0.1
+ Target Port:        8000
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.6
+ 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
...
+ /: The server returns the following message when a request for a non-existent page is made: b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"\n        "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n    <head>\n        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">\n        <title>Error response</title>\n    </head>\n    <body>\n        <h1>Error response</h1>\n        <p>Error code: 404.</p>\n        <p>Message: File not found.</p>\n        <p>Error code explanation: 404 - Nothing matches the given URI.</p>\n    </body>\n</html>'
...
+ END TIME:           ...
---------------------------------------------------------------------------
+ 1 host(s) tested

在扫描运行时,你可以切换到 mitmweb 浏览器标签页,实时查看请求的出现。

在代理的 HTTP 历史记录中观察 Nikto 流量

在此步骤中,你将专注于分析 mitmproxy 捕获的流量。这正是使用代理的真正价值所在。此步骤不需要新的命令;你将使用浏览器中的 mitmweb 界面。

导航到运行 mitmweb 的浏览器标签页,地址为 http://127.0.0.1:8081。你应该会看到一个长长的 Web 请求列表。此列表中的每个条目都是 Nikto 对目标服务器执行的特定测试。

点击左侧列表中任意一个请求。右侧面板将更新以显示该特定请求及其相应响应的详细信息。

探索界面:

  • Request Tab:在这里你可以看到 Nikto 发送的确切 HTTP 请求。请注意:
    • 请求行(例如 GET /some/test/file.html HTTP/1.1)。
    • Host 头部,它指向我们的目标服务器。
    • User-Agent 头部,它会将客户端标识为 Nikto
  • Response Tab:此选项卡显示服务器的完整回复。你可以看到 HTTP 状态码(例如 200 OK404 Not Found)、响应头部和响应体。

花几分钟时间点击不同的请求。你会看到 Nikto 尝试访问常见的管理目录(如 /admin/)、检查备份文件(如 /index.html.bak)以及执行其他标准检查。通过观察这些流量,你可以深入了解漏洞扫描器是如何工作的。

分析代理如何影响扫描结果

在此步骤中,你将分析使用代理如何可能影响扫描。为此,你需要一个基线进行比较。你将再次运行相同的 Nikto 扫描,但这次 不使用 代理。

执行与步骤 3 中相同的扫描命令,但省略 -useproxy 选项:

nikto -h 127.0.0.1 -p 8000 -Tuning 1

观察终端中的输出。现在,将此次扫描的结果与步骤 3 中代理扫描的结果进行比较。在我们简单的实验环境中,没有防火墙或其他安全系统,结果应该是相同的。

那么,代理的意义何在?

  • 可见性 (调试):正如你在上一步中看到的,主要好处是可见性。如果扫描失败或产生意外结果,代理将是了解哪里出错了的首要检查点。你可以看到原始请求和响应,这对于故障排除至关重要。
  • 性能:代理为网络流量增加了一个额外的“跳数”,这可能会引入少量的延迟。对于非常大的扫描,这可能会略微增加总扫描时间。
  • 修改 (高级):可以配置高级代理来修改流量。例如,你可以设置一个规则,将 User-Agent 从“Nikto”自动更改为常见的浏览器字符串。这可以用来规避基于 Nikto 用户代理阻止请求的简单 Web Application Firewall (WAF)。虽然我们在本次实验中不进行修改,但理解这种能力是关键。

总之,对于本次实验,代理的主要作用是让你对扫描过程有一个“中间人”的视角,这是安全测试的一项基本技能。

总结

在本次实验中,你成功学习了在使用 Nikto 进行 Web 漏洞扫描时如何利用代理。

你首先设置了必要的环境,包括一个简单的 Python Web 服务器作为目标,以及 mitmproxy 作为你的拦截代理。然后,你学习了如何使用 Nikto 的 -useproxy 命令行选项将所有扫描流量通过代理进行路由。

通过运行扫描并在 mitmweb 界面中观察流量,你直接了解了 Nikto 发送的请求类型以及它收到的响应。最后,通过运行一次不使用代理的对比扫描,你分析了代理如何影响扫描,并得出结论:在此场景下,代理的主要作用是提供关键的可见性,用于分析和调试。这是安全专业人员用来更好地理解和控制其测试工具的一项基础技术。