关于 Nmap 的基础介绍和参数解释

Mr.R0boter 于 2020-09-04 发布

简介

此文是我从我的笔记中转移过来的,记录了 nmap 选项的作用,按照作用进行了分类。算一个 nmap 的中文翻译文档吧

常规选项

1. 指定目标(Target Specification)

-iL <inputfilename>

从指定的文件中读取目标,如果希望从标准输入中读取则用-连字符代替文件名

-iR <hostnumber>

随机 hostnumber 指定个数的目标,自动跳过私有、组播、未分配的 IP

-–exclude <host1[,host2]...>

排除指定的主机,以逗号隔开

--excludefile <excludefile>

排除指定文件中的所有主机

2. 主机发现(Host Discovery)

-sL

(list scan)仅列出指定网络上的每台主机,不发送报文到目标主机,默认简单的对目标进行解析

-sP

(ping scan)仅进行 ping 扫描,不做进一步探测。

-p0

假设所有目标主机都在线,默认情况下 nmap 先对主机 Ping 检测,确认在线后才会进行高强度探测,使用此选项可跳过主机发现

-PS/PA [portlist]

设置一个 SYN/ACK 标志位的空 TCP 报文来对目标主机进行探测,可能绕过某些防火墙规则。具体理解看 TCP/IP 协议中三步握手讲解。此两个选项默认目标端口是 80 端口,可通过编译时改变 nmap.h 中的 DEFAULT-TCP-PROBE-PORT 值,指定端口时,多个端口用逗号隔开

-PU [portlist]

发送一个空的 UDP 报文(可以用–data-length 指定数据大小,默认为空)对目标主机进行探测,默认目标端口为 31338,可通过编译时改变 nmap.h 中的 DEFAULT-UDP-PROBE-PORT 值,指定端口时,多个端口用逗号隔开

-PE/PP/PM

发送 ICMP 回显请求(ping)/ICMP 时间戳请求/ICMP 地址掩码请求

-PR

发送 ARP 请求,即使指定了其他扫描类型,如果是对局域网进行扫描默认也使用此选项。可以使用–send-ip选项强制关闭 ARP 扫描

-n/R

永不/总是对目标 IP 进行域名解析或反向域名解析(IP 解析为域名为反向域名解析)

-dns-servers

使用指定的 DNS 服务器,可指定多个

--system-dns

使用系统域名解析器,默认使用此主机配置的域名服务器。

3. 端口扫描

4. 服务和版本探测

-sV

打开版本探测,当其他扫描类型发现 TCP/UDP 端口后,此选项会探测该端口是什么服务正在运行。nmap 安装路径下的 nmap-service-probes 数据库包含了查询不同服务的探测报文和解析识别响应的匹配表达式。nmap 会试图确定服务协议、应用程序名、版本号、主机名、设备类型、操作系统家族以及其他细节,如果 nmap 被编译成支持 OpenSSL,他将连接 SSL 服务器推测什么服务在加密层后监听,当发现 RPC 服务时(-sR)会自动打开并确定 RPC 程序和版本号。当扫描一个 UDP 端口时无法确认端口状态时 open or filtered 时,首先会将该端口标记为 open filtered,然后版本探测会对此端口进行探测,如果引发响应则将端口标记为 open

--allports

探测全部端口,nmap 默认会跳过 nmap-service-probes 中 Exclude 指定的端口,使用此选项,可以不理会 Exclude 指示符

--version-intensity <intensity>

设置版本探测强度(0-9),默认为 7

--version-light

轻量模式,即--version-intensity 2

--version-all

最强模式,即--version-intensity 9

--version-trace

跟踪模式,详细打印版本探测扫描的详细信息

--sR

RPC 扫描,-sV会默认打开此选项,所有此选项时配合其他扫描方法使用。此选项会对所有 TCP/UDP 端口执行 sunRPC 程序的 NULL 命令,来试图确定该端口是否时 RPC 端口以及程序名和版本号

5. 操作系统探测

-O

打开操作系统探测。nmap 使用 TCP/IP 协议栈 fingerprinting 进行远程操作系统探测,nmap 发送 TCP/UDP 报文后会检测整个响应报文,并进行 TCP ISN 采样、TCP 选项支持与排序、IPID 采样初始窗口大小检查等,然后将结果与 nmap 安装路径下的 nmap-os-fingerprints 中的已知操作系统的 fingerprints 进行比较,匹配则打印操作系统详细信息。每个 fingerprints 包含系统描述信息和分类信息,包括提供供应商、操作系统、OS 版本、设备类型

