nmap终极使用指南

安全工具 2017-10-26

本文作者:hl0rey

一、目标指定


  1. CIDR标志位 192.168.1.0/24
  2. 指定范围 192.168.1.1-255192.168.1-255.1(任意位置)
  3. IPv6 地址只能用规范的 IPv6 地址或主机名指定。 CIDR 和八位字节范围不支持 IPv6 ,因为它们对于 IPv6 几乎没什么用。

-iL <文件名>

主机名或者 ip 地址列表列表中的项可以是 Nmap 在命令行上接受的任何格式( IP 地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望 Nmap 从标准输入而不是实际文件读取列表, 您可以用一个连字符 (-) 作为文件名。

-iR <数量>

随机选择一定数量的目标

--exclude <主机名/地址>

不包含的主机

--excludefile <文件名>

不包含的主机的列表

二、主机发现


  1. 如果没有给出主机发现的选项,Nmap 就发送一个 TCP ACK 报文到 80 端口和一个 ICMP 回声请求到每台目标机器。
  2. 一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权 UNIX shell 用户,使用 connect() 系统调用会发送一个 SYN 报文而不是 ACK 这些默认行为和使用 -PA -PE 选项的效果相同。
  3. 另外要注意的是即使您指定了其它 -P* 选项,ARP 发现 ( -PR ) 对于局域网上的 目标而言是默认行为,因为它总是更快更有效。

-sL(列表扫描)

列出给出目标的具体内容,默认会对地址进行反向解析,显示主机名。

-sn(不进行端口扫描)

与 -sn 一起完成的默认主机发现包括一个 ICMP 响应请求、 TCP SYN 到端口 443、TCP ACK 到端口 80 ,以及一个 ICMP 的时间戳请求。

在以前的 Nmap 中,-sn 被称为 -sP 。 -sP ( Ping 扫描)选项在默认情况下,发送一个 ICMP 回声请求和一个 TCP 报文到 80 端口。如果非特权用户执行,就发送一个 SYN 报文 ( 用 connect() 系统调用 ) 到目标机的 80 端口。 当特权用户扫描局域网上的目标机时,会发送 ARP 请求 (-PR) ,除非使用了 --send-ip 选项。 -sP 选项可以和除 -P0 之外的任何发现探测类型 -P* 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项,默认的探测 ( ACK 和回应请求) 就被覆盖了。

-Pn(无ping)

跳过主机发现阶段,把每个都 IP 当成存活主机。

-P0 <协议号列表>(IP 协议 ping)

一个较新的主机发现选项是 IP 协议 ping ,它将 IP 数据包发送到IP报头中指定的协议号。协议列表的格式与前面讨论的 TCP、UDP 和 SCTP 主机发现选项的端口列表相同。如果没有指定协议,默认的是为 ICMP (协议 1 )、IGMP ( 协议 2 ) 和 ipin-IP ( 协议 4 ) 发送多个 IP 数据包。默认的协议可以在编译时通过更改 nmap.h 中的默认 proat 探测端口规范来配置。注意,对于 ICMP、IGMP、TCP ( 协议 6 )、UDP( 协议17 )和 SCTP ( 协议 132 ) ,数据包是用适当的协议标头发送的,而其他协议被发送时,除了 IP 报头之外没有附加的数据(除非有任何数据——数据字符串,或者——数据长度选项被指定)。

-PS<端口列表>(TCP SYN Ping)

  1. 该选项发送一个设置了 SYN 标志位的空 TCP 报文,默认端口为 80 。不同的端口可以作为选项制定(如 -PS22,23,25,80,113,1050,3500)
  2. SYN 标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个 RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行 TCP 三步握手的第二步,回应 一个 SYN/ACK TCP 报文。
  3. 无论 RST 还是 SYN/ACK 响应都告诉 Nmap 该主机正在运行。然后运行 Nmap 的机器则会扼杀这个正在建立的连接, 发送一个 RST 而非 ACK 报文, ST 报文是运行 Nmap 的机器而不是 Nmap 本身响应的,因为它对收到 的 SYN/ACK 感到很意外。

-PA<端口列表>(TCP ACK Ping)

  1. ACK 报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个 RST 报文, 因为它们并没有发出过连接请求到运行 Nmap 的机器,如果它们正在运行的话。
  2. 如果非特权用户尝试该功能, 或者指定的是 IPv6 目标,前面说过的 connect() 方法将被使用。 这个方法并不完美,因为它实际上发送的是 SYN 报文,而不是 ACK 报文。
  3. 他的默认端口和修改方法跟 -PS 一致 4.SYN 探测更有可能用于这样的系统,由于没头没脑的 ACK 报文 通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS 又指定 -PA 来即发送 SYN 又发送 ACK 。

-PU <端口列表>(UDP Ping)

  1. 发送一个空的 ( 除非指定了 --data-length UDP 报文到给定的端口。端口列表的格式和前面讨论过的 -PS 和 -PA 选项还是一样。 如果不指定端口,默认是 31338 。修改方法和 -PA -PS 一致
  2. 如果目标机器的端口是关闭的,UDP 探测应该马上得到一个 ICMP 端口无法到达的回应报文。 这对于 Nmap 意味着该机器正在运行。 许多其它类型的 ICMP 错误,像主机/网络无法到达或者 TTL 超时则表示 down 掉的或者不可到达的主机。 没有回应也被这样解释。如果到达一个开放的端口,大部分服务仅仅忽略这个 空报文而不做任何回应。这就是为什么默认探测端口是 31338 这样一个 极不可能被使用的端口。少数服务如 chargen 会响应一个空的 UDP 报文, 从而向 Nmap 表明该机器正在运行。

-PR(ARP Ping)

如果 Nmap 发现目标主机就在它所在的局域网上,它会进行 ARP 扫描。 即使指定了不同的 ping 类型 (如 -PI 或者 -PS ) , Nmap 也会对任何相同局域网上的目标机使用 ARP 。 如果您真的不想要 ARP 扫描,指定 --send-ip 。对于 IPv6 ( -6 选项),-PR 使用 ICMPv6 的邻居发现而不是 ARP 。在 RFC 4861 中定义的邻居发现可以看作是 IPv6 等效的。

--disable-arp-ping (No ARP or ND Ping)

不使用 ARP 发现和 ICMPv6 邻居发现

-PY <端口列表> (SCTP INIT Ping)

  1. 一个 SCTP INIT 数据包,默认端口是 80 ,如果要改变端口可以用如下形式: -PY22、-PY22,80,179,5060。注意 PY 和端口列表之间没有空格。
  2. SCTP INIT 数据包表示本机想跟目标主机关联。一般情况下,目标主机的端口是关闭的,就会返回一个 SCTP 数据包。如果目标主机端口是开放的,它就会回复一个 SCTP INIT-ACK 数据包。如果运行 nmap 的本机支持 SCTP 协议栈的话,本机会给目标主机回复一个 SCTP ABORT 数据包,而不是 SCTP COOKIE-ECHO 数据包,这个数据包是由系统内核发送的,因为他没有去向目标主机发起关联请求。
  3. 本技术用于主机发现,所以不必关心端口是否开放,只要收到回复就可认为主机是存活的。
  4. 在 linux 系统中,特权用户发送和接收 raw SCTP 数据包,非特权用户不支持这个扫描技术。

-PE; -PP; -PM(ICMP Ping Types)

-PE 是 ICMP echo 请求时间戳和地址掩码查询可以分别用 -PP 和 -PM 选项发送。 时间戳响应 ( ICMP 代码 14 ) 或者地址掩码响应 ( 代码 18 ) 表示主机在运行。

-n 不域名解析

-R 所有IP做反向域名解析

--system-dns 使用本机的dns服务器

--dns-servers <server1,server2> (使用指定的dns服务器)

如果指定 dns 服务器无法使用,则会转向使用本机配置的 dns 服务器

三、端口状态


open ( 开放的 )

应用程序正在该端口接收 TCP 连接或者 UDP 报文。

closed ( 关闭的 )

关闭的端口对于 Nmap 也是可访问的 ( 它接受 Nmap 的探测报文并作出响应 ), 但没有应用程序在其上监听。

filtered ( 被过滤的 )

由于包过滤阻止探测报文到达端口,Nmap 无法确定该端口是否开放。

unfiltered ( 未被过滤的 )

未被过滤状态意味着端口可访问,但 Nmap 不能确定它是开放还是关闭。

open|filtered ( 开放或者被过滤的 )

当无法确定端口是开放还是被过滤的,Nmap 就把该端口划分成 这种状态。开放的端口不响应就是一个例子。

closed|filtered ( 关闭或者被过滤的 )

该状态用于 Nmap 不能确定端口是关闭的还是被过滤的。 它只可能出现在 IPID Idle 扫描中

四、端口扫描技术


-sS( TCP SYN 扫描 )

半开放扫描,不打开一个完整的TCP链接它发送一个 SYN 报文,然后等待响应。 SYN/ACK 表示端口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响应,该端口就被标记为被过滤。如果收到 ICMP 不可到达错误 ( 类型 3,代码 1,2,3,9,10,或者 13 ),该端口也被标记为被过滤。

-sT( TCP connect() 扫描 )

Nmap 通过创建 connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 这是和 Web 浏览器,P2P 客户端以及大多数其它网络应用程序用以建立连接一样的 高层系统调用。当 Nmap 连接,然后不发送数据又关闭连接, 许多普通 UNIX 系统上的服务会在 syslog 留下记录,有时候是一条加密的错误消息。

-sU( UDP 扫描 )

1.UDP 扫描用 -sU 选项激活。它可以和 TCP 扫描如 SYN 扫描 ( -sS ) 结合使用来同时检查两种协议。

2.UDP 扫描发送空的(没有数据) UDP 报头到每个目标端口。 如果返回 ICMP 端口不可到达错误 ( 类型 3,代码 3 ), 该端口是 closed ( 关闭的 ) 。 其它 ICMP 不可到达错误 ( 类型 3 , 代码 1,2,9,10,或者 13 ) 表明该端口是 filtered ( 被过滤的 )。 偶尔地,某服务会响应一个 UDP 报文,证明该端口是 open ( 开放的 )。 如果几次重试后还没有响应,该端口就被认为是 open|filtered ( 开放 | 被过滤的 ) 。 这意味着该端口可能是开放的,也可能包过滤器正在封锁通信。 可以用版本扫描 ( -sV ) 帮助区分真正的开放端口和被过滤的端口。

-sY(SCTP INIT scan)

SCTP INIT 扫描类似 TCP SYN 扫描,他也是打开一个半开的连接,而不是建立一个完整的 SCTP 关联。如果目标端口回复一个 INIT-ACK 数据包,则说明端口是开放的,如果回复一个 ABORT 数据包,端口是关闭的,如果没有回复,端口会被标记标记为被过滤,当然如果收到了 ICMP 不可达的消息( type 3, code 0, 1, 2, 3, 9, 10, or 13 )也会被标记为被过滤。

-sN; -sF; -sX ( TCP Null,FIN,Xmas 扫描 )

1.如果扫描系统遵循该 RFC ,当端口关闭时,任何不包含 SYN,RST ,或者 ACK 位的报文会导致 一个 RST 返回,而当端口开放时,应该没有任何响应。只要不包含 SYN,RST,或者 ACK, 任何其它三种 ( FIN,PSH,and URG ) 的组合都行。 Nmap 有三种扫描类型利用这一点:Null 扫描 (-sN)

不设置任何标志位 ( tcp 标志头是 0 )

FIN 扫描 ( -sF )

只设置 TCP FIN 标志位。

Xmas 扫描 ( -sX )

设置 FIN,PSH,和 URG 标志位,就像点亮圣诞树上所有的灯一样。

2.除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个 RST 报文,该端口被认为是 closed ( 关闭的 ),而没有响应则意味着 端口是 open|filtered ( 开放或者被过滤的 )。 如果收到 ICMP 不可到达错误( 类型 3,代号 1,2,3,9,10,或者 13 ),该端口就被标记为 被过滤的。

-sA ( TCP ACK 扫描 )

  1. 这种扫描与目前为止讨论的其它扫描的不同之处在于 它不能确定 open ( 开放的 ) 或者 open|filtered ( 开放或者过滤的 )端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。
  2. ACK 扫描探测报文只设置ACK标志位 ( 除非您使用 --scanflags ) 。当扫描未被过滤的系统时, open ( 开放的 ) 和 closed ( 关闭的 ) 端口 都会返回 RST 报文。Nmap 把它们标记为 unfiltered ( 未被过滤的 ),意思是 ACK 报文不能到达,但至于它们是 open ( 开放的 ) 或者 closed ( 关闭的 ) 无法确定。不响应的端口 或者发送特定的ICMP错误消息 ( 类型 3,代号 1,2,3,9,10, 或者 13 ) 的端口,标记为 filtered ( 被过滤的 ) 。

-sW(TCP窗口扫描)

在某些系统上,开放端口用正数表示窗口大小 ( 甚至对于 RST 报文 ) 而关闭端口的窗口大小为 0 。因此,当收到RST时,窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是 0 ,分别把端口标记为 open 或者 closed

-sM(TCP Maimon扫描)

探测报文是 FIN/ACK。 根据 RFC 793 (TCP) ,无论端口开放或者关闭,都应该对这样的探测响应 RST 报文。 然而,Uriel 注意到如果端口开放,许多基于 BSD 的系统只是丢弃该探测报文。

--scanflags ( 定制的 TCP 扫描 )

--scanflags 选项可以是一个数字标记值如 9 ( PSH 和 FIN ) , 但使用字符名更容易些。 只要是 URG, ACK,PSH, RST,SYN,and FIN 的任何组合就行。例如,--scanflags URGACKPSHRSTSYNFIN 设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。

-sZ(SCTP COOKIE ECHO 扫描 )

如果目标端口开放,则会丢弃之前没有发起关联请求的 SCTP COOKIE ECHO 数据包,如果端口是关闭的则会返回一个 SCTP ABORT 数据包。所以这个扫描技术,无法分辨过滤和开放,只能分辨出关闭的端口。

--sI < 僵尸主机地址:端口 >( idlescan )

  1. 这种高级的扫描方法允许对目标进行真正的 TCP 端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel 攻击 利用 zombie 主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。
  2. 如果您由于 IPID 改变希望探测 zombie 上的特定端口, 您可以在 zombie 主机后加上一个冒号和端口号。 否则 Nmap 会使用默认端口 ( 80 )。

-sO(IP协议扫描)

IP 协议扫描可以让您确定目标机支持哪些 IP 协议 ( TCP,ICMP,IGMP,等等 ) 。从技术上说,这不是端口扫描 ,既然它遍历的是 IP 协议号而不是 TCP 或者 UDP 端口号。 但是它仍使用 -p 选项选择要扫描的协议号, 用正常的端口表格式报告结果,甚至用和真正的端口扫描一样 的扫描引擎。因此它和端口扫描非常接近,也被放在这里讨论。

-b <ftp relay host>(FTP弹跳扫描)

  1. FTP 协议的一个有趣特征 ( RFC 959 ) 是支持所谓代理 ftp 连接。
  2. 它允许用户连接到一台 FTP 服务器,然后要求文件送到一台第三方服务器。 这个特性在很多层次上被滥用,所以许多服务器已经停止支持它了。其中一种就是导致 FTP 服务器对其它主机端口扫描。 只要请求 FTP 服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。
  3. 这是绕过防火墙的好方法,因为 FTP 服务器常常被置于可以访问比 Web 主机更多其它内部主机的位置。
  4. Nmap 用 -b 选项支持 ftp 弹跳扫描。参数格式是 <username>:<password>@<server>:<port><Server> 是某个脆弱的 FTP 服务器的名字或者 IP 地址。 您也许可以省略 <username>:<password>, 如果服务器上开放了匿名用户 ( user:anonymous password:-wwwuser@ ) 。 端口号 ( 以及前面的冒号 ) 也可以省略,如果 <server> 使用默认的 FTP 端口 ( 21 ) 。

五、端口扫描设置


默认情况下,Nmap 用指定的协议对端口 1 到 1024 以及 nmap-services 文件中列出的更高的端口在扫描。

-p < 端口号,端口列表 >

  1. 制定扫描某个或某些端口用逗号分隔,或者用链接符号表示范围也可。
  2. 对于 -sO IP 协议扫描,该选项用来指定协议号( 0-255 )。

--exclede-ports < 端口列表 >( 排除的端口 )

指定排除的端口,如果是指定排除的协议号的话,他的值在 0-255 之间

-F( 快速扫描 )

在 nmap 的 nmap-services 文件中 ( 对于 -sO ,是协议文件)指定您想要扫描的端口。 这比扫描所有 65535 个端口快得多。 因为该列表包含如此多的TCP端口( 1200 多),这和默认的 TCP 扫描 scan ( 大约 1600 个端口)速度差别不是很大。如果用 --datadir 选项指定小的 nmap-services 文件 ,差别会很大。

-r(顺序扫描端口)

默认情况下,Nmap 按随机顺序扫描端口 ( 除了出于效率的考虑,常用的端口前移 )。可以指定 -r 来顺序端口扫描。

--port-ratio <ratio>

扫描 nmap-services 中给出的目标的一定比例,这个值在 1.0-0.0 之间。

--top-ports

扫描 nmap-services 中的前多少个端口。

六.服务和版本扫描


-sV( 版本扫描 )

扫描服务版本,也可以用 -A 同时进行操作系统探测和版本扫描。

--allports(版本扫描时,不排除任何端口)

  1. 默认情况下,Nmap 版本探测会跳过 9100 TCP 端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页 HTTP get 请求,二进制 SSL 会话请求等等被打印出来。
  2. 这一行为可以通过修改或删除 nmap-service-probes 中的 Exclude 指示符改变

--version-intensity <强度>(版本扫描强度)

强度在 1 到 9 之间,一般来说,强度越大,服务越有可能被正确识别

--version-light

相当于 --version-intensity 2

--vension-all

相当于 --version-intensity 9

--version-trace

打印出正在进行的版本扫描的详细信息

七、操作系统探测


-O (启用操作系统检测)

也可以使用 -A 来同时启用操作系统检测和版本扫描。

--osscan-limit

只对至少知晓一个端口开放或者关闭的主机进行操作系统探测

--osscan-guess;--fuzzy

无法确定操作系统类型的时候,默认进行推测。但是使用这两项,会让猜测更加准确。

--max-os-tries(操作系统识别重试次数)

默认重试五次,

八、扫描性能设置


--min-hostgroup <milliseconds>; --max-hostgroup <milliseconds> (调整并行扫描组的大小)

  1. Nmap 具有并行扫描多主机端口或版本的能力,Nmap 将多个目标IP地址 空间分成组,然后在同一时间对一个组进行扫描。通常,大的组更有效。缺点是只有当整个组扫描结束后才会提供主机的扫描结果。如果组的大小定义为 50 ,则只有当前 50 个主机扫描结束后才能得到报告 ( 详细模式中的补充信息 除外 )。
  2. 默认方式下,Nmap 采取折衷的方法。开始扫描时的组较小,最小为 5 ,这样便于尽快产生结果;随后增长组的大小,最大为 1024 。确切的 大小依赖于所给定的选项。为保证效率,针对 UDP 或少量端口的 TCP 扫描,Nmap 使用大的组。--max-hostgroup 选项用于说明使用最大的组,Nmap 不会超出这个大小。--min-hostgroup 选项说明最小的组,Nmap 会保持组大于这个值。如果在指定的接口上没有足够的目标主机来满足所指定的最小值,Nmap 可能会采用比所指定的值小的组。这两个参数虽然很少使用, 但都用于保持组的大小在一个指定的范围之内。
  3. 这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速。通常选择 256 来扫描C类网段。对于端口数较多的扫描,超出该值没有意义。对于端口数较少的扫描,2048 或更大的组大小是有帮助的。

--min-parallelism <milliseconds>; --max-parallelism <milliseconds> ( 调整探测报文的并行度 )

这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下,Nmap 基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃,Nmap 降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值 可能为 1 ,在好的条件下,可能会增长至几百。最常见的应用是 --min-parallelism 值大于 1 ,以加快 性能不佳的主机或网络的扫描。这个选项具有风险,如果过高则影响准确度,同时也会降低 Nmap 基于网络条件动态控制并行度的能力。这个值设为 10 较为合适, 这个值的调整往往作为最后的手段。

--max-parallelism选项通常设为1,以防止Nmap在同一时间 向主机发送多个探测报文,和选择--scan-delay同时使用非常有用。

--min-rtt-timeout <milliseconds>, --max-rtt-timeout <milliseconds>, --initial-rtt-timeout <milliseconds> (调整探测报文超时)

Nmap 使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新 发送探测报文。Nmap 基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著 和不定,这个超时值会增加几秒。初始值的比较保守 ( 高 ) ,而当 Nmap 扫描无响应 的主机时,这个保守值会保持一段时间。这些选项以毫秒为单位,采用小的 --max-rtt-timeout 值,使 --initial-rtt-timeout 值大于默认值可以明显减少扫描时间,特别 是对不能 ping 通的扫描 ( -P0 ) 以及具有严格过滤的网络。如果使用太 小的值,使得很多探测报文超时从而重新发送,而此时可能响应消息正在发送,这使得整个扫描的时 间会增加。如果所有的主机都在本地网络,对于--max-rtt-timeout值来 说,100 毫秒比较合适。如果存在路由,首先使用ICMP ping 工具 ping 主机,或使用其 它报文工具如 hpings ,可以更好地穿透防火墙。查看大约 10 个包的最大往返时间,然后将 --initial-rtt-timeout 设成这个时间的2倍,--max-rtt-timeout 可设成这个时间值的3倍或4倍。通常,不管 ping 的时间是多少,最大的 rtt 值不得小于 100ms , 不能超过 1000ms 。--min-rtt-timeout 这个选项很少使用,当网络不可靠时, Nmap 的默认值也显得过于强烈,这时这个选项可起作用。当网络看起来不可靠时,Nmap 仅将 超时时间降至最小值,这个情况是不正常的,需要向 nmap-dev 邮件列表报告 bug 。

--host-timeout <milliseconds> ( 放弃低速目标主机 )

由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因, 一些主机需要很长的时间扫描。这些极少数的主机扫描往往占 据了大部分的扫描时间。因此,最好的办法是减少时间消耗并且忽略这些主机,使用 --host-timeout 选项来说明等待的时间(毫秒)。通常使用 1800000 来保证 Nmap 不会在单个主机上使用超过半小时的时间。需要注意的是,Nmap 在这半小时中可以 同时扫描其它主机,因此并不是完全放弃扫描。超时的主机被忽略,因此也没有针对该主机的 端口表、操作系统检测或版本检测结果的输出。

--scan-delay <milliseconds>; --max-scan-delay <milliseconds> ( 调整探测报文的时间间隔 )

这个选项用于 Nmap 控制针对一个主机发送探测报文的等待时间(毫秒),在带宽 控制的情况下这个选项非常有效。Solaris 主机在响应 UDP 扫描探测报文报文时,每秒 只发送一个 ICMP 消息,因此 Nmap 发送的很多数探测报文是浪费的。--scan-delay 设为 1000,使 Nmap 低速运行。Nmap 尝试检测带宽控制并相应地调整扫描的延迟,但并不影响明确说明何种速度工作最佳。--scan-delay 的另一个用途是躲闭基于阈值的入侵检测和预防 系统 ( IDS/IPS )。

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> ( 设置时间模板 )

上述优化时间控制选项的功能很强大也很有效,但有些用户会被迷惑。此外, 往往选择合适参数的时间超过了所需优化的扫描时间。因此,Nmap 提供了一些简单的 方法,使用 6 个时间模板,使用时采用 -T 选项及数字 ( 0 - 5 ) 或名称。模板名称有 paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4) 和 insane (5)。前两种模式用于 IDS 躲避,Polite 模式降低了扫描 速度以使用更少的带宽和目标主机资源。默认模式为 Normal,因此 -T3 实际上是未做任何优化。Aggressive 模式假设用户具有合适及可靠的网络从而加速 扫描。Insane 模式假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。用户可以根据自己的需要选择不同的模板,由 Nmap 负责选择实际的时间值。 模板也会针对其它的优化控制选项进行速度微调。例如,-T4 针对 TCP 端口禁止动态扫描延迟超过 10ms ,-T5 对应的值为 5ms 。 模板可以和优化调整控制选项组合使用,但模板必须首先指定,否则模板的标准值 会覆盖用户指定的值。建议在扫描可靠的网络时使用 -T4 ,即使 在自己要增加优化控制选项时也使用 ( 在命令行的开始 ) ,从而从这些额外的较小的优化 中获益。如果用于有足够的带宽或以太网连接,仍然建议使用 -T4 选项。 有些用户喜欢 -T5 选项,但这个过于强烈。有时用户考虑到避免使主机 崩溃或者希望更礼貌一些会采用 -T2 选项。他们并没意识到 -T Polite 选项是如何的慢,这种模式的扫描比默认方式实际上要多花 10 倍的时间。默认时间 选项 ( -T3 ) 很少有主机崩溃和带宽问题,比较适合于谨慎的用户。不进行 版本检测比进行时间调整能更有效地解决这些问题。虽然 -T0 和 -T1 选项可能有助于避免 IDS 告警,但在进行上千个主机或端口扫描时,会显著增加时间。对于这种长时间的扫描,宁可设定确切的时间值,而不要去依赖封装的 -T0 和 -T1 选项。T0 选项的主要影响是对于连续扫描,在一个时间只能扫描一个端口, 每个探测报文的发送间隔为 5 分钟。T1 和 T2 选项比较类似, 探测报文间隔分别为 15 秒和 0.4 秒。 T3 是 Nmap 的默认选项,包含了并行扫描。 T4 选项与 --max-rtt-timeout 1250 --initial-rtt-timeout 500 等价,最大 TCP 扫描延迟为 10ms 。T5 等价于 --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --host-timeout 900000,最大 TCP 扫描延迟为 5ms。

--max-retries < 次数 >

没有响应后的重试次数

--script-timeout <time> ( 设置脚本超时时间 )

预防脚本的bug导致影响效率

--min-rate <number>; --max-rate <number> ( 发包速度控制 )

最少每秒发多少,最多每秒发多少。如果 0.1 的话就是 10 秒一个包的意思

--defeat-rst-ratelimit

忽略系统 reset 包的速率限制

--defeat-icmp-ratelimit

忽略系统 ICMP 错误消息速率限制

--nsock-engine epoll|kqueue|poll|select

选择系统 IO 模型,nmap -V 可以查看支持哪些

九、防火墙绕过/ IDS 躲避

-f ( 报文分段 ); --mtu ( 使用指定的MTU )

  1. -f 选项要求扫描时 ( 包挺 ping 扫描)使用小的 IP 包分段。其思路是将 TCP 头分段在几个包中,使得包过滤器、IDS 以及其它工具的检测更加困难。必须小心使用这个选项,有些系统在处理这些小包时存在问题,例如旧的网络嗅探器 Sniffit 在接收到第一个分段时会立刻出现分段错误。该选项使用一次, Nmap 在 IP 头后将包分成 8 个字节或更小。因此,一个 20 字节的 TCP 头会被分成 3 个包,其中 2 个包分别有TCP头的 8 个字节,另 1 个包有 TCP 头的剩下 4 个字节。当然,每个包都有一个 IP 头。再次使用 -f 可使用 16 字节的分段 ( 减少分段数量 ) 。
  2. 使用 --mtu 选项可以自定义偏移的大小,使用时不需要 -f ,偏移量必须是 8 的倍数。包过滤器和防火墙对所有的 IP 分段排队,如 Linux 核心中的 CONFIG-IP-ALWAYS-DEFRAG 配置项,分段包不会直接使用。一些网络无法 承受这样所带来的性能冲击,会将这个配置禁止。其它禁止的原因有分段 包会通过不同的路由进入网络。一些源系统在内核中对发送的报文进行分段,使用 iptables 连接跟踪模块的 Linux 就是一个例子。当使用类似 Ethereal 的嗅探器时,扫描必须保证发送的报文要分段。如果主机操作系统会产生问题,尝试使用 --send-eth 选项以避开 IP 层而直接发送原始的以太网帧。

-D <肉鸡1 ,肉鸡2,...>( 结合肉鸡干扰进行扫描 )

首先必须让目标主机认为是肉鸡在扫描它,IDS 虽然能够捕捉到扫描的 IP ,但是并知道哪个是真实的攻击者,使用逗号来分隔每个肉鸡,如果使用了ME 选项,nmap 将不会使用本机地址,否则 nmap 将会把本机地址放在一个随机位置。注意,太多的欺骗包甚至可能造成 DDoS 的效果,而且很多多 IPS 会过滤欺骗包

-S <IP地址>( 源地址欺骗 )

伪造扫描请求源地址。在某些情况下,Nmap 可能无法确定你的源地址 ( 如果这样,Nmap 会给出 提示 )。此时,使用 -S 选项并说明所需发送包的接口 IP 地址。-e 选项常在这种情况下使用,也可采用 -P0 选项。

-e <interface>( 指定使用的网络接口 )

告诉 nmap 使用哪个网络接口收发报文

--source-port <portnumber>; -g <portnumber> ( 源端口欺骗 )

只需要提供一个端口号,Nmap 就可以从这些 端口发送数据。为使特定的操作系统正常工作,Nmap 必须使用不同的端口号。 DNS 请求会忽略 --source-port 选项,这是因为 Nmap 依靠系 统库来处理。大部分 TCP 扫描,包括 SYN 扫描,可以完全支持这些选项,UDP 扫描同样如此。

--date <hex string>

可以用这样的格式指定值 --data 0xdeadbeef --data xCAxFEx09 如果指定 0x00ff 这个的数字,将不会做字节序转换。确保你的字节序,对方可以接受

--data-string <string>

例如,--data-string "Scan conducted by Security Ops, extension 7192" or --data-string "Ph34r my l33t skills"

--data-length <number> ( 发送报文时 附加随机数据 )

这个选项告诉 Nmap 在发送的报文上 附加指定数量的随机字节。操作系统检测 ( -O )包不受影响。

--ip-options <S|R [route]|L [route]|T|U ... >;

--ip-options <hex string> (Send packets with specified ip options)

指定IP头

--proxies <Comma-separated list of proxy URLs>

设置代理,支持 http 代理和 socks4 代理

--badsum( 让 nmap 使用一个伪造的不合法的 checksum )

这样的数据包一般都会丢弃,如果收到任何回复,这个回复一定来自防火墙

--adler32( 使用弃用的 Adler32 来代替 CRC32C 做 SCTP 的 checksum )

这是为了从旧版的 SCTP 协议设备获得响应

--ttl <value> ( 设置 IP time-to-live 域)

设置 IPv4 报文的 time-to-live 域为指定的值。

--randomize-hosts ( 对目标主机的顺序随机排列 )

告诉 Nmap 在扫描主机前对每个组中的主机随机排列,最多可达 8096 个主机。

--spoof-mac <mac address,prefix,or vendor name> ( MAC 地址哄骗 )

要求 Nmap 在发送原以太网帧时使用指定的 MAC 地址,这个选项隐含了 --send-eth 选项,以保证 Nmap 真正发送以太网包。MAC 地址有几种格式。如果简单地使用字符串“ 0 ”,Nmap 选择一个完全随机的 MAC 地址。如果给定的字符品是一个 16 进制偶数 ( 使用 : 分隔 ),Nmap 将使用这个 MAC 地址。 如果是小于 12 的 16 进制数字,Nmap 会随机填充剩下的 6 个字节。如果参数不是 0 或 16 进 制字符串,Nmap 将通过 nmap-mac-prefixes 查找 厂商的名称 ( 大小写区分 ) ,如果找到匹配,Nmap 将使用厂商的 OUI ( 3 字节前缀 ),然后 随机填充剩余的 3 个节字。正确的 --spoof-mac 参数有, Apple, 0,01:02:03:04:05:06, deadbeefcafe,0020F2, 和 Cisco。

十、输出


-oN <filespec> (标准输出)

将结果输入制定文件

-oX <filespec> (XML输出)

将XML输出写入指定文件

-oS <filespec> (ScRipT KIdd|3 oUTpuT)

脚本小子输出类似于交互工具输出,这是一个事后处理,适合于 'l33t HaXXorZ, 由于原来全都是大写的Nmap输出。

-oG <filespec> (Grep输出)

这种方式最后介绍,因为不建议使用。XML输格式很强大,便于有经验 的用户使用。XML是一种标准,由许多解析器构成,而Grep输届更简化。XML是可扩展的,以支持新发布的Nmap特点。使用Grep输出的目的是忽略这些 特点,因为没有足够的空间。然而,Grep输出仍然很常使用。它是一种简单格式,每行一个主机,可以 通过UNIX工具(如grep、awk、cut、sed、diff)和Perl方便地查找和分解。常可 用于在命令行上进行一次性测式。查找ssh端口打开或运行Sloaris的主机,只需要一个简单的grep主机说明,使用通道并通过awk或cut命令打印所需的域。Grep输出可以包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及 冒号分隔。这些域有主机,端口, 协议,忽略状态,操作系统,序列号, IPID和状态。这些域中最重要的是Ports,它提供了所关注的端口的细节,端口项由逗号分隔。每个端口项代表一个所关注的端口,每个子域由/分隔。这些子域有:端口号, 状态,协议, 拥有者,服务, SunRPCinfo 和版本信息。对于XML输出,本手册无法列举所有的格式,有关Nmap Grep输出的更详细信息可 查阅http://www.unspecific.com/nmap-oG-output

-oA <basename> ( 输出至所有格式 )

为使用方便,利用 -oA<basename> 选项 可将扫描结果以标准格式、 XML 格式和 Grep 格式一次性输出。分别存放在 <basename>.nmap ,<basename>.xml 和 <basename>.gnmap 文件中。也可以在文件名前 指定目录名,如在UNIX中,使用 ~/nmaplogs/foocorp/, 在 Window 中,使用 c:\hacking\sco on Windows

-v( 提高输出信息的详细程度 )

-d [level]( 设置调试级别 )

--packet-trace( 跟踪发出的报文 )

-iflist( 列举端口和路由 )

--append-out( 在输出文件住追加 )

但对于 XML ( -oX )扫描输出 文件无效,无法正常解析,需要手工修改。

--resume <filename> ( 继续中断的扫描 )

如果标准扫描 ( -oN ) 或 Grep 扫描 ( -oG ) 日志 被保留,用户可以要求 Nmap 恢复终止的扫描,只需要简单地使用选项 --resume 并说明标准 /Grep 扫描输出文件,不允许 使用其它参数,Nmap 会解析输出文件并使用原来的格式输出。使用方式如 nmap --resume <logfilename>。Nmap 将把新地结果添加到文件中,这种方式不支持 XML 输出格式,原因是将两次运行结果合并至一个XML文件比较困难。

--stylesheet <path or URL> (设置XSL样式表,转换XML输出)

--webxml

--stylesheet https://nmap.org/svn/docs/nmap.xsl 的简写。

--no-stylesheet (忽略 XML 声明的 XSL 样式表)

--open

只显示开放或者可能开放的端口

--stats-every <time>(周期性的输出统计数据)

--stats-every 10s 每 10 秒输出一次,这个输出会被输出到标准输出,和 XML 文件

--reason(打印主机和端口状态的原因)

十一、其他选项


-A(强力扫描模式)

个选项启用了操作系统检测 ( -O ) 和版本扫描 ( -sV ),以后会增加更多的功能。 目的是启用一个全面的扫描选项集合,不需要用户记忆大量的 选项。这个选项仅仅启用功能,不包含用于可能所需要的 时间选项 ( 如 -T4 ) 或细节选项 ( -v )。

--datadir <文件夹名称> ( 说明 nmap 用户数据文件的位置 )

Nmap 在运行时从文件中获得特殊的数据,这些文件有 nmap-service-probes, nmap-services, nmap-protocols, nmap-rpc, nmap-mac-prefixes 和 nmap-os-fingerprints 。Nmap 首先 在 --datadir 选项说明的目录中查找这些文件。 未找到的文件,将在 BMAPDIR 环境变量说明的目录中查找。 接下来是用于真正和有效 UID 的 ~/.nmap 或 Nmap 可执行代码的位置 ( 仅 Win32 ) ;然后是是编译位置,如 /usr/local/share/nmap/usr/share/nmap。 Nmap 查找的最后一个位置是当前目录。

--send-ip (在原IP层发送)

要求 Nmap 通过原 IP 套接字发送报文,而不是低层的以 太网帧。这是 --send-eth 选项的补充。

--send-eth

使用 raw ethernet 包来发包

--privileged (假定用户具有全部权限)

告诉 Nmap 假定其具有足够的权限进行源套接字包发送、 报文捕获和类似 UNIX 系统中根用户操作的权限。默认状态下, 如果由 getuid() 请求的类似操作不为 0 ,Nmap 将退出。 --privileged 在具有 Linux 内核性能的类似 系统中使用非常有效,这些系统配置允许非特权用户可以进行 原报文扫描。需要明确的是,在其它选项之前使用这些需要权 限的选项 ( SYN 扫描、操作系统检测等 )。 Nmap-PRIVILEGED 变量 设置等价于 --privileged 选项。

--unprivileged( 假定用户没有特权 )

--interactive ( 在交互模式中启动 )

在交互模式中启动 Nmap ,提供交互式的 Nmap 提示,便于 进行多个扫描(同步或后台方式)。对于从多用户系统中扫描 的用户非常有效,这些用户常需要测试他们的安全性,但不希望 系统中的其它用户知道他们扫描哪些系统。使用 --interactive 激活这种方式,然后输入 h 可 获得帮助信息。由于需要对正确的 shell 程序和整个功能非常熟悉, 这个选项很少使用。这个选项包含了一个!操作符,用于执行 shell 命令, 这是不安装 Nmap setuid root 的多个原因之一。

--release-memory ( 退出后 namp 自己释放内存)

--servicedb <services file>

nmap-service 文件的路径

--versiondb <service probes file>

nmap-service-probes 文件路径

-V;--version (查看版本)

-h;--help(简要的使用介绍)

十二、NSE脚本引擎


https://nmap.org/nsedoc/ 具体脚本的使用手册

--script <脚本名>

脚本名字前面加 + 会让脚本强制执行指定名字的时候可以使用 shell 风格的通配符 "*"。

nmap --script "http-*"

加载所有的名字以 http- 开头的脚本,必须用引号包起来,让通配符不受 shell 影响。

nmap --script "not intrusive"

加载所有非入侵类型的脚本

nmap --script "default or safe"

在功能上等同于 nmap --script "default,safe" 加载了所有默认类或者安全类,或者是两者都包含的。

nmap --script "default and safe"

加载在同属于两者的脚本

nmap --script "(default or safe or intrusive) and not http-*"

加载属于默认类或者安全类或者入侵类的但是名字开头不是 http- 的脚本

--script-args <n1>=<v1>,<n2>={<n3>=<v3>},<n4>={<v4>,<v5>}

指定脚本参数,里面不能有 ‘{’, ‘}’, ‘=’, or ‘,’,如果要用就用 转义

--script-args-file <filename>

从一个文件获取脚本参数

--script-trace

打印出脚本执行的具体信息

--script-updatedb

更新脚本库


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论