学习黑客Nmap 是什么?

🚀 Nmap 是什么? (What is Nmap?)

你好,未来的网络安全探索者!👋 欢迎来到 Nmap 的世界。

想象一下,你是一名城市规划师,在规划一座新城市之前,你需要了解这片土地的每一寸细节:哪里有河流,哪里有山丘,哪里已经有了建筑。Nmap (Network Mapper) 就是你在数字世界中的"勘探工具",它可以帮助你发现网络上的设备,以及这些设备上开放了哪些"大门"(也就是端口)。

Nmap 的主要用途包括:

  • 主机发现 (Host Discovery): 找出网络上有哪些活跃的设备,比如电脑、服务器、路由器、甚至智能冰箱!

  • 端口扫描 (Port Scanning): 识别目标设备上哪些网络端口是开放的。端口就像是设备上的不同服务窗口,比如 80 端口通常是网页服务,22 端口通常是远程登录服务。

  • 服务与版本探测 (Service and Version Detection): 找出在开放端口上运行的具体网络服务是什么,以及它们的软件版本。这很重要,因为某些特定版本的软件可能存在已知的安全漏洞。

  • 操作系统探测 (Operating System Detection): 尝试识别目标设备的操作系统类型和版本。

  • 漏洞扫描 (Vulnerability Scanning): 通过 Nmap 脚本引擎 (NSE),Nmap 还可以执行一些基本的漏洞扫描,帮助发现潜在的安全风险。

    为什么学习 Nmap?它为什么这么重要? 💡

    Nmap 是网络安全领域中最基础、最强大的工具之一。无论你是想成为一名渗透测试工程师 (Penetration Tester)、安全分析师 (Security Analyst),还是仅仅想更好地了解你自己的网络环境,Nmap 都是必备技能。

  • 对于防御者 (Blue Team): Nmap 可以帮助你了解自己网络的暴露面,及时发现未经授权的设备或开放了不必要端口的服务,从而加固防线。

  • 对于攻击者/测试者 (Red Team/Penetration Testers): Nmap 是信息收集阶段的核心工具,帮助他们绘制目标网络的拓扑结构,找到潜在的攻击入口。

    Nmap 的合法和道德使用准则 ⚖️

这是一个非常非常重要的话题!Nmap 本身是一个中立的工具,就像一把锤子,你可以用它来盖房子,也可以用它来搞破坏。 我们必须强调:未经授权扫描他人网络是非法且不道德的!

请牢记:始终在获得明确授权的情况下使用 Nmap。 我们学习 Nmap 是为了更好地保护网络,而不是去侵犯他人。

🎉 小成就解锁: 你已经了解了 Nmap 的基本概念和重要性!这是成为网络安全高手的第一步!


🛠️ 安装与初识 Nmap (Installation and First Look)

现在我们已经知道了 Nmap 是什么以及它的重要性,是时候亲自动手,把这个强大的工具安装到我们的电脑上了!别担心,安装过程通常很简单。

Nmap 支持多种操作系统。下面我们分别介绍在 Windows、Linux 和 macOS上的安装方法。你可以根据自己的操作系统选择相应的指南。

操作系统安装指南