--osscan-limit

此选项只能用于-A-O选项进行操作系统检测时,作用是只有当目标主机发现一个 open or closed TCP 端口时才进行操作系统检测,使用-p0扫描多台主机时此选项可以节约时间

--osscan-guess or --fuzzy

当 nmap 无法确定操作系统时默认会匹配相近的可能,这两个选项都可以使这种推测更有效

6. 防火墙/IDS 躲避与欺骗

-f or --mtu

扫描时将 TCP 头分为几个包发送,以躲避包过滤器/IDS 以及其他检测工具,但有的系统在接收分段后的包会出现分段报错,-f会在 IP 头后将包分为 8 字节或更小的包,例如一个 10 字节的 TCP 包会被分为一个 TCP 头为 8 字节的包和一个 TCP 头为 2 字节的包,每个包都会有一个 IP 头。两个-f会将 IP 头后按 16 字节分段--mtu则可以自定义偏移量,但必须是 8 的倍数。如果主机操作系统报错可以使用--send-eth选项避开 IP 层,发送原始的以太网帧

-D <decoy1[,decoy2][,ME]...>

使用指定是诱饵 IP 扫描,ME 代表自己的真实 IP,如果不指定 ME 的位置,则默认会随机使用。诱饵在进行版本检测或 TCP 全连接扫描时无效。此选项后加RND:number可以指定数量的随机诱饵 IP

-S <IP_Address>

使用指定的源 IP 地址进行扫描,当 nmap 无法确定源 IP 时使用,或者用于欺骗目标,常和-e一起使用

-e <interface>

使用指定的网卡接口收发报文

--source-port <portnumber> or -g <portnumber>

使用指定的源端口收发报文,某些目标会信任特定端口发送的数据流,使用此选项可指定目标信任的端口收发数据

--data-length <number>

发送报文时添加随机数据,默认情况时 nmap 发送最少的报文,只包含一个包头,一般 TCP 包为 40 字节,ICMP ECHO 请求为 28 字节,此选项可以添加指定字节的随机数据,-O选项的包不会受影响,但其他扫描的包容易使处理变慢

--ttl <value>

设置指定的 TTL 值,用于 IPv4

--randomize-hosts

对目标主机顺序进行随机排列,最多仅支持 8096 台主机,或者改变 nmap.h 中 PING-GROUP-SZ 的值,并重新编译或者使用列表扫描

--spoof-mac <MAC_Address,prefix or vendor name>

使用指定的 MAC 地址发送以太网帧,此选项隐含--send-eth选项。如果指定的 MAC 是字符“0”,则生成一个完全随机的 MAC 地址。如果是小于 12 的 16 进制数字,则随机填充剩下的 6 个字节,或者指定一个厂商的名称(区分大小写),nmap 会在 nmap-mac-prefixes 中匹配厂商,然后使用厂商的 OUI(3 字节的前缀),然后随机剩下的 3 字节。也可以指定一个标准的 MAC 地址

7. 输出

-oN <filespec>

标准输出,将结果写入指定的文件,文件后缀为.nmap

-oX <filespc>

XML 输出,将结果输出为一个 XML 文件,添加--stylesheet选项可以建立一个可移植的 XML 文件

-oS <filespc>

脚本小子输出

-oG <filespc>

Grep 输出,后缀为.gnmap。每行一个主机,由 6 个标记域组成,方便用 UNIX 工具(grep、awk、cut、sed、diff)和 Perl 查找与分解

-oA <basename>

输出至所有格式.nmap.gnmap.xml

Tips:使用xsltproc可以将xml文件输出为html文件

8. 细节与调试

-v

显示详细的调试信息,最多使用两次

-d [level]

设置调试级别,最高为 9。不设置 level 时是提高当前调试级别,可以多次使用

--open

只显示端口状态是 open 的结果

--packet-trace

跟踪发送和接收的报文

--iflist

列举接口和路由

--append-output

在输出的文件中追加,对 xml 文件无效

--resume <filename>

