Nmap NSE脚本引擎:从端口扫描到深度渗透测试的进阶指南

📅 2026/7/4 12:12:33 👁️ 阅读次数 📝 编程学习
Nmap NSE脚本引擎:从端口扫描到深度渗透测试的进阶指南

1. 项目概述:从端口扫描到深度渗透的利器

如果你用过Nmap,大概率还停留在nmap -sS 192.168.1.1这个阶段,觉得它就是个端口扫描器。我以前也这么想,直到有一次在内部渗透测试里,面对一个看似普通的Web服务器,常规扫描只开了80和443端口,感觉无从下手。后来抱着试试看的心态,跑了一个Nmap的http-enum脚本,结果直接扫出来一个没做访问控制的/backup目录,里面放着整站源码和数据库配置文件,整个测试的突破口瞬间打开。那次经历让我彻底明白,Nmap真正的威力,一半藏在它的NSE脚本引擎里。

NSE,全称Nmap Scripting Engine,它不是Nmap的一个附属功能,而是其灵魂所在。你可以把它理解为一个“乐高积木”系统:Nmap的核心扫描引擎负责发现主机、识别端口,而NSE则提供了成千上万块功能各异的“积木”(脚本)。通过组合这些脚本,你能让Nmap从一个单纯的“侦察兵”,变身成为集信息搜集、漏洞探测、服务识别、甚至自动化利用于一体的“全能特工”。我们常说的“用Nmap做渗透测试”,精髓几乎全在NSE上。本指南的目的,就是带你系统性地掌握这套“乐高”的玩法,从脚本分类、调用方法,到实战场景下的高级技巧和避坑经验,让你手里的Nmap真正“活”起来。

2. NSE脚本核心机制与分类解析

2.1 NSE脚本引擎的工作原理

很多人把NSE脚本当成简单的插件,调用就完事,这其实低估了它的设计。NSE是一个基于Lua语言的内嵌式脚本引擎。Lua本身轻量高效,特别适合嵌入到像Nmap这样的网络工具中。当你执行一个带--script参数的Nmap命令时,引擎的工作流程是这样的:

  1. 解析与加载:Nmap首先解析你指定的脚本或脚本类别,从内置的脚本库(通常位于/usr/share/nmap/scripts/)中查找对应的.nse文件。
  2. 规则匹配:每个NSE脚本都定义了它的“运行规则”。这是关键!脚本不是乱跑的。规则通过portrulehostruleprerule/postrule来定义。例如,一个针对HTTP服务的漏洞检测脚本,它的portrule通常会指定只在80、443、8080等端口开放且服务被识别为HTTP时才触发执行。这避免了无意义的扫描,极大提升了效率。
  3. 执行阶段:NSE脚本的执行主要分为几个阶段,但最常用的是hostport规则对应的阶段。简单说,hostrule脚本基于主机级别的信息(如ICMP响应、OS猜测)运行一次;portrule脚本则针对每个匹配的开放端口运行。
  4. 动作执行:脚本主体函数被调用,它通过Nmap提供的强大网络I/O库(如nmap.new_socket)和漏洞检测库(如vulnshttpsmb)与目标进行交互,发送探测包、解析响应。
  5. 结果输出:脚本将发现的信息、漏洞状态等,以结构化的格式输出,最终呈现在你的扫描报告里。

理解这个机制很重要,它能帮你明白为什么有时候脚本没跑起来(规则不匹配),以及如何更精准地控制脚本行为。

2.2 脚本分类与实战场景对应

Nmap官方将脚本分为若干类别,但死记硬背类别名没用,我们要从实战角度理解它们能干什么。我习惯按“侦察-评估-渗透”的流程来划分:

2.2.1 侦察与信息搜集类这是最常用的一类,目的是在尽量不惊动目标的情况下,摸清目标底细。

  • discovery:用于发现网络中的存活主机和服务,超越简单的Ping扫描。例如broadcast-dhcp-discover脚本,可以在局域网内发送DHCP探测包,发现DHCP服务器并获取IP地址范围、网关等关键网络信息,这在内部网络测绘时是第一步。
  • safe:这是默认脚本扫描(-sC)使用的类别。它们被设计为“安全”,即不会引发入侵检测系统(IDS)报警或导致服务崩溃。例如http-robots.txt检查robots文件,ssh-hostkey获取SSH主机密钥指纹。新手切记:在未经授权的网络中使用Nmap,至少应从safe类脚本开始。
  • version:服务版本探测(-sV)的增强版。-sV只能给出基础版本号,而version类脚本,如ssl-cert能获取SSL证书的详细信息(颁发者、有效期、主题备用名称,常能发现配置错误的泛域名证书泄露内部域名),http-title能快速获取网站标题,用于资产识别。

