使用 Nmap 自动化扫描

NmapNmapBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 shell 脚本和 cron 调度来自动化 Nmap 扫描。本实验首先创建一个简单的 shell 脚本 scan.sh,其中包含一个针对 192.168.1.1 的 Nmap SYN 扫描命令。然后,你将使用 chmod +x scan.sh 使脚本可执行,并从终端运行它。

接着,本实验通过使用文本编辑器扩展脚本来包含多个扫描。最后,你将使用 cron 调度脚本自动运行,通过 crontab -e 进行配置,并在 Xfce 终端中验证自动执行情况。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/save_output("Save Output to File") nmap/NmapGroup -.-> nmap/port_scanning("Port Scanning Methods") nmap/NmapGroup -.-> nmap/scan_types("Scan Types and Techniques") nmap/NmapGroup -.-> nmap/target_specification("Target Specification") nmap/NmapGroup -.-> nmap/syn_scan("SYN Scan") nmap/NmapGroup -.-> nmap/os_version_detection("OS and Version Detection") 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/save_output -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/port_scanning -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/scan_types -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/target_specification -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/syn_scan -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/os_version_detection -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/service_detection -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/scripting_basics -.-> lab-547088{{"使用 Nmap 自动化扫描"}} nmap/script_management -.-> lab-547088{{"使用 Nmap 自动化扫描"}} end

使用 echo "nmap -sS 192.168.1.1" > scan.sh 创建扫描脚本

在这一步中,我们将创建一个简单的 shell 脚本,用于执行 Nmap 扫描。这个脚本将作为后续自动化更复杂扫描的基础。我们将使用 echo 命令把 Nmap 命令写入一个名为 scan.sh 的文件中。

首先,让我们了解一下 echo 的作用。echo 命令只是将其参数打印到标准输出。我们可以使用 > 运算符将这个输出重定向到一个文件。

我们要使用的 Nmap 命令是 nmap -sS 192.168.1.1。下面来分解一下这个命令:

  • nmap:这是运行 Nmap 扫描器的命令。
  • -sS:这个选项指定了 SYN 扫描,这是一种扫描端口的隐蔽方式。它也被称为“半开放”扫描,因为它不会完成 TCP 握手。
  • 192.168.1.1:这是我们要扫描的目标 IP 地址。这是一个常见的私有 IP 地址,但你可能需要根据你的网络配置进行调整。

现在,让我们创建脚本。在 ~/project 目录中打开你的终端(如果你不在该目录下),并执行以下命令:

echo "nmap -sS 192.168.1.1" > scan.sh

这个命令将在你的 ~/project 目录中创建一个名为 scan.sh 的文件,并将 Nmap 命令写入其中。

要验证文件是否正确创建,你可以使用 cat 命令来显示其内容:

cat scan.sh

你应该会看到以下输出:

nmap -sS 192.168.1.1

这确认了脚本已使用正确的 Nmap 命令创建。

使用 chmod +x scan.sh 使脚本可执行

在这一步中,我们将使 scan.sh 脚本可执行。在 Linux 中,默认情况下新创建的文件没有执行权限。我们需要显式地授予此权限,以便能够运行该脚本。

chmod 命令用于更改文件或目录的权限。+x 选项为指定的文件添加执行权限。

在你的终端中,导航到 ~/project 目录(如果你不在该目录下)并执行以下命令:

chmod +x scan.sh

此命令将为 scan.sh 文件添加执行权限。

要验证脚本现在是否可执行,你可以使用 ls -l 命令列出文件的权限。

ls -l scan.sh

你应该会看到类似以下的输出:

-rwxr-xr-x 1 labex labex 25 Oct 26 10:00 scan.sh

-rwxr-xr-x 字符串中的 x 表示该文件现在是可执行的。具体来说,第一个 rwx 指的是所有者的权限(读、写、执行),第二个 r-x 指的是组的权限,第三个 r-x 指的是其他人的权限。