继续中断的扫描,后面的结果会追加到该文件中,但不支持 xml

--stylesheet <path or URL>

--no-stylesheet

忽略 XML 声明的 XSL 样式表

9. 时间与性能

--host-timeout <milliseconds>

设置主机超时时间,通常设置为 1800000,但这半小时内 nmap 会同时扫描其他主机。超时的主机会被忽略,也就没有结果输出了

--T <Paranid|Polite|Normal|Aggressive|Insane>

设置时间模板,也可以用数字代替每个模板。第一和第二个用于躲避 IDS,默认为第三个,第四个为加速版,第五个为最快版,但会牺牲准确性

10. 其他

-6

启用 IPv6 扫描

-A

激烈扫描模式,启用了-O-sV选项,但不包含时间选项和细节选项

--datadir <directoryname>

说明用户 nmap 数据文件位置,即 nmap-service-probes 等文件的位置

--send-eth

使用源以太网帧发送报文,即在以太网层(数据链路层)而不是 IP(网络层)发送报文

--send-ip

使用原 IP 层发送报文

--privileged

假设用户具有最高权限

-Vor--version

打印版本信息

11. 交互

v/V

增加/减少细节

d/D

提高/降低调试级别

p/P

打开/关闭报文跟踪

脚本引擎(NSE)

  1. 功能:用于网络发现、高级版本检测、漏洞检测、后门检测、漏洞利用

  2. 用法:

    • -sC

      启用默认的脚本检测,等价于--script=default

    • --script=<scriptfile_name|script_category|script_directory|expression>

      使用指定的脚本进行扫描,可以指定脚本名、脚本类别、脚本存放目录、表达式

    • --script-args <args>

      为指定的脚本提供参数,放在脚本调用后

    • --script-args-file <filename>

      以文件方式为指定的脚本提供参数

    • --script-trace

      脚本跟踪功能,打印脚本执行时的所有数据通信,显示通信协议、源地址、目标地址、数据内容

    • --script-help <scriptfile_name|script_category|script_directory|expression|all>

      显示指定脚本的帮助信息

  3. 类别:

    • auth:身份验证凭据的识别或绕过
    • brute:暴力猜解身份验证凭据
    • default:默认的脚本扫描
    • broadcast:局域网发现与服务探测
    • external:利用第三方数据库,例如查询 whois 信息
    • discovery:网络信息收集,例如 smb 枚举、snmp 系统信息查询
    • version:高级版本检测
    • vulu:漏洞检测
    • exploit:漏洞利用
    • malware:后门和恶意软件检测
    • safe:使用大量网络带宽或其他资源利用安全漏洞的脚本,且一般不会使目标服务器崩溃
    • intrusive:和 safe 脚本功能一样,但有可能会使目标崩溃
    • fuzzer:模糊测试脚本,发送异常数据包(意外或随机字段),查找未知错误和漏洞。带宽占用高
    • dos:拒绝服务攻击
  4. 脚本类型和扫描阶段

    • Prerule scripts:用于任何扫描阶段之前,即不需要针对特定目标。也可以使对环境的扫描以生成特定目标
    • Host scripts:针对特定目标的脚本,用于主机发现、端口扫描、版本检测、系统识别后
    • Service scripts:针对目标主机上特定服务
    • Postrule scripts:用于对特定目标扫描后,格式化和呈现扫描结果
  5. 例子

    • nmap --script default,safe:加载 default 和 safe 类别中的所有脚本
    • nmap --script=smb-os-discovery:只加载 smb-os-discovery 脚本
    • nmap --script default,/home/user/customscripts:加载 default 类别和 customscripts 目录下的所有脚本
    • nmap --script="http-*":加载所有以 http 开头的脚本
    • nmap --script "no intrusive":加载除 intrusive 以外的所有脚本
    • nmap --script "default or safe":加载 default 或者 safe 类别中的脚本,等价于--script=default,safe
    • nmap --script="default and safe":加载 default 和 safe 类别中的脚本
    • nmap --script="(default or safe or intrusive) and not http-*":加载 default、safe 或者 intrusive 类别中除了以 http 开头的其他脚本
    • namp --script=snmp-sysdescr --script-args creds.snmp=admin:加载 snmp-sysdescr 脚本,并给该脚本中的 creds.snmp 指定值为 admin