2.2.2 漏洞评估与安全审计类这类脚本开始“动手动脚”,主动探测已知漏洞或弱配置。

  • vuln:专门用于检测已知漏洞。这是宝藏类别,但也是“雷区”。例如http-vuln-cve2017-5638专门检测Apache Struts2的远程代码执行漏洞。重要警告:这类脚本的探测Payload可能触发目标系统真正的漏洞,导致服务中断或数据泄露,必须在授权测试环境中使用。
  • exploit:比vuln更进一步,尝试利用漏洞。极度危险,在真实环境中严禁未经授权使用。仅在授权的渗透测试或隔离的实验室环境中用于验证漏洞危害性。
  • auth:负责处理身份认证。最经典的就是brute子类下的各种暴力破解脚本,如http-brutessh-brutemysql-brute等。它们内置了字典,可以尝试常用用户名密码登录。使用心得:这些内置字典通常较弱,实战中需要配合-script-args传入自定义的大字典,并且要严格控制速率(--max-rate),避免账号被锁。

2.2.3 渗透与后渗透类这类脚本通常在已经获得一定访问权限后使用,进行横向移动或权限维持探测。

  • intrusive:被标记为“侵入式”的脚本。它们可能产生大量流量、日志,或对服务造成压力。Nmap默认不会运行它们,除非你显式指定。例如一些深度枚举脚本。
  • malware:检测主机是否感染了已知的后门或恶意软件。例如smb-check-vulns(旧版,已部分功能迁移)可以检测Conficker等蠕虫。
  • dos:用于拒绝服务测试。警告:这类脚本可能使目标服务不可用,仅用于极限压力测试或授权的DoS演练,日常严禁使用。

分类记忆技巧:你不用记住所有类别,只需记住:想“看”就用safediscovery;想“测”就用vulnauth;想“深入”或“搞破坏”就用intrusiveexploitdos,并且要万分小心。

3. NSE脚本的调用方法与高级参数技巧

知道了脚本能干什么,下一步就是怎么把它叫出来干活。Nmap提供了极其灵活的脚本调用方式,但灵活也意味着容易用错。

3.1 基础调用方式

  1. 默认安全扫描nmap -sC <target>。这是最快捷的方式,-sC等价于--script=default,它会运行所有标记为safe类的脚本。对于一次快速的、初步的安全检查,这个命令足够了。
  2. 指定单个脚本nmap --script <脚本名> <target>。例如,nmap --script http-headers 192.168.1.105。如果脚本名输入错误,Nmap会给出类似“Warning: could not find script ‘xxx‘”的提示,你可以用Tab键补全。
  3. 指定多个脚本:用逗号分隔。nmap --script http-headers,ssl-cert,http-robots.txt <target>
  4. 指定整个类别nmap --script <类别名> <target>。例如,nmap --script vuln <target>会运行所有漏洞检测脚本。再次强调,对vulnexploit等类别要慎用。
  5. 使用通配符nmap --script “http-*” <target>。这会运行所有以http-开头的脚本,非常适合针对特定服务的深度枚举。例如,针对一个Web服务器,你可以用这个命令一次性获取头部信息、枚举目录、检查漏洞等。

3.2 核心参数详解与实战配置

单纯调用脚本往往不够,你需要参数来精细控制。

3.2.1 脚本参数传递 (--script-args)这是高级使用的核心。很多脚本的功能需要通过参数来激活或配置。

  • 基本语法nmap --script <脚本名> --script-args <参数1=值1,参数2=值2> <target>
  • 实战案例1:自定义暴力破解字典内置的http-brute字典很弱。假设我们有一个自定义的用户名字典users.txt和密码字典passwords.txt
    nmap --script http-brute --script-args userdb=./users.txt,passdb=./passwords.txt <target>
    • userdbpassdb就是http-brute脚本定义的参数名,用于指定外部字典文件。
    • 踩坑记录:路径最好用绝对路径,或者确保相对路径正确。我曾因为字典文件路径不对,傻傻地等了半天没结果。
  • 实战案例2:指定漏洞检测的路径有些漏洞检测脚本需要指定具体的URL路径。例如,检测某个特定Struts2漏洞:
    nmap --script http-vuln-cve2017-5638 --script-args uri=/struts2-showcase/ <target>
    • 这里的uri参数告诉脚本,去探测目标<target>/struts2-showcase/这个路径是否存在漏洞。
  • 查看脚本参数:如果你不知道脚本有哪些参数,可以用nmap --script-help <脚本名>查看。这是必学的命令。