操作系统 💻 安装方法 📝
Windows 访问 Nmap 官方网站的下载页面 (https://nmap.org/download.html)。找到最新的稳定版 Windows 安装程序 (通常是一个 .exe 文件,例如 nmap-x.yy-setup.exe)。下载并运行该程序,按照安装向导的提示完成安装。安装过程中,请确保勾选了 "Nmap core files" 和 "Command-line Nmap executable"。
Linux 大多数 Linux 发行版都可以通过包管理器轻松安装 Nmap。 - Debian/Ubuntu (及衍生版): 打开终端,输入命令 sudo apt update && sudo apt install nmap - Fedora/CentOS/RHEL (及衍生版): 打开终端,输入命令 sudo dnf install nmap (较新版本) 或 sudo yum install nmap (较老版本)
macOS 方法一 (推荐): 使用 Homebrew 。如果你安装了 Homebrew (macOS 的一个流行包管理器),打开终端,输入命令 brew install nmap方法二: 官方安装包 。访问 Nmap 官方网站的下载页面,下载适用于 macOS 的 .dmg 安装包。双击打开 .dmg 文件,然后运行其中的安装程序。

小提示 ✨: 安装完成后,可以打开你的命令行终端 (Windows 上是 cmdPowerShell,Linux 和 macOS 上是 Terminal),输入 nmap -V (注意 V 是大写) 并按回车。如果安装成功,你会看到 Nmap 的版本信息。

Nmap 的基本命令行界面

Nmap 主要通过命令行来操作。这意味着你需要打开终端,然后输入 nmap 命令,后面跟着一些参数和目标地址。

基本的命令格式看起来像这样:

bash 复制代码
nmap [扫描类型...] [选项...] {目标规范}

别被这个吓到!我们后面会一步步学习各种扫描类型和选项的含义。

第一次扫描:nmap scanme.nmap.org 示例与结果解读

激动人心的时刻到了!让我们进行第一次 Nmap 扫描。Nmap 的开发者提供了一个专门用于测试扫描的网站:scanme.nmap.org。扫描这个网站是完全合法的。

打开你的终端,输入以下命令并按回车:

bash 复制代码
nmap scanme.nmap.org

请注意: 第一次运行扫描可能需要一点时间,因为它需要下载一些必要的数据文件。请耐心等待。

扫描完成后,你会看到类似下面的输出 (具体结果可能会因 Nmap 版本和网络状况略有不同):

plaintext 复制代码
Starting Nmap X.YY ( https://nmap.org ) at YYYY-MM-DD HH:MM ZZZ
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.12s latency).
Not shown: 995 closed tcp ports (conn-refused)
PORT      STATE    SERVICE
22/tcp    open     ssh
80/tcp    open     http
9929/tcp  open     nping-echo
31337/tcp open     Elite

Nmap done: 1 IP address (1 host up) scanned in X.XX seconds

让我们来解读一下这些信息:

  • Starting Nmap X.YY ...: 显示你正在使用的 Nmap 版本和启动时间。
  • Nmap scan report for scanme.nmap.org (45.33.32.156): 表明这是针对 scanme.nmap.org (其 IP 地址是 45.33.32.156) 的扫描报告。
  • Host is up (0.12s latency).: 表示目标主机是活跃的 (在线),并且网络延迟大约是 0.12 秒。
  • Not shown: 995 closed tcp ports (conn-refused): Nmap 默认会扫描最常见的 1000 个 TCP 端口。这里告诉我们,有 995 个被扫描的 TCP 端口是关闭的 (状态是 conn-refused,意味着连接被拒绝)。
  • 核心部分来了! 下面列出的是开放的端口及其服务:
    • 22/tcp open ssh: 端口 22 是开放的 (open),运行的是 ssh (Secure Shell) 服务。
    • 80/tcp open http: 端口 80 是开放的,运行的是 http (Hypertext Transfer Protocol) 服务,也就是我们常说的 Web 服务。
    • 9929/tcp open nping-echo: 端口 9929 是开放的,运行的是 nping-echo 服务 (Nmap 项目的一个工具)。
    • 31337/tcp open Elite: 端口 31337 是开放的,被标记为 Elite (这是一个历史悠久的黑客文化端口)。
  • Nmap done: 1 IP address (1 host up) scanned in X.XX seconds: 扫描完成,总共扫描了 1 个 IP 地址,发现 1 个主机是活跃的,耗时 X.XX 秒。

🎉 小成就解锁: 你成功安装了 Nmap 并完成了你的第一次网络扫描!是不是很有成就感?

通过这次简单的扫描,我们就发现 scanme.nmap.org 这个服务器对外开放了 SSH、HTTP 等服务。这些信息对于了解一个网络系统至关重要。

在接下来的章节中,我们将学习如何更精确地指定扫描目标,以及探索 Nmap 更多强大的扫描功能。


🎯 指定扫描目标 (Specifying Targets)

在上一节中,我们对 scanme.nmap.org 进行了一次扫描。但在实际应用中,你需要告诉 Nmap 具体要扫描哪些设备。Nmap 提供了多种灵活的方式来指定扫描目标。

想象一下,你是一名侦察兵,你需要精确地知道你的侦察范围。同样,在使用 Nmap 时,明确目标至关重要。

以下是一些常用的指定目标的方法:

指定方式 🗺️ 示例命令 ⌨️ 说明 📝
单个 IP 地址 nmap 192.168.1.1 直接指定一个 IPv4 地址进行扫描。这是最直接的方式。
主机名 nmap example.com 你也可以使用主机名。Nmap 会自动解析该主机名对应的 IP 地址进行扫描。
IP 地址范围 (CIDR) nmap 192.168.1.0/24 使用 CIDR (Classless Inter-Domain Routing) 表示法指定一个网段。例如,/24 表示扫描从 192.168.1.0192.168.1.255 的所有 256 个 IP 地址。这是扫描整个子网的常用方法。
IP 地址范围 (八位字节) nmap 192.168.1.100-150 指定 IP 地址的最后一个八位字节的范围。这个例子会扫描从 192.168.1.100192.168.1.150 的 IP 地址。
nmap 192.168.1,2,3.1-10 你甚至可以指定多个八位字节的范围或列表。这个例子会扫描 192.168.1.1192.168.1.10192.168.2.1192.168.2.10,以及 192.168.3.1192.168.3.10
从文件中读取目标 nmap -iL targets.txt 使用 -iL (Input from List) 参数,Nmap 会从指定的文件 (targets.txt) 中读取目标列表。文件中的每一行可以是一个 IP 地址、主机名或范围。这对于扫描大量目标非常方便。
排除特定目标 nmap 192.168.1.0/24 --exclude 192.168.1.5 使用 --exclude 参数可以从扫描范围中排除一个或多个 IP 地址。
nmap 192.168.1.0/24 --excludefile exclude.txt 也可以使用 --excludefile 参数,从一个文件中读取要排除的目标列表。

生活化比喻: 🎯

  • 单个 IP 地址: 就像给快递员一个精确的门牌号码,例如"幸福路 8 号"。
  • 主机名: 就像告诉出租车司机要去"市中心广场",司机会知道具体的地址。
  • IP 地址范围 (CIDR): 就像告诉邮递员派送整个"阳光小区"的信件。
  • 从文件中读取目标: 就像你有一张客户名单,需要挨个拜访。
  • 排除特定目标: 就像在派对邀请函上注明"除了小明都可以来"。

重要提示: 再次强调,务必确保你拥有扫描目标的明确授权! 未经许可扫描他人网络是违法的。

思考题 🤔:

  1. 如果你想扫描你家路由器(假设 IP 地址是 192.168.0.1)和你的笔记本电脑(假设 IP 地址是 192.168.0.101),你会使用什么 Nmap 命令?
  2. 如果你们公司有一个网段是 10.0.0.0/24,但其中 10.0.0.50 是一台非常敏感的服务器,不希望被扫描到,你会如何设置 Nmap 命令?

🎉 小成就解锁: 你现在知道如何告诉 Nmap 要扫描谁了!这是进行有效网络探测的关键一步。

掌握了如何指定目标后,我们下一步将学习 Nmap 如何发现这些目标是否真的"活着"(在线)------也就是主机发现技术。


🔍 主机发现 (Host Discovery - Ping Scans)

在我们开始对目标进行详细的端口扫描之前,通常需要先确认哪些目标主机是"活着的",也就是在线并且可以响应网络请求。这个过程就叫做 主机发现 (Host Discovery) ,有时也被称为 Ping 扫描 (Ping Scan)

为什么主机发现很重要? 🤔

想象一下,你要给一个城市的所有住户送信,但你事先不知道哪些房子是空置的。如果你挨家挨户地敲门(进行端口扫描),会浪费大量时间在那些根本没人的空房子上。主机发现就像是先派无人机侦察一下,看看哪些房子亮着灯,然后再针对性地去送信。

默认情况下,当你指定一个目标给 Nmap 时(例如 nmap target.com),Nmap 会先进行主机发现。如果主机被认为是离线的,Nmap 通常就不会再对其进行端口扫描了,这样可以大大提高扫描效率,尤其是在扫描大范围网段时。

常用的主机发现技术 📡

Nmap 使用多种技术来判断主机是否在线。这些技术就像是侦察兵的不同工具,各有特点:

  • ICMP Echo Request (Ping): 这是最常见的方式,就像我们平时在命令行里用 ping 命令一样。Nmap 发送一个 ICMP Echo 请求包到目标主机,如果收到 Echo 回复,就认为主机在线。
  • TCP SYN Ping: Nmap 向目标主机的特定端口(默认是 80 端口,HTTP 服务)发送一个 TCP SYN 包(请求建立连接的第一个包)。如果收到 SYN/ACK 包(表示端口开放并同意建立连接)或 RST 包(表示端口关闭但主机在线),都认为主机在线。
  • TCP ACK Ping: Nmap 向目标主机的特定端口(默认是 80 端口)发送一个 TCP ACK 包(确认包)。如果收到 RST 包,通常意味着主机在线,因为只有在线的主机才会响应一个它未曾期望的 ACK 包。
  • UDP Ping: Nmap 向目标主机的特定高位 UDP 端口发送一个空的 UDP 包。如果收到 ICMP Port Unreachable 错误,说明主机在线但该 UDP 端口关闭。如果没有任何响应,也可能意味着主机在线(因为 UDP 是无连接的,不保证响应)。
  • ARP Ping (仅限局域网): 当 Nmap 扫描与你处于同一个局域网 (LAN) 内的目标时,它会使用 ARP (Address Resolution Protocol) 请求来发现主机。ARP 请求直接在链路层工作,非常快速和可靠。如果目标主机回复了 ARP 响应,Nmap 就知道它在线了。

-sn (Ping Scan - No port scan) 参数详解 🚫🚪

如果你只想进行主机发现,而不进行后续的端口扫描,可以使用 -sn 参数 (可以记作 "Scan No ports" 或者 "Skip port scan")。

例如,要发现 192.168.1.0/24 网段中哪些主机在线,但不扫描它们的端口,可以使用:

bash 复制代码
nmap -sn 192.168.1.0/24

这个命令会列出所有响应了 Nmap 主机发现探测的主机,并报告它们的状态 (Host is up)。

更多主机发现选项 (Ping Types) 🛠️

Nmap 允许你更精细地控制使用哪些主机发现技术。以下是一些常用的选项:

选项 技术说明 示例命令
-PE ICMP Echo Ping (默认选项之一,如果 Nmap 有权限发送原始套接字) nmap -PE target.com
-PP ICMP Timestamp Ping (发送时间戳请求) nmap -PP target.com
-PM ICMP Address Mask Ping (发送地址掩码请求) nmap -PM target.com
-PS[portlist] TCP SYN Ping 。可以指定端口列表,例如 -PS22,80,443。默认是端口 80。 nmap -PS80,443 scanme.nmap.org
-PA[portlist] TCP ACK Ping。可以指定端口列表,默认是端口 80。 nmap -PA21,22 192.168.1.1
-PU[portlist] UDP Ping。可以指定端口列表,默认是端口 40125。 nmap -PU53 192.168.1.1
-PR ARP Ping (仅限局域网,通常是默认行为,如果 Nmap 检测到目标在本地网络) nmap -PR 192.168.1.0/24
-Pn No Ping - Treat all hosts as online. 这个选项会跳过主机发现阶段,直接对所有指定的目标进行端口扫描,即使它们可能并不在线。谨慎使用,因为它可能会对大量离线主机进行耗时的端口扫描。在你知道目标肯定在线,但它们可能屏蔽了 Ping 请求时比较有用。 nmap -Pn scanme.nmap.org

小提示 ✨:

  • 在扫描本地网络时,ARP Ping (-PR) 通常是最快和最可靠的主机发现方法。
  • 如果目标网络有防火墙,它们可能会阻止某些类型的 Ping 请求。这时你可能需要尝试不同的 Ping 类型 (-PS, -PA, -PU 等) 或者使用 -Pn (但要小心)。

🎉 小成就解锁: 你现在理解了主机发现的原理和常用方法!这能帮助你更高效地进行网络扫描。

思考题 🤔:

  1. 如果你想快速检查你家局域网 (192.168.0.0/24) 中有哪些设备在线,你会使用哪个 Nmap 命令?为什么?
  2. 你正在对一个已知的 Web 服务器进行安全评估,你知道它肯定在线,但它似乎屏蔽了所有 ICMP Ping 请求。为了扫描它的端口,你会使用哪个 Nmap 参数来确保 Nmap 不会因为 Ping 不通而跳过它?

了解了如何发现活跃主机后,我们就可以开始探索这些主机上到底开放了哪些"大门"了。下一节,我们将进入端口扫描的世界!


教程的第六部分:服务与版本探测 (Service and Version Detection)

6. 服务与版本探测 (Service and Version Detection)

仅仅知道端口是开放的还不够,更重要的是了解这些端口上究竟运行着什么服务以及它们的具体版本。这就像我们不仅知道一扇门开着,还想知道门后是客厅、卧室还是厨房,以及里面的电器是什么品牌和型号。这些信息对于评估潜在的安全风险至关重要,因为很多漏洞都是特定于软件的某个版本的。

Nmap通过向开放端口发送一系列精心构造的探测报文,并分析返回的数据来识别服务和版本信息。这个过程有点像一位经验丰富的侦探,通过询问和观察来判断一个人的职业和背景。

6.1 为什么服务与版本探测如此重要?
  • 精确识别服务:标准的端口号并不总是可靠。例如,一个Web服务器可能运行在80端口,但也可能运行在8080或其他非标准端口。服务探测可以帮助我们确认端口上运行的真实服务,而不是仅仅依赖于端口号的约定。
  • 发现潜在漏洞:知道了服务的具体版本,我们就可以查询该版本是否存在已知的安全漏洞。例如,如果发现目标运行着一个过时的Apache Web服务器版本,那么它可能容易受到某些已知漏洞的攻击。
  • 制定后续渗透策略:版本信息可以帮助我们选择更具针对性的攻击载荷或利用工具。
6.2 如何进行服务与版本探测?

Nmap中使用 -sV 选项来启用服务与版本探测。这个选项会告诉Nmap在完成端口扫描后,对所有识别出的开放端口进行更深入的探测。

基本命令格式:

bash 复制代码
nmap -sV <target>

示例:

让我们尝试对 scanme.nmap.org 进行服务与版本探测:

bash 复制代码
nmap -sV scanme.nmap.org

预期输出解读:

您会看到类似以下的输出(具体版本号可能会有所不同):

复制代码
Starting Nmap X.XX ( https://nmap.org ) at YYYY-MM-DD HH:MM ZZZ
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.18s latency).
Not shown: 995 closed ports
PORT      STATE SERVICE      VERSION
22/tcp    open  ssh          OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
25/tcp    open  smtp         Postfix smtpd
80/tcp    open  http         Apache httpd 2.4.7 ((Ubuntu))
9929/tcp  open  nping-echo   Nping echo
31337/tcp open  Elite        ?

Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Nmap done: 1 IP address (1 host up) scanned in XX.XX seconds

关键信息解读:

  • VERSION :这是 -sV 选项的核心价值所在。它显示了Nmap识别出的运行在对应端口上的服务的具体名称和版本号。
    • 例如,在 22/tcp 端口,我们看到 OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13,这告诉我们目标运行的是OpenSSH服务,版本为6.6.1p1,并且是Ubuntu系统上的一个特定构建版本。
    • 80/tcp 端口,我们看到 Apache httpd 2.4.7 ((Ubuntu)),表明这是一个Apache Web服务器,版本为2.4.7,运行在Ubuntu上。
    • 有时,如果Nmap无法精确识别版本,或者服务比较特殊,版本列可能会显示 ? 或者一些描述性信息,如 31337/tcp open Elite ?
  • SERVICE:显示了Nmap根据端口号和探测结果初步判断的服务类型。
  • Service Info :有时Nmap还会提供一些额外的服务相关信息,比如操作系统类型(OS: Linux)和通用平台枚举(CPE)标识符(cpe:/o:linux:linux_kernel)。CPE是一种标准化的命名方式,用于唯一标识IT平台和产品,这对于自动化漏洞管理非常有用。
6.3 服务探测的强度与精细控制

Nmap的服务探测功能非常强大,但也可能比较耗时,因为它需要与每个开放端口进行多次交互。

  • --version-intensity <level>:您可以控制版本探测的强度,级别从0到9,默认是7。较高的级别会尝试更多的探测报文,可能识别出更冷门的服务,但也更耗时,并且可能更容易被入侵检测系统(IDS)发现。

    • --version-light (强度2)
    • --version-all (强度9)

    例如,进行一次轻量级的版本扫描:

    bash 复制代码
    nmap -sV --version-light <target>
  • --version-trace:如果您想了解Nmap是如何进行版本探测的,可以使用这个选项。它会显示详细的探测过程和Nmap与目标服务的交互数据,这对于调试或深入理解探测原理非常有帮助。

思考题:
  1. 为什么在进行安全评估时,仅仅知道一个端口是开放的是不够的?服务和版本信息能提供哪些额外的价值?
  2. 如果您扫描一个目标,发现其80端口开放,SERVICE列显示为http,但VERSION列显示为Microsoft IIS httpd 10.0。这与您预期的Linux服务器上的Apache服务不符,这可能意味着什么?您会如何进一步分析?
  3. 在什么情况下,您可能会选择使用 --version-light 而不是默认强度的服务探测?

服务与版本探测是Nmap的核心功能之一,它能为我们提供关于目标系统极其宝贵的信息。掌握好这一节的内容,将大大提升您的网络侦察能力。


接下来是第七部分:操作系统探测 (Operating System Detection)

7. 操作系统探测 (Operating System Detection)

了解目标主机运行的操作系统是网络侦察中的另一个关键环节。不同的操作系统有其独特的特性、默认配置和潜在的漏洞。Nmap可以通过分析目标主机对特定TCP/IP探测报文的响应方式来猜测其操作系统。

想象一下,不同国家的人说同一种语言时可能会有不同的口音和用词习惯。Nmap就像一位语言学家,通过分析这些细微的"网络口音"来判断对方的"国籍"(操作系统)。

7.1 为什么操作系统探测很重要?
  • 定制攻击策略:针对特定操作系统的漏洞利用成功率更高。例如,一个针对Windows SMB服务的漏洞利用,对Linux系统就无效。
  • 了解系统环境:操作系统信息有助于我们推断目标可能安装的软件、默认服务以及安全配置。
  • 评估安全基线:某些操作系统版本可能已知存在未修补的漏洞,或者默认安全设置较弱。
7.2 如何进行操作系统探测?

Nmap中使用 -O (大写字母O) 选项来启用操作系统探测。为了获得准确的结果,Nmap通常需要找到至少一个开放和一个关闭的TCP端口。

基本命令格式:

bash 复制代码
nmap -O <target>

示例:

让我们尝试对 scanme.nmap.org 进行操作系统探测:

bash 复制代码
nmap -O scanme.nmap.org

预期输出解读:

您可能会看到类似以下的输出:

复制代码
Starting Nmap X.XX ( https://nmap.org ) at YYYY-MM-DD HH:MM ZZZ
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.18s latency).
Not shown: 995 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
25/tcp    open  smtp
80/tcp    open  http
9929/tcp  open  nping-echo
31337/tcp open  Elite
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9

Nmap done: 1 IP address (1 host up) scanned in XX.XX seconds

关键信息解读:

  • Device type :Nmap尝试猜测设备类型,例如 general purpose (通用服务器/工作站), router, printer 等。
  • Running :Nmap列出的最有可能的操作系统。这里可能是具体的发行版和内核版本,例如 Linux 3.X|4.X 表示可能是Linux内核3系列或4系列。
  • OS CPE:操作系统的通用平台枚举(CPE)标识符。这对于自动化脚本和漏洞数据库查询非常有用。
  • OS details :更详细的操作系统猜测信息。Nmap会根据其指纹数据库中的匹配情况给出最可能的几个候选项。例如 Linux 3.2 - 4.9

重要提示: 操作系统探测并非100%准确。它依赖于目标主机对特定探测报文的响应,而这些响应可能会受到防火墙、负载均衡器或操作系统本身配置的影响。如果Nmap无法获得足够的信息,它可能无法给出准确的猜测,或者会给出多个可能的选项。

7.3 操作系统探测的进阶选项
  • --osscan-limit:如果目标主机没有任何开放和关闭的TCP端口符合Nmap进行操作系统探测的要求,Nmap通常会跳过对该主机的操作系统探测。使用此选项可以强制Nmap即使在不理想的情况下也尝试进行探测。

  • --osscan-guess--fuzzy:当Nmap的操作系统探测结果不理想时,它会尝试进行更积极(或说更模糊)的猜测。这可能会提高识别率,但也可能导致错误的猜测。

    • 可以把它想象成,如果初步判断不出来,Nmap会说:"嗯,虽然细节对不上,但它看起来很像一个Linux系统。"
  • --max-os-tries <number>:设置Nmap在放弃操作系统探测前尝试的次数。默认值通常是合理的,但如果网络条件非常差,或者目标响应很慢,可以适当增加此值。

7.4 操作系统探测的原理简述 (选读)

Nmap的操作系统探测技术非常复杂,它基于一个庞大的指纹数据库 (nmap-os-db)。这个数据库包含了数千种已知操作系统和服务对特定TCP/IP探测报文的响应特征。

Nmap会向目标发送一系列精心设计的TCP、UDP和ICMP探测报文,并分析以下特征:

  • TCP ISN (Initial Sequence Number) 采样:不同操作系统生成TCP初始序列号的方式可能不同。
  • TCP 选项支持和顺序:例如窗口缩放选项、时间戳选项等。
  • IP ID 采样:IP包头中的ID字段的生成方式。
  • 显式拥塞通知 (ECN) 支持
  • 对特定标志位组合的响应:例如,对SYN/FIN/URG/PSH同时设置的TCP报文的响应。
  • ICMP 报文处理:例如,对不可达端口的ICMP响应。

Nmap收集这些响应特征,然后与数据库中的指纹进行比对,找出最匹配的操作系统。

思考题:
  1. 在哪些情况下,操作系统探测的结果可能不准确?你会如何应对这种情况?
  2. 如果你扫描一个网络,发现大部分主机都是Windows系统,但有一台主机Nmap无法识别其操作系统,或者给出了非常模糊的猜测(例如 unknown device)。这可能暗示了什么?
  3. --osscan-guess 选项的潜在好处和风险是什么?

操作系统探测是Nmap工具箱中非常强大的一个功能,它能帮助我们更全面地了解目标网络环境。熟练运用它,将使您的安全评估工作更加高效和精准。


我们现在进入Nmap中一个非常强大且灵活的部分------Nmap脚本引擎。这部分将极大地扩展Nmap的功能。

8. Nmap脚本引擎 (NSE - Nmap Scripting Engine)

Nmap脚本引擎(NSE)是Nmap最强大的功能之一。它允许用户编写(或使用现有的)Lua脚本来自动化各种网络任务。这些脚本可以用于更高级的漏洞检测、更深入的服务发现、利用某些已知的漏洞、收集更多目标信息等等。

想象一下,Nmap本身是一个多功能工具箱,而NSE脚本就是各种定制的、专用的工具头,可以装在工具箱的工具上,执行特定的高级任务。

8.1 NSE能做什么?

NSE脚本的用途非常广泛,Nmap自带了数百个脚本,涵盖以下主要类别:

  • auth:尝试绕过认证机制或获取目标系统上的凭据(例如,尝试默认密码)。
  • broadcast:利用广播发现网络中的主机和服务,收集信息。
  • brute:对服务进行暴力破解(例如,FTP、SSH、Telnet的用户名和密码)。
  • default :一组被认为是安全且有用的默认脚本,通常与 -sC-A 选项一起运行。
  • discovery:尝试发现关于网络的更多信息(例如,DNS服务器、SNMP信息、目录服务等)。
  • dos:检测或利用拒绝服务漏洞(使用时需格外小心,并获得授权)。
  • exploit:尝试利用已知的安全漏洞(同样,使用时需格外小心,并获得授权)。
  • external:与第三方服务交互以获取信息(例如,查询Whois数据库、Shodan等)。
  • fuzzer:向目标发送异常或随机数据,以测试其健壮性或发现潜在漏洞。
  • intrusive:被认为具有侵入性,可能导致目标系统崩溃或留下明显痕迹的脚本(不建议在未授权的情况下使用)。
  • malware:检测目标系统上是否存在已知的恶意软件或后门。
  • safe:被认为是安全的脚本,不太可能对目标系统造成负面影响。
  • version :用于增强版本探测 -sV 的脚本,尝试获取更详细的服务版本信息。
  • vuln:专门用于检测已知漏洞的脚本。
8.2 如何使用NSE脚本?

主要通过 --script 选项来指定要运行的脚本或脚本类别。

基本命令格式:

  • 运行单个脚本:

    bash 复制代码
    nmap --script <script-name> <target>

    例如,运行 http-title 脚本来获取Web服务器的标题:

    bash 复制代码
    nmap --script http-title scanme.nmap.org
  • 运行指定类别的所有脚本:

    bash 复制代码
    nmap --script <category-name> <target>

    例如,运行所有 default 类别的脚本:

    bash 复制代码
    nmap --script default scanme.nmap.org

    或者,更常用的方式是使用 -sC 选项,它等同于 --script default

    bash 复制代码
    nmap -sC scanme.nmap.org
  • 运行多个脚本或类别:

    使用逗号分隔脚本名或类别名。

    bash 复制代码
    nmap --script http-title,ftp-anon <target>
    nmap --script default,vuln <target>
  • 运行所有脚本 (不推荐,除非您知道自己在做什么并且已获得授权):

    bash 复制代码
    nmap --script all <target>

    这会运行Nmap脚本目录中的所有脚本,可能非常耗时且具有侵入性。

  • 使用通配符指定脚本:

    bash 复制代码
    nmap --script "http-*" <target>  # 运行所有以 http- 开头的脚本

    注意:在某些shell中,可能需要将通配符表达式放在引号内。

8.3 脚本参数 (--script-args)

一些NSE脚本接受参数,以定制其行为。可以使用 --script-args 选项来传递这些参数。

命令格式:

bash 复制代码
nmap --script <script-name> --script-args <arg1=value1,arg2=value2> <target>

例如,http-brute 脚本可以接受用户名列表和密码列表作为参数:

bash 复制代码
nmap --script http-brute --script-args userdb=users.txt,passdb=passwords.txt <target_web_server>

要了解特定脚本支持哪些参数,可以查阅Nmap的官方文档,或者使用以下命令查看脚本的帮助信息:

bash 复制代码
nmap --script-help <script-name>
8.4 更新NSE脚本数据库

Nmap的脚本库会定期更新,添加新的脚本和修复。可以使用以下命令更新脚本数据库:

bash 复制代码
sudo nmap --script-updatedb

(在Windows上可能不需要 sudo,直接以管理员权限运行命令提示符即可)

8.5 常用且有用的脚本示例
  • http-title : 获取HTTP服务器的<title>标签内容。

    bash 复制代码
    nmap -p 80 --script http-title scanme.nmap.org

    输出示例:

    复制代码
    PORT   STATE SERVICE
    80/tcp open  http
    | http-title: Go ahead and ScanMe!
    |_Requested resource was /
  • ftp-anon: 检查FTP服务器是否允许匿名登录。

    bash 复制代码
    nmap -p 21 --script ftp-anon <ftp-server>

    如果允许匿名登录,它会显示:Anonymous FTP login allowed

  • smb-os-discovery: 尝试通过SMB协议获取更详细的操作系统信息、计算机名、域名等。

    bash 复制代码
    nmap -p 139,445 --script smb-os-discovery <windows-host>
  • dns-brute: 尝试通过暴力猜测常见的子域名来发现目标域的更多主机。

    bash 复制代码
    nmap --script dns-brute --script-args dns-brute.threads=5,dns-brute.hostlist=./subdomains.txt example.com
  • ssl-enum-ciphers: 列出SSL/TLS服务器支持的加密套件。

    bash 复制代码
    nmap -p 443 --script ssl-enum-ciphers <https-server>
8.6 -A 选项:激进扫描

-A 选项是一个方便的快捷方式,它启用了多种高级扫描选项,包括:

  • 操作系统探测 (-O)
  • 服务版本探测 (-sV)
  • 默认脚本扫描 (-sC)
  • Traceroute (--traceroute)
bash 复制代码
nmap -A <target>

-A 选项功能强大,能提供大量信息,但扫描过程也相对较慢且"噪音"较大,更容易被检测到。

思考题:
  1. 您认为NSE脚本在哪些安全评估场景中最有用?请举例说明。
  2. 在使用 exploitintrusive 类别的NSE脚本时,需要注意哪些道德和法律问题?
  3. 如果您想编写自己的NSE脚本来检测一个特定服务的自定义漏洞,您会如何开始?(提示:Lua语言,Nmap API)
  4. -sC-A 选项有什么区别和联系?在什么情况下您会选择使用 -sC 而不是 -A

Nmap脚本引擎极大地增强了Nmap的功能,使其不仅仅是一个端口扫描器,更是一个强大的网络安全审计工具。花时间探索和学习不同的NSE脚本,将对您的技能提升大有裨益。


接下来,我们将讨论如何优化Nmap的扫描过程,使其更高效,并能适应不同的网络环境。

9. 扫描优化与性能 (Timing and Performance)

Nmap的扫描速度和资源消耗是可以调整的。根据您的网络状况、目标主机的响应能力以及您对扫描隐蔽性的要求,合理配置Nmap的性能参数非常重要。这就像开车一样,在高速公路上可以开快点,但在拥挤的市区或者路况不好的地方就需要慢下来。

9.1 时间模板 (-T <paranoid|sneaky|polite|normal|aggressive|insane>-T<0-5>)

Nmap提供了一些预设的时间模板,方便用户快速调整扫描速度和隐蔽性。这些模板会影响Nmap的多个底层时间参数,如超时、重试次数等。

  • -T0-T paranoid:极慢模式,用于IDS规避。发送数据包的间隔非常长,扫描一个目标可能需要数小时甚至数天。这就像一个极其谨慎的间谍,每一步都小心翼翼。
  • -T1-T sneaky:隐蔽模式,也用于IDS规避,比paranoid稍快一些。
  • -T2-T polite:礼貌模式,降低扫描速度以减少对目标网络和主机的带宽消耗和负载。它会等待更长的时间以获取响应,并且发送数据包的频率较低。这就像一个有礼貌的访客,轻轻敲门并耐心等待。
  • -T3-T normal:正常模式,这是Nmap的默认模式。它会根据网络状况动态调整扫描速度,试图在速度和可靠性之间取得平衡。
  • -T4-T aggressive:快速模式,假设网络状况良好且目标主机响应迅速。它会设置较短的超时时间,并增加并行扫描的数量。这就像一个急匆匆的快递员,追求效率。
  • -T5-T insane:疯狂模式,极快,但只适用于网络状况极好且目标主机能快速处理请求的情况。如果网络或目标主机跟不上,可能会导致结果不准确或丢失数据包。这就像F1赛车,速度极快但对路况要求极高。

如何选择?

  • 对于大多数情况,-T3 (normal) 是一个不错的起点。
  • 如果您担心触发IDS/IPS,或者目标网络带宽有限,可以选择 -T2 (polite) 或更低的级别。
  • 如果您在受控环境(例如您自己的实验室网络)中扫描,并且希望尽快得到结果,可以尝试 -T4 (aggressive)
  • -T5 (insane)-T0 (paranoid) / -T1 (sneaky) 属于比较极端的情况,需要谨慎使用。

示例:

bash 复制代码
nmap -T4 scanme.nmap.org  # 使用快速模式扫描
nmap -T polite 192.168.1.0/24 # 对本地网络进行礼貌扫描
9.2 手动调整时间参数 (高级)

除了预设的时间模板,Nmap还允许您手动调整许多细致的时间参数,以实现更精确的控制。这些选项通常用于高级用户或特定场景。

  • --min-hostgroup <numhosts> / --max-hostgroup <numhosts>:设置并行扫描的主机组的大小。Nmap会将目标列表分成若干组进行扫描。

  • --min-parallelism <numprobes> / --max-parallelism <numprobes>:控制并行发送的探测报文数量。

  • --min-rtt-timeout <milliseconds> / --max-rtt-timeout <milliseconds> / --initial-rtt-timeout <milliseconds>:控制往返时间(RTT)超时。Nmap会根据探测到的网络延迟动态调整超时,这些选项可以设置其上下限和初始值。

  • --max-retries <numretries>:设置对端口探测报文的最大重试次数。如果一个端口没有响应,Nmap会重试几次。

  • --host-timeout <milliseconds> :设置扫描单个主机的最大超时时间。如果扫描一个主机超过这个时间,Nmap会放弃该主机。
    例如,如果您希望每个主机的扫描时间不超过5分钟:

    bash 复制代码
    nmap --host-timeout 300000ms <target> # 或者 --host-timeout 5m
  • --scan-delay <milliseconds> / --max-scan-delay <milliseconds> :在发送每个探测报文之间插入指定的延迟。这对于IDS规避或在非常敏感的网络中扫描非常有用。
    例如,在每个探测报文之间至少延迟1秒:

    bash 复制代码
    nmap --scan-delay 1s <target>

注意: 手动调整这些参数需要对网络原理和Nmap的工作方式有较深的理解。不当的设置可能会导致扫描速度过慢、结果不准确或对目标网络造成不必要的负担。

9.3 带宽控制
  • --min-rate <number> / --max-rate <number> :控制每秒发送数据包的速率。这对于精确控制带宽消耗非常有用。
    例如,确保每秒发送的数据包不超过10个:

    bash 复制代码
    nmap --max-rate 10 <target>
9.4 扫描顺序
  • --randomize-hosts:随机化目标主机的扫描顺序。这在扫描大量主机时,可以避免因为按顺序扫描而产生的明显模式,从而可能有助于规避某些简单的检测机制。
思考题:
  1. 在什么情况下,您会选择使用 -T2 (polite) 而不是默认的 -T3 (normal)?反之,在什么情况下会选择 -T4 (aggressive)
  2. 如果您正在对一个非常重要且敏感的生产服务器进行例行安全检查,您会如何调整Nmap的时间和性能参数,以最大限度地减少对其正常服务的影响?
  3. --host-timeout 和探测报文的RTT超时(如 --max-rtt-timeout)有什么区别?它们分别控制什么?
  4. 为什么说 -T5 (insane) 模式可能会导致结果不准确?

理解并合理运用Nmap的时间和性能选项,可以让您的扫描任务更加高效、可靠,并且能够适应各种复杂的网络环境。这需要一些实践和经验积累,但回报是显著的。


现在,我们来看看如何处理和保存Nmap的扫描结果,这对于后续的分析、报告以及与其他工具的集成都非常重要。

10. 输出格式 (Output Formats)

Nmap可以将扫描结果保存为多种格式,以满足不同的需求。想象一下,您完成了一项调查研究,现在需要将结果整理成不同的报告形式:一份给技术团队看的详细报告,一份给管理层看的摘要报告,还有一份可以导入到数据库进行分析的原始数据。

Nmap主要支持以下几种输出格式:

10.1 普通输出 (-oN <filespec>)

这是Nmap默认在屏幕上显示的格式,也是最易读的格式。它包含了Nmap扫描过程中的主要信息,如开放端口、服务、版本、操作系统猜测等。

命令格式:

bash 复制代码
nmap -oN output.txt <target>

这会将屏幕上看到的标准输出保存到 output.txt 文件中。

优点:

  • 人类可读性好。
  • 包含了大部分重要信息。

缺点:

  • 不太适合程序解析和自动化处理。
10.2 XML 输出 (-oX <filespec>)

XML (Extensible Markup Language) 格式是一种结构化的数据格式,非常适合程序解析。Nmap的XML输出包含了非常详细的扫描信息,几乎涵盖了所有收集到的数据。

命令格式:

bash 复制代码
nmap -oX output.xml <target>

优点:

  • 机器可读性极好,方便程序解析和处理。
  • 信息最全面,包含了所有细节。
  • 可以被许多第三方安全工具或脚本导入和使用。
  • 可以使用XSLT等技术转换为HTML或其他格式的报告。

缺点:

  • 对于人类直接阅读不太友好。

示例场景:

  • 将Nmap扫描结果导入到漏洞管理平台。
  • 编写脚本自动分析Nmap结果并生成定制报告。
  • 长期存储扫描数据以供后续审计和比较。
10.3 Grepable 输出 (-oG <filespec>)

这种格式设计用于方便使用 grepawksed 等命令行工具进行快速的文本处理和信息提取。每一行代表一个主机,开放的端口和服务信息会以简洁的方式列出。

命令格式:

bash 复制代码
nmap -oG output.grep <target>

输出示例(单行):

复制代码
Host: 45.33.32.156 (scanme.nmap.org)   Status: Up
Host: 45.33.32.156 (scanme.nmap.org)   Ports: 22/open/tcp//ssh///, 25/open/tcp//smtp///, 80/open/tcp//http/// ... Ignored State: closed (995)

优点:

  • 非常适合命令行工具进行快速过滤和提取特定信息。
  • 格式相对简单紧凑。

缺点:

  • 信息不如XML详细。
  • 可读性不如普通输出。

示例场景:

  • 快速提取所有开放了80端口的主机列表。
  • 统计某个特定服务在网络中出现的次数。
10.4 同时输出到所有主要格式 (-oA <basename>)

这是一个非常方便的选项,它会同时生成普通输出 (.nmap)、XML输出 (.xml) 和 Grepable输出 (.gnmap),并使用指定的基础文件名。

命令格式:

bash 复制代码
nmap -oA scan_results <target>

执行后,会在当前目录下生成三个文件:

  • scan_results.nmap (普通输出)
  • scan_results.xml (XML输出)
  • scan_results.gnmap (Grepable输出)

这是推荐的保存扫描结果的方式,因为它同时兼顾了人类可读性和机器可处理性。

10.5 脚本小子输出 (-oS <filespec>) (已废弃,了解即可)

这是一种比较"有趣"的输出格式,它会用leet speak (l33t sp34k,一种网络黑客俚语) 来显示结果。例如,Nmap 会变成 |\|/\/\/\Delta|> 。这种格式主要是为了娱乐,并没有实际的分析价值,并且在新版本的Nmap中可能已被移除或不推荐使用。

10.6 详细程度与调试信息
  • -v / -vv (详细输出) :增加输出的详细程度。-v 会显示更多关于扫描过程的信息,-vv 则更加详细。这对于理解Nmap正在做什么以及诊断问题很有帮助。
  • -d / -dd (调试输出):启用调试模式,输出大量的调试信息。这主要用于Nmap开发者或高级用户进行故障排除。
10.7 恢复中断的扫描
  • --resume <filename> :如果一次扫描因为某些原因(例如断电、Ctrl-C)中断了,并且您使用了 -oN-oX 保存了日志,您可以使用此选项尝试从中断的地方恢复扫描。Nmap会读取之前的日志文件,并跳过已经完成的部分。

    bash 复制代码
    # 假设之前的扫描是 nmap -oN scan.log <large_network>
    # 如果中断了,可以尝试恢复:
    nmap --resume scan.log

    注意: 并非所有类型的扫描都能完美恢复,但对于大型扫描任务来说,这是一个非常有用的功能。

思考题:
  1. 在进行一次正式的安全评估并需要提交报告时,您会选择哪种Nmap输出格式?为什么?
  2. 如果您需要快速从Nmap扫描结果中找出一个特定端口(例如3389/tcp,远程桌面)在哪些主机上是开放的,您会倾向于使用哪种输出格式和什么工具来辅助?
  3. -oA 选项相比单独使用 -oN, -oX, -oG 有什么优势?
  4. 在什么情况下,增加详细程度 (-v-vv) 会对您有所帮助?

有效地管理和利用Nmap的输出是整个扫描过程的重要组成部分。选择合适的输出格式可以大大简化后续的数据分析、报告撰写以及与其他工具的集成工作。


在最后这部分,我们将探讨一些更高级的主题:如何尝试规避防火墙和入侵检测系统(IDS),以及一些欺骗技术。这部分内容需要特别强调合法和道德使用的重要性。

11. 防火墙/IDS规避与欺骗 (Firewall/IDS Evasion and Spoofing)

在真实的网络环境中,目标主机通常受到防火墙的保护,网络中也可能部署了IDS/IPS来检测和阻止恶意扫描活动。Nmap提供了一些技术来尝试绕过这些防御机制,或者使扫描行为更难被追踪。

重要警告:滥用这些技术进行未经授权的扫描是非法和不道德的。本节内容仅用于教育目的,帮助您了解网络防御和攻击技术,以便更好地保护自己的系统。在进行任何扫描之前,务必获得明确的授权。

想象一下,您是一位侦察兵,需要潜入一个有哨兵(防火墙)和监控摄像头(IDS)的区域。您需要运用一些技巧来避免被发现。

11.1 分片数据包 (-f)

一些简单的防火墙或IDS可能只检查TCP头部信息,而不重新组装IP分片。-f 选项会将Nmap的探测报文分割成多个小的IP分片(通常是8字节或更小)。这可能会使得一些配置不当的防火墙或IDS难以检测到真实的扫描意图。

命令格式:

bash 复制代码
nmap -f <target>
  • 您可以使用 -f 多次(例如 -ff)来使用更小的分片,或者使用 --mtu <offset> 来精确控制分片大小(MTU必须是8的倍数)。

效果: 取决于目标防火墙/IDS的具体实现。现代的、状态化的防火墙通常能够正确处理IP分片,因此这种技术的效果有限。

11.2 指定源端口 (--source-port <portnumber>-g <portnumber>)

一些配置不当的防火墙规则可能只允许来自特定源端口(例如DNS的53端口,FTP-DATA的20端口)的流量通过。通过伪造源端口,Nmap可能能够绕过这类简单的规则。

命令格式:

bash 复制代码
nmap --source-port 53 <target>

效果: 同样取决于防火墙的具体配置。如果防火墙规则确实基于源端口进行过滤,则可能有效。

11.3 伪造MAC地址 (--spoof-mac <MAC address|0|vendor name>)

在本地以太网环境中,您可以伪造发送数据包的源MAC地址。这可以使您的扫描在网络日志中看起来像是来自另一台设备。

命令格式:

  • 指定一个完整的MAC地址:

    bash 复制代码
    nmap --spoof-mac 00:11:22:33:44:55 <target_on_local_network>
  • 让Nmap随机生成一个MAC地址:

    bash 复制代码
    nmap --spoof-mac 0 <target_on_local_network>
  • 让Nmap随机生成一个属于特定厂商的MAC地址(例如Dell, Apple, Cisco):

    bash 复制代码
    nmap --spoof-mac Dell <target_on_local_network>

注意:

  • 此技术只在本地网络(同一广播域)中有效。
  • 如果目标网络使用了端口安全或其他基于MAC地址的访问控制,伪造MAC地址可能导致您的合法网络连接中断。
11.4 诱饵扫描 (-D <decoy1,decoy2[,ME],...>)

这是一种非常有趣的欺骗技术。Nmap会从您指定的多个诱饵IP地址(以及您真实的IP地址)向目标发送探测报文。这样,在目标的日志中,看起来像是多个主机同时在扫描它,从而淹没您的真实IP,使其更难被发现。

命令格式:

bash 复制代码
nmap -D RND:10,192.168.1.101,ME,10.0.0.5 <target>
  • RNDRND:<number>:生成一个或指定数量的随机、不可路由的IP地址作为诱饵。
  • ME :代表您自己的真实IP地址。您需要将 ME 包含在诱饵列表中,否则目标将不会收到来自您真实IP的任何探测,也就无法获得扫描结果。
  • 您可以直接指定其他IP地址作为诱饵。

工作原理:

  • Nmap会轮流使用诱饵IP(和您的真实IP)作为源IP地址发送探测报文。
  • 只有当使用您的真实IP (ME) 发送探测时,Nmap才能收到响应并记录结果。
  • 目标主机的日志会记录下来自所有诱饵IP(包括您的真实IP)的连接尝试。

重要提示:

  • 不要使用您无法控制或未获授权的真实IP地址作为诱饵! 这可能会给无辜的第三方带来麻烦,甚至构成网络攻击。
  • 使用随机不可路由的IP地址(如 RND)或您自己网络中未使用的IP地址作为诱饵是相对安全的做法。
  • 诱饵扫描并不能完全隐藏您的真实IP,因为您仍然需要用真实IP发送一些探测来获取结果。但它可以有效地混淆视听。
11.5 空闲扫描 (-sI <zombie host[:probeport]>) (非常高级且有特定条件)

这是一种极其隐蔽的扫描技术,它利用一个空闲的"僵尸主机"(Zombie Host)来代替您向目标发送探测报文,从而完全隐藏您的真实IP地址。这种扫描方式非常复杂,并且需要满足特定条件:

  1. 找到一个合适的僵尸主机:该主机必须是网络空闲的(即很少有正常的网络流量),并且其IP ID序列号是可预测的(通常是全局递增的)。
  2. 僵尸主机不能直接过滤掉来自您的探测报文。

工作原理简述:

  1. Nmap向僵尸主机发送一个探测包,记录其IP ID。
  2. Nmap伪造一个源IP为僵尸主机的探测包发送给目标主机的特定端口。
  3. 如果目标端口是开放的,目标主机会向僵尸主机回复一个SYN/ACK包。僵尸主机收到这个意外的SYN/ACK后,会回复一个RST包给目标主机,并且其IP ID会增加。
  4. 如果目标端口是关闭的,目标主机会向僵尸主机回复一个RST包。僵尸主机收到RST后通常不会有响应,其IP ID不会因为这个交互而改变。
  5. Nmap再次向僵尸主机发送一个探测包,检查其IP ID。通过比较IP ID的变化,Nmap可以推断出目标端口的状态。
    • IP ID增加2:目标端口开放。
    • IP ID增加1:目标端口关闭。
    • IP ID增加超过2或无变化:可能存在其他网络流量或僵尸主机不适用。

命令格式:

bash 复制代码
nmap -sI zombie.example.com <target>

优点: 真正意义上的匿名扫描,目标日志中只会看到僵尸主机的IP。
缺点:

  • 难以找到合适的僵尸主机。
  • 扫描速度非常慢。
  • 结果可能不如直接扫描准确。
  • 对僵尸主机有一定的网络流量,如果僵尸主机不是您控制的,也存在道德和法律风险。
11.6 其他技巧
  • 避免使用DNS解析 (-n) :在扫描时,Nmap默认会进行反向DNS查询来获取主机名。这可能会在DNS服务器上留下日志。使用 -n 选项可以禁止所有DNS解析。
  • 发送损坏的校验和 (--badsum):一些配置不佳的防火墙或IDS可能不会检查IP/TCP/UDP校验和。发送带有错误校验和的数据包有时可以绕过这些检查,但正常的操作系统通常会丢弃这些数据包,因此这种方法主要用于探测防火墙/IDS本身的行为,而不是扫描目标主机。
再次强调:道德与合法性

本节介绍的技术很多都具有双刃剑的特性。了解它们有助于您理解网络攻防的复杂性。但是,严禁在未经授权的情况下对任何系统使用这些技术。 始终遵守法律法规和道德准则。

思考题:
  1. 诱饵扫描 (-D) 和空闲扫描 (-sI) 在隐藏扫描者真实身份方面有什么本质区别?哪种方法更隐蔽?为什么?
  2. 为什么说IP分片 (-f) 技术对现代防火墙的效果越来越有限?
  3. 如果您怀疑目标网络部署了IDS,并且您希望尽可能低调地进行扫描,您会优先考虑使用哪些规避技术组合?(假设您已获得授权)
  4. 使用 --spoof-mac 伪造MAC地址进行扫描,在什么情况下是有效的,什么情况下是无效的?

到这里,我们关于Nmap入门的主要内容就介绍完毕了。从基础的安装、目标指定,到各种扫描技术、脚本引擎,再到性能优化和规避技巧,希望这个教程能为您打开Nmap学习的大门。

相关推荐
IpdataCloud19 分钟前
多维数据助力企业网络安全
网络·安全·web安全
tmacfrank21 分钟前
Android 网络全栈攻略(五)—— 从 OkHttp 拦截器来看 HTTP 协议二
android·网络·okhttp
伍贰什丿30 分钟前
python学习day2:进制+码制+逻辑运算符
python·学习
老歌老听老掉牙30 分钟前
Open CASCADE学习|非线性方程组求解技术详解
c++·学习·opencascade·非线性方程组
jndingxin1 小时前
ROS2学习(9)------ROS2动作
学习·机器人
真的想上岸啊2 小时前
学习STC51单片机13(芯片为STC89C52RC)
单片机·嵌入式硬件·学习
江畔柳前堤2 小时前
PyQt学习系列10-性能优化与调试技巧
开发语言·javascript·数据库·学习·性能优化·ecmascript·pyqt
永日456702 小时前
学习日记-day14-5.23
学习
FanfanPyt2 小时前
Python打卡训练营学习记录Day34
开发语言·python·学习
人工智能培训2 小时前
计算机视觉设计开发工程师学习路线
人工智能·学习·计算机视觉·大模型·transformer·ai大模型