既然脚本已经可执行,我们可以在下一步中运行它。

使用./scan.sh 运行脚本

在这一步中,我们将执行在前几步中创建并使其可执行的 scan.sh 脚本。

要运行该脚本,我们使用 ./ 前缀。这会告诉 shell 执行位于当前目录中的脚本。

在你的终端中,确保你在 ~/project 目录中,并执行以下命令:

./scan.sh

你应该会在终端中看到 Nmap 的输出。输出会因目标主机(192.168.1.1)是否可达以及其上运行着哪些服务而有所不同。如果目标不可达,你可能会看到类似“主机似乎已关闭”的消息。如果目标可达,你会看到开放端口的列表以及有关目标的其他信息。

重要注意事项192.168.1.1 这个 IP 地址是一个常见的默认网关地址。如果这不是你网络中某个设备的正确地址,扫描可能不会产生有用的结果。你可以将 192.168.1.1 替换为你想要扫描的网络中某个设备的 IP 地址。不过,要确保你有权限扫描该目标。未经授权扫描网络是非法且不道德的。

由于 nmap 的输出会因网络和目标的不同而有很大差异,我们无法直接可靠地验证输出。但是,我们可以通过检查命令历史记录来验证命令是否已执行。

在 Xfce 文本编辑器中向脚本添加多个扫描

在这一步中,我们将使用 Xfce 文本编辑器向我们的 scan.sh 脚本添加更多 Nmap 扫描命令。这样我们就可以通过单次执行脚本来执行多个扫描。

首先,在 Xfce 文本编辑器中打开 scan.sh 文件。你可以通过右键点击桌面,选择“在此处打开终端”,然后输入以下命令来做到这一点:

nano scan.sh

这将在 nano 文本编辑器中打开 scan.sh 文件。

目前,该脚本包含一行内容:

nmap -sS 192.168.1.1

让我们添加另一个扫描命令。例如,我们可以添加一个 ping 扫描(-sn)来检查另一个主机是否在线:

nmap -sS 192.168.1.1
nmap -sn 192.168.1.2

你可以根据需要添加任意数量的扫描命令。例如,让我们向第一个目标添加一个版本检测扫描(-sV):

nmap -sS -sV 192.168.1.1
nmap -sn 192.168.1.2

现在,该脚本将首先对 192.168.1.1 执行带有版本检测的 SYN 扫描,然后对 192.168.1.2 执行 ping 扫描。

重要注意事项:请记住将 192.168.1.1192.168.1.2 替换为你想要扫描的网络中设备的 IP 地址,并确保你有权限扫描它们。

要保存更改,请按 Ctrl+X,然后按 Y 确认,再按 Enter 保存文件。

现在,当你使用 ./scan.sh 运行脚本时,它将执行你添加的所有 Nmap 命令。

使用 crontab -e 通过 cron 安排扫描任务

在这一步中,我们将使用 cron 安排我们的 scan.sh 脚本自动运行。cron 是类 Linux 操作系统中基于时间的任务调度器。它允许你安排命令或脚本在特定的时间、日期或间隔运行。

要使用 cron 安排任务,我们使用 crontab 命令。crontab -e 命令会在文本编辑器中打开 crontab 文件(在 LabEx 环境中通常是 nano)。

在你的终端中,输入以下命令:

crontab -e

如果这是你第一次使用 crontab,系统可能会提示你选择一个编辑器。通过选择相应的数字来选择 nano

crontab 文件包含一系列 cron 任务,每个任务占一行。每行由六个字段组成:

分钟 小时 每月的日期 月份 每周的日期 命令
  • 分钟:任务将运行的小时中的分钟数(0 - 59)。
  • 小时:任务将运行的一天中的小时数(0 - 23)。
  • 每月的日期:任务将运行的月份中的日期(1 - 31)。
  • 月份:任务将运行的一年中的月份(1 - 12)。
  • 每周的日期:任务将运行的一周中的日期(0 - 6,其中 0 是星期日)。
  • 命令:要执行的命令。