3.2.2 控制脚本执行流程

  • --script-trace:这个参数极其有用,尤其当脚本运行没达到预期时。它会打印出脚本发送的每一个数据包和接收到的原始响应。就像给脚本装了个“调试器”。例如:
    nmap --script http-enum --script-trace <target>
    输出会显示脚本尝试访问了哪些目录(如/admin//backup/),以及服务器返回的HTTP状态码(200, 404, 403)。通过这个,你不仅能看结果,还能理解脚本背后的探测逻辑,甚至自己手动去验证。
  • --script-updatedb:更新NSE脚本数据库。Kali Linux等系统会定期更新整个软件包,但如果你手动下载了新的脚本放到scripts目录,就需要运行这个命令来让Nmap识别它们。

3.3 性能与隐匿性权衡

NSE脚本可能会产生大量网络交互,拖慢扫描速度并产生大量日志。

  • 控制超时--script-timeout <时间>。默认是5分钟。对于一些运行缓慢的脚本(如某些复杂的暴力破解),你可能需要增加这个时间。反过来,在需要快速扫描时,可以设置一个较短的超时,避免脚本卡住。
  • 控制并发--max-parallelism <数量>--min-rate / --max-rate <包数/秒>。这些是Nmap本身的性能参数,但对脚本执行影响巨大。例如,运行暴力破解脚本时,一定要用--max-rate 10这样的参数限制发包速率,否则可能瞬间触发目标的账户锁定策略或IPS封禁。
  • 隐匿性考虑:大部分NSE脚本不具备真正的“隐匿”能力,它们发送的探测包特征明显。在需要隐蔽的评估中,应避免使用intrusive或大量vuln脚本。safe类脚本相对温和,但也不是完全隐形。真正的隐匿扫描,往往需要结合-T时序模板(如-T2)、随机化扫描顺序、以及使用代理或跳板等技术,这超出了NSE本身的范围。

4. 实战场景:组合拳与深度枚举案例

纸上谈兵终觉浅,我们来看几个综合性的实战案例,看看如何把多个脚本和参数组合起来,解决实际问题。

4.1 场景一:对一台Web服务器的全面安全评估

假设目标IP是192.168.1.100,开放了80端口。我们想进行一次相对全面但又不至于太粗暴的检查。

第一步:基础信息搜集

nmap -sV -sC --script=http-headers,ssl-cert,http-robots.txt 192.168.1.100
  • -sV:获取服务版本。
  • -sC:运行默认安全脚本(可能包含http-title等)。
  • --script=http-headers,ssl-cert,http-robots.txt:专门获取HTTP响应头(看Server类型、安全策略)、SSL证书详情、以及robots.txt文件。
  • 输出分析要点
    • Server: Apache/2.4.29 (Ubuntu)-> 确定了操作系统和Web服务器版本。
    • SSL证书-> 查看Subject Alternative Name字段,可能发现dev.internal.com这样的测试域名,扩大了攻击面。
    • robots.txt-> 如果存在,可能直接暴露后台路径(/admin/)、API接口(/api/)等。

第二步:目录与文件枚举

nmap -p 80 --script=http-enum --script-args http-enum.displayall=true,http-enum.basepath=/ 192.168.1.100
  • http-enum是强大的目录枚举脚本,内置了常见Web路径字典。
  • http-enum.displayall=true参数强制显示所有结果,包括返回404的尝试,方便你全面了解探测了哪些路径。
  • http-enum.basepath=/指定从根目录开始枚举。如果目标应用在/app/下,则可以设为basepath=/app/
  • 实操心得http-enum的内置字典可能不够全。更好的做法是使用专门的目录扫描工具如gobusterdirsearch,但Nmap的http-enum胜在快速、集成化,适合在Nmap扫描流程中一次性完成初步枚举。

第三步:特定漏洞探测如果从版本信息中发现疑似存在漏洞的组件(比如发现PHP/5.6.40,这是一个较旧且有已知漏洞的版本),可以进行针对性探测。

nmap -p 80 --script=http-vuln-cve2015-1635,http-php-version 192.168.1.100
  • 这里假设性地添加了检测HTTP.sys远程代码执行(CVE-2015-1635)和探测PHP详细版本的脚本。关键点:漏洞探测一定要有针对性,基于第一步搜集到的信息,而不是盲目运行所有vuln脚本。

4.2 场景二:内网Windows主机信息搜集与弱点识别

假设在内网中发现一台IP为192.168.1.10的Windows主机,开放了445(SMB)、139(NetBIOS)等端口。

综合扫描命令:

nmap -p 139,445 --script smb-os-discovery,smb-security-mode,smb-enum-shares,smb-vuln-ms17-010 192.168.1.10
  • smb-os-discovery:获取Windows操作系统版本、计算机名、工作组/域名。这是内网渗透中定位域控、判断系统类型的第一步。
  • smb-security-mode:查看SMB协议使用的认证级别(如是否强制签名)。如果显示message_signing: disabled,则可能面临SMB中继攻击风险。
  • smb-enum-shares:枚举所有网络共享文件夹(包括隐藏共享$)。配合--script-args smbusername=guest,smbpassword=可以尝试空口令或弱口令访问。重要提示:在内网测试中,经常能发现权限配置不当的共享。
  • smb-vuln-ms17-010:检测永恒之蓝(EternalBlue)漏洞。这是内网横向移动的经典漏洞。注意:此脚本探测可能造成目标系统不稳定,务必在授权范围内使用。

参数进阶:使用凭据进行深度枚举如果通过其他手段获得了该主机的用户名和密码(哪怕是普通域用户),可以将其传递给脚本,获取更多信息。

nmap -p 445 --script smb-enum-users,smb-enum-groups --script-args smbusername=‘domain\user‘,smbpassword=‘P@ssw0rd‘ 192.168.1.10
  • smb-enum-users/smb-enum-groups:枚举系统用户和组。这对于了解内网用户结构、寻找高权限账户(如Domain Admins组成员)至关重要。

4.3 场景三:数据库服务(MySQL)的审计与弱口令检测

发现一台服务器开放了3306端口(MySQL)。

扫描命令:

nmap -p 3306 --script mysql-info,mysql-empty-password,mysql-brute 192.168.1.20
  • mysql-info:获取MySQL数据库的详细版本信息、协议版本、线程ID等。
  • mysql-empty-password:检查是否存在空密码的root账户。令人震惊的是,在互联网和内部网中,配置了空密码或弱密码的数据库仍然非常常见。
  • mysql-brute:使用内置字典进行暴力破解。和之前说的一样,内置字典很弱,实战中需要替换。
    nmap -p 3306 --script mysql-brute --script-args userdb=/usr/share/wordlists/metasploit/unix_users.txt,passdb=/usr/share/wordlists/rockyou.txt 192.168.1.20 --max-rate 5
    • 这里使用了Metasploit的用户名字典和著名的rockyou密码字典。
    • --max-rate 5将扫描速率限制在每秒5个尝试,避免触发数据库的登录失败锁定机制。

5. 脚本开发入门与自定义

当你发现现有的脚本不能满足你的特定需求时,就可以考虑自己动手写一个。NSE脚本开发门槛并不高,核心是Lua语法和Nmap提供的API。

5.1 脚本基础结构

一个最简单的NSE脚本框架如下:

-- 描述信息 description = [[ 这是我的第一个自定义NSE脚本,用于检测某个自定义HTTP头部。 ]] -- 分类,决定脚本在哪个阶段运行以及属于哪一类 categories = {“default”, “safe”, “discovery”} -- 作者信息 author = “你的名字” license = “Same as Nmap--See https://nmap.org/book/man-legal.html” -- 依赖库 local http = require “http” local stdnse = require “stdnse” -- 运行规则:定义脚本何时触发 portrule = function(host, port) -- 仅在80或443端口开放,且服务识别为http或https时运行 return port.number == 80 or port.number == 443 end -- 主函数:脚本的核心逻辑 action = function(host, port) -- 1. 构造请求 local req = http.get(host, port, “/”) -- 2. 发送请求并获取响应 local resp = http.request(host, port, req) -- 3. 分析响应 if resp.status == 200 then -- 检查响应头中是否包含某个自定义头部 local custom_header = resp.header[“X-Custom-Header”] if custom_header then -- 4. 格式化输出结果 return stdnse.format_output(true, (“发现自定义头部 X-Custom-Header: %s”):format(custom_header)) end end -- 如果没有发现,可以返回nil,Nmap不会显示 end
  • description:务必写清楚,别人用--script-help时能看到。
  • categories:正确分类很重要,它影响-sC默认是否会运行你的脚本。
  • portrule/hostrule:这是脚本的“开关”。上面的例子中,脚本只对80/443端口运行。
  • action:这里是核心业务逻辑。使用Nmap的库(如http)来发送请求、解析响应。
  • stdnse.format_output:用于格式化输出,让结果在Nmap报告中美观易读。

5.2 一个实战案例:快速检测Spring Boot Actuator端点

Spring Boot Actuator如果配置不当,会暴露大量监控端点(如/actuator/env/actuator/heapdump),导致信息泄露。我们可以写一个脚本快速检测常见Actuator路径。

description = [[ 检测目标是否暴露了Spring Boot Actuator端点。 ]] categories = {“vuln”, “safe”} -- 放在vuln类,因为它检测的是安全问题 author = “Your Name” license = “Same as Nmap--See https://nmap.org/book/man-legal.html” local http = require “http” local stdnse = require “stdnse” local string = require “string” -- 定义要检测的Actuator端点路径列表 local endpoints = { “/actuator”, “/actuator/env”, “/actuator/health”, “/actuator/info”, “/actuator/metrics”, “/actuator/heapdump”, “/actuator/trace”, “/application/actuator” -- 一些旧版本或不同配置的路径 } portrule = function(host, port) -- 在HTTP/HTTPS服务上运行 return port.service == “http” or port.service == “https” or port.number == 80 or port.number == 443 or port.number == 8080 or port.number == 8443 end action = function(host, port) local results = {} local vuln_table = { title = “Spring Boot Actuator Endpoints Found”, state = vulns.STATE.NOT_VULN, -- 初始状态 description = [[ 暴露的Actuator端点可能泄露配置信息、环境变量、度量指标,甚至内存转储文件,导致严重信息泄露。 ]], references = { ‘https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html‘, ‘https://www.veracode.com/security/spring-actuator‘ } } for _, path in ipairs(endpoints) do local req = http.get(host, port, path) local resp = http.request(host, port, req) -- 如果状态码是200(成功)或401/403(需要认证,但也说明端点存在) if resp and (resp.status == 200 or resp.status == 401 or resp.status == 403) then table.insert(results, (“%s (HTTP %d)”):format(path, resp.status)) vuln_table.state = vulns.STATE.LIKELY_VULN -- 发现端点,标记为可能脆弱 end -- 添加一个小延迟,避免请求过快 stdnse.sleep(0.1) end if #results > 0 then vuln_table.extra_info = stdnse.format_output(true, results) local report = vulns.Report:new(SCRIPT_NAME, host, port) report:add_vuln_table(vuln_table) return report:make_output() end -- 未发现任何端点,返回nil end

这个脚本的亮点:

  1. 使用了vulns:它提供了标准化的漏洞报告格式,输出更专业,能集成到Nmap的漏洞报告体系中。
  2. 考虑了多种状态码:不仅检查200,也检查401/403,因为端点存在但需要认证也是一种安全状态(至少比完全开放好,但弱口令仍可突破)。
  3. 添加了延迟stdnse.sleep(0.1)让请求之间有一点间隔,更友好,也更不易被简单的速率限制拦截。
  4. 路径列表可扩展:你可以很容易地修改endpoints表,添加更多需要检测的路径。

开发与调试流程:

  1. 将脚本保存为springboot-actuator.nse,放到Nmap的脚本目录(如/usr/share/nmap/scripts/)。
  2. 运行sudo nmap --script-updatedb更新数据库。
  3. 使用--script-trace运行你的脚本进行调试:nmap -p 80 --script springboot-actuator --script-trace <target>
  4. 观察发送的请求和接收的响应,确保逻辑正确。

6. 常见问题、排错与性能优化实录

即使掌握了所有命令,在实际操作中你还是会碰到各种问题。下面是我踩过的一些坑和解决方法。

6.1 脚本执行常见问题排查表

问题现象可能原因解决方案
脚本未执行,无相关输出1. 脚本运行规则(portrule/hostrule)不满足。
2. 目标端口未开放或服务未被正确识别。
3. 脚本本身有语法错误导致加载失败。
1. 使用-sV确保服务被正确识别。
2. 用--script-trace查看脚本是否被加载和评估。
3. 检查脚本控制台是否有Lua语法错误提示。
脚本执行报错,提示某个函数或模块不存在脚本依赖的Nmap API模块未正确引入,或模块名拼写错误。检查脚本开头的require语句,确保模块名正确。例如,网络操作常用sockethttp库,字符串处理用string库。
暴力破解脚本运行缓慢,且无结果1. 网络延迟高或目标响应慢。
2. 字典太大,默认超时时间不够。
3. 目标存在登录失败锁定策略。
1. 增加--script-timeout 10m(10分钟)。
2. 使用--max-rate限制并发,避免触发锁定。
3. 换用更精准、更小的字典。
http-enum等枚举脚本没发现任何目录1. 目标网站使用了非标准错误页面(返回200而非404)。
2. 内置字典不包含目标特有的路径。
3. 脚本的basepath参数设置错误。
1. 这是http-enum的常见局限。需要使用dirsearchgobuster等更专业的工具,它们能通过比较响应大小、状态码、关键词来识别。
2. 尝试使用--script-args http-enum.fingerprintfile=./custom_fingerprints.txt指定自定义指纹文件。
扫描过程中Nmap崩溃或无响应1. 个别脚本存在Bug,陷入死循环或内存泄漏。
2. 目标发送了畸形响应包,导致解析脚本出错。
3. 系统资源(内存)不足。
1. 更新Nmap和脚本到最新版本。
2. 通过排除法(--script “not <问题脚本>”)定位有问题的脚本,并报告给Nmap官方。
3. 对单个目标或小范围目标进行测试。

6.2 性能优化与扫描策略

NSE脚本会显著增加扫描时间。在扫描大量目标时,需要精心设计策略。

  1. 分阶段扫描:不要试图用一个命令解决所有问题。

    • 第一阶段(快速发现)nmap -sn -PE -PS21,22,23,80,443,8080,3389 192.168.1.0/24。先快速找出存活主机。
    • 第二阶段(端口与服务):对存活主机,nmap -sS -sV -O --top-ports 100 <存活主机列表>。进行端口扫描、版本探测和操作系统识别。
    • 第三阶段(针对性脚本):根据第二阶段结果,对特定服务的主机运行针对性脚本。例如,对所有开80端口的IP运行http-enum,对所有开445端口的IP运行smb-os-discovery。这比对所有IP运行所有脚本高效得多。
  2. 合理使用定时模板-T参数(0-5级)。-T0(偏执)最慢最隐蔽,-T5(疯狂)最快最激进。运行脚本时,-T3(普通)是较好的平衡点。对于暴力破解脚本,建议用-T2甚至-T1,避免因速度过快被屏蔽。

  3. 输出与报告:使用-oA <basename>选项同时输出三种格式(正常、Grepable、XML)。XML格式(-oX)特别适合导入到Metasploit、OpenVAS或自定义的报告工具中进行进一步分析。对于脚本扫描结果,XML格式能保留最完整的结构化信息。

6.3 我的个人工具箱与习惯

最后,分享几个我常用的“组合技”和个人习惯:

  • 信息搜集一键脚本:对于一个新目标,我通常会保存这样一个命令:
    nmap -sS -sV -sC -O -p- --min-rate 1000 -oA full_scan <target>
    解释:-sSSYN扫描,-sV版本探测,-sC默认脚本,-O系统识别,-p-全端口,--min-rate 1000保证一定速度,-oA输出所有格式。这是一个比较全面的初探。
  • 善用nmap -hnmap --script-help:这是最好的手册。任何参数不确定,随时查。
  • 维护自定义脚本库:在~/nmap-scripts/目录下存放自己编写或从社区收集的、好用的非官方脚本。通过--script ~/nmap-scripts/来加载它们。
  • 永远先在小范围测试:在针对整个网段运行一个陌生的、特别是vulnintrusive类脚本之前,先找一两台测试机跑一下,观察其行为和影响。