简介
此文是我从我的笔记中转移过来的,记录了 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. 端口扫描
-
端口状态
open
:应用程序正在该端口接收 TCP 连接或 UDP 报文closed
:没有应用程序对该端口进行监听,但对 nmap 来说关闭的端口也是可以访问的,可用于主机发现和部分操作系统的探测filtered
:包过滤阻止探测报文到达的端口,可能是防火墙设备、路由规则、软件防火墙等,且一般包过滤会直接丢弃报文而不做任何响应,类似于网络堵塞造成的包丢失unfiltered
:未过滤表示可访问,但无法确定端口是开启还是关闭,只有映射防火墙规则集的 ACK 扫描会出现这种状态,用其他扫描方式可以确定端口状态open|filtered
:无法确定端口是开放还是被过滤,例如开放端口的不响应。UDP、IP 协议、FIN、Null 和 Xmas 扫描可能出现这种端口状态closed|filtered
:无法确定端口是关闭还是被过滤,只出现在 IPID Idle 扫描中
-
扫描技术
-sS
半开放扫描,发送一个 SYN 报文,等待对方响应。然后丢弃报文,并不会真正产生连接。SYN/ACK 表示端口在监听,RST 表示没有监听。数次重发后仍无响应则标记为被过滤,如果返回 ICMP 不可到达,该端口也标记为被过滤
-sT
全连接扫描,当 SYN 无法使用时使用,占用更多的资源,更容易暴露自己(因权限问题,会需要调用)
-sU
UDP 扫描,发送一个空的 UDP 报头到目标端口,可以和 TCP 扫描一起使用来同时检测两种协议。当目标端口返回 ICMP 端口不可达错误时有两种情况:第一种(类型 3,代码 3)则该端口被标记为 closed。第二种(类型 3,代码 1,2,9,10,13)则该端口被标记为 filtered。如果某个端口的服务响应一个 UDP 报文,则该端口标记为 open,如果一直无响应,则该端口标记为 open filtered。使用版本检测 -sV
可以区分 open or filtered。-sN/sF/sX
不设置任何标志位(即 TCP 标志头是 0)/只设置 FIN 标志位/设置 FIN、PSH、URG 标志位。如果目标返回 RST 报文,则端口标记为 closed。如果目标无响应,则端口标记为 open filtered。如果返回 ICMP 不可达错误,则端口标记为 filtered。这三种方法比 -sS
更为隐蔽,但并非所有系统都严格遵循 RFC793,许多系统不管端口 open 还是 closed 都响应 RST,主要有 Microsoft Windows、许多 Cisco 设备、BSDI、IBM OS/400-sM
与 Null、FIN、Xmas 扫描一致,但探测报文是 FIN/ACK,根据 RFC 793(TCP)无论端口开放还是关闭对这样的探测都会做出响应,但许多基于 BSD 的系统,当端口开放时会丢弃该探测报文
-sA
设置 ACK 标志位,此选项无法确定目标端口的具体状态,主要用于发现防火墙规则。目标端口返回 RST,则标记为 unfiltered。目标端口无响应或返回特定的 ICMP 错误,则标记为 filtered
-sW
通过检查返回的 RST 报文中的 TCP 窗口域的值来判断端口状态是 open or closed。某些特定系统开放的端口用正数表示窗口大小,而关闭端口的窗口大小为 0,不支持的系统则会返回所有端口为 closed。
--scanflags <TCP_Flags>
定制的 TCP 扫描,运行指定任意 TCP 标志位。TCP_Flags 可以用数字表示,也可以用字符名(URG/ACK/PSH/RST/SYN/FIN),标志位顺序不重要。此选项可以和其他 TCP 扫描选项共用(如
-sF
),当使用其他扫描选项时,其他扫描选项规定了如何解释响应。不指定则默认使用 SYN 扫描解释响应。-sO
IP 协议扫描,用来确定目标主机支持哪些 IP 协议(如 TCP/ICMP/IGMP 等),它也使用 -p
选项指定要扫描的协议号。和 UDP 扫描类似,但不是在 UDP 端口域循环,而是在 IP 协议域的 8 位上循环,发送的时 IP 报文,报文头为空,而 TCP/UDP/ICMP 扫描发送的是正常的协议头,且 IP 协议扫描是注意ICMP 协议不可到达消息而不是ICMP 端口不可到达消息。当收到任何协议响应,则将该协议标记为 open;收到协议不可到达消息错误(类型 3,代码 2),则将该协议标记为 closed;收到协议不可到达消息错误(类型 3,代码 1/3/9/10/13),则将该协议标记为 filtered(也表明该协议为 open),如果重试后还是没有收到响应,则将该协议标记为 openfiltered -sI <zombie host[:probeport]>
使用僵尸主机进行扫描,默认探测僵尸主机的 80 端口。(还需仔细研究)
-b <[username:password]@FTP_relay_host[:port]>
FTP 弹跳扫描,因为 FTP 协议支持代理 FTP 连接,所以可以先连接一台 FTP 服务器,然后要求该 FTP 服务器发送文件至目标端口进行探测。当 FTP 服务器上开放了匿名用户(username:anonymous/password:-wwwuser@),则可以省略 username:password 选项,当 FTP 服务器使用默认的 21 端口时可以省略端口号
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
假设用户具有最高权限
-V
or--version
打印版本信息
11. 交互
v/V
增加/减少细节
d/D
提高/降低调试级别
p/P
打开/关闭报文跟踪
脚本引擎(NSE)
-
功能:用于网络发现、高级版本检测、漏洞检测、后门检测、漏洞利用
-
用法:
-
-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>
显示指定脚本的帮助信息
-
-
类别:
- auth:身份验证凭据的识别或绕过
- brute:暴力猜解身份验证凭据
- default:默认的脚本扫描
- broadcast:局域网发现与服务探测
- external:利用第三方数据库,例如查询 whois 信息
- discovery:网络信息收集,例如 smb 枚举、snmp 系统信息查询
- version:高级版本检测
- vulu:漏洞检测
- exploit:漏洞利用
- malware:后门和恶意软件检测
- safe:使用大量网络带宽或其他资源利用安全漏洞的脚本,且一般不会使目标服务器崩溃
- intrusive:和 safe 脚本功能一样,但有可能会使目标崩溃
- fuzzer:模糊测试脚本,发送异常数据包(意外或随机字段),查找未知错误和漏洞。带宽占用高
- dos:拒绝服务攻击
-
脚本类型和扫描阶段
- Prerule scripts:用于任何扫描阶段之前,即不需要针对特定目标。也可以使对环境的扫描以生成特定目标
- Host scripts:针对特定目标的脚本,用于主机发现、端口扫描、版本检测、系统识别后
- Service scripts:针对目标主机上特定服务
- Postrule scripts:用于对特定目标扫描后,格式化和呈现扫描结果
-
例子
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