例如,要每分钟运行一次 scan.sh 脚本,在 crontab 文件中添加以下行:

* * * * * /home/labex/project/scan.sh

这一行的意思是:

  • *:每分钟
  • *:每小时
  • *:每月的每一天
  • *:每个月
  • *:每周的每一天
  • /home/labex/project/scan.sh:要执行的命令(我们脚本的完整路径)

重要提示:在实际场景中,每分钟运行扫描通常不是一个好主意,因为这可能会给网络和目标设备带来压力。在本实验中用于测试目的,每分钟运行一次是可以接受的。

要保存更改,按 Ctrl + X,然后按 Y 确认,再按 Enter 保存文件。

你应该会看到类似“crontab: installing new crontab”的消息。这意味着 cron 任务已成功安排。

Cron 任务通常在后台运行,不显示任何输出。要查看 scan.sh 脚本的输出,你可以将其重定向到一个文件。例如,要将输出重定向到你 ~/project 目录中名为 scan.log 的文件,你可以将 cron 任务条目修改如下:

* * * * * /home/labex/project/scan.sh > /home/labex/project/scan.log 2>&1

> /home/labex/project/scan.log 部分将标准输出重定向到 scan.log 文件,而 2>&1 将标准错误重定向到同一个文件。

在 Xfce 终端中验证自动化

在这一步中,我们将验证 scan.sh 脚本是否由 cron 自动执行。由于我们将脚本安排为每分钟运行一次,我们应该能看到其执行的证据。

如果你将脚本的输出重定向到了一个文件(例如 scan.log),你可以检查该文件的内容,看看脚本是否一直在运行。在你的终端中,输入以下命令:

tail /home/labex/project/scan.log

此命令将显示 scan.log 文件的最后几行。如果脚本运行正常,你应该会在文件中看到 Nmap 扫描的输出,并且每分钟都会更新。

如果你没有将输出重定向到文件,那么你就不会有 scan.log 文件。在这种情况下,你现在可以创建一个,并将 cron 任务的输出重定向到它。再次编辑 crontab:

crontab -e

并将 cron 任务条目更改为:

* * * * * /home/labex/project/scan.sh > /home/labex/project/scan.log 2>&1

保存 crontab 文件。然后,等待一两分钟,再次使用 tail /home/labex/project/scan.log 检查 scan.log 文件。

如果你仍然没有看到任何输出,脚本或 cron 任务可能存在问题。请仔细检查以下几点:

  • 确保 scan.sh 脚本是可执行的(chmod +x scan.sh)。
  • 确保 crontab 文件中的 cron 任务条目正确(使用 crontab -l 列出 cron 任务)。
  • 确保 cron 任务条目中使用了脚本的完整路径(/home/labex/project/scan.sh)。
  • 检查脚本本身是否有任何错误。

重要提示:由于 cron 任务每分钟运行一次,scan.log 文件会快速增长。在验证它正常工作后,你可能想要删除 cron 任务,以避免占用磁盘空间。你可以通过编辑 crontab 文件(crontab -e)并删除你添加的行来删除 cron 任务。

总结

在本实验中,我们学习了如何使用 shell 脚本和 cron 实现 Nmap 扫描自动化。首先,我们创建了一个名为 scan.sh 的简单 shell 脚本,其中包含针对特定 IP 地址的 Nmap SYN 扫描命令。然后,我们使用 chmod +x scan.sh 使脚本可执行,从而能够直接从终端运行它。

接下来,我们使用文本编辑器扩展了脚本,以包含多个扫描。最后,我们使用 cron 安排脚本自动运行,通过 crontab -e 配置了一个 cron 任务,并在 Xfce 终端中验证了自动化。这展示了如何为定期监控或安全评估自动化网络扫描任务。