一、目标指定
1. CIDR标志位
192.168.1.0/24
2. 指定范围
192.168.1.1-255 / 192.168.1-255.1(任意位置)
3. IPv6 地址
只能用规范的 IPv6 地址或主机名指定。 CIDR 和八位字节范围不支持 IPv6 , 因为它们对于 IPv6 几乎没什么用。
4. -iL <文件名>
主机名或者 ip 地址列表列表中的项可以是 Nmap 在命令行上接受的任何格式( IP 地址, 主机名, CIDR, IPv6, 或者八位字节范围)。 每一项必须以一个或多个空格, 制表符或换行符分开。 如果您希望 Nmap 从标准输入而不是实际文件读取列表, 您可以用一个连字符 (-) 作为文件名。
5. -iR <数量>
6. 随机选择一定数量的目标
–exclude <主机名/地址>
7. 不包含的主机
–excludefile <文件名>
二、主机发现
如果没有给出主机发现的选项, Nmap 就发送一个 TCP ACK 报文到 80 端口和一个 ICMP 回声请求到每台目标机器。
一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权 UNIX shell 用户, 使用 connect() 系统调用会发送一个 SYN 报文而不是 ACK 这些默认行为和使用 -PA -PE 选项的效果相同。
另外要注意的是即使您指定了其它 -P* 选项, ARP 发现 ( -PR ) 对于局域网上的 目标而言是默认行为, 因为它总是更快更有效。
1. -sL(列表扫描)
列出给出目标的具体内容, 默认会对地址进行反向解析, 显示主机名。
2. -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 和回应请求) 就被覆盖了。
3. -Pn(无ping)
跳过主机发现阶段, 把每个都 IP 当成存活主机。
4. -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 报头之外没有附加的数据(除非有任何数据——数据字符串, 或者——数据长度选项被指定)。
5. -PS<端口列表>(TCP SYN Ping)
该选项发送一个设置了 SYN 标志位的空 TCP 报文, 默认端口为 80 。不同的端口可以作为选项制定(如 -PS22, 23, 25, 80, 113, 1050, 3500)
SYN 标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的, 一个 RST (复位) 包会发回来。 如果碰巧端口是开放的, 目标会进行 TCP 三步握手的第二步, 回应 一个 SYN/ACK TCP 报文。
无论 RST 还是 SYN/ACK 响应都告诉 Nmap 该主机正在运行。然后运行 Nmap 的机器则会扼杀这个正在建立的连接, 发送一个 RST 而非 ACK 报文, ST 报文是运行 Nmap 的机器而不是 Nmap 本身响应的, 因为它对收到 的 SYN/ACK 感到很意外。
6. -PA<端口列表>(TCP ACK Ping)
ACK 报文表示确认一个建立连接的尝试, 但该连接尚未完全建立。 所以远程主机应该总是回应一个 RST 报文, 因为它们并没有发出过连接请求到运行 Nmap 的机器, 如果它们正在运行的话。
如果非特权用户尝试该功能, 或者指定的是 IPv6 目标, 前面说过的 connect() 方法将被使用。 这个方法并不完美, 因为它实际上发送的是 SYN 报文, 而不是 ACK 报文。
他的默认端口和修改方法跟 -PS 一致 4.SYN 探测更有可能用于这样的系统, 由于没头没脑的 ACK 报文 通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS 又指定 -PA 来即发送 SYN 又发送 ACK 。
7. -PU <端口列表>(UDP Ping)
发送一个空的 ( 除非指定了 –data-length UDP 报文到给定的端口。端口列表的格式和前面讨论过的 -PS 和 -PA 选项还是一样。 如果不指定端口, 默认是 31338 。修改方法和 -PA -PS 一致
如果目标机器的端口是关闭的, UDP 探测应该马上得到一个 ICMP 端口无法到达的回应报文。 这对于 Nmap 意味着该机器正在运行。 许多其它类型的 ICMP 错误, 像主机/网络无法到达或者 TTL 超时则表示 down 掉的或者不可到达的主机。 没有回应也被这样解释。如果到达一个开放的端口, 大部分服务仅仅忽略这个 空报文而不做任何回应。这就是为什么默认探测端口是 31338 这样一个 极不可能被使用的端口。少数服务如 chargen 会响应一个空的 UDP 报文, 从而向 Nmap 表明该机器正在运行。
8. -PR(ARP Ping)
如果 Nmap 发现目标主机就在它所在的局域网上, 它会进行 ARP 扫描。 即使指定了不同的 ping 类型 (如 -PI 或者 -PS ) , Nmap 也会对任何相同局域网上的目标机使用 ARP 。 如果您真的不想要 ARP 扫描, 指定 –send-ip 。对于 IPv6 ( -6 选项), -PR 使用 ICMPv6 的邻居发现而不是 ARP 。在 RFC 4861 中定义的邻居发现可以看作是 IPv6 等效的。
9. –disable-arp-ping (No ARP or ND Ping)
不使用 ARP 发现和 ICMPv6 邻居发现
10. -PY <端口列表> (SCTP INIT Ping)
一个 SCTP INIT 数据包, 默认端口是 80 ,如果要改变端口可以用如下形式: -PY22、-PY22,80,179,5060。注意 PY 和端口列表之间没有空格。
SCTP INIT 数据包表示本机想跟目标主机关联。一般情况下, 目标主机的端口是关闭的, 就会返回一个 SCTP 数据包。如果目标主机端口是开放的, 它就会回复一个 SCTP INIT-ACK 数据包。如果运行 nmap 的本机支持 SCTP 协议栈的话, 本机会给目标主机回复一个 SCTP ABORT 数据包, 而不是 SCTP COOKIE-ECHO 数据包, 这个数据包是由系统内核发送的, 因为他没有去向目标主机发起关联请求。
本技术用于主机发现, 所以不必关心端口是否开放, 只要收到回复就可认为主机是存活的。
在 linux 系统中, 特权用户发送和接收 raw SCTP 数据包, 非特权用户不支持这个扫描技术。
11. -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 服务器
三、端口状态
1. open ( 开放的 )
应用程序正在该端口接收 TCP 连接或者 UDP 报文。
2. closed ( 关闭的 )
关闭的端口对于 Nmap 也是可访问的 ( 它接受 Nmap 的探测报文并作出响应 ), 但没有应用程序在其上监听。
3. filtered ( 被过滤的 )
由于包过滤阻止探测报文到达端口, Nmap 无法确定该端口是否开放。
4. unfiltered ( 未被过滤的 )
未被过滤状态意味着端口可访问, 但 Nmap 不能确定它是开放还是关闭。
5. open|filtered ( 开放或者被过滤的 )
当无法确定端口是开放还是被过滤的, Nmap 就把该端口划分成 这种状态。开放的端口不响应就是一个例子。
6. closed|filtered ( 关闭或者被过滤的 )
该状态用于 Nmap 不能确定端口是关闭的还是被过滤的。 它只可能出现在 IPID Idle 扫描中
四、端口扫描技术
1. -sS( TCP SYN 扫描 )
半开放扫描, 不打开一个完整的TCP链接它发送一个 SYN 报文, 然后等待响应。 SYN/ACK 表示端口在监听 (开放), 而 RST (复位)表示没有监听者。如果数次重发后仍没响应, 该端口就被标记为被过滤。如果收到 ICMP 不可到达错误 ( 类型 3, 代码 1, 2, 3, 9, 10, 或者 13 ), 该端口也被标记为被过滤。
2. -sT( TCP connect() 扫描 )
Nmap 通过创建 connect() 系统调用要求操作系统和目标机以及端口建立连接, 而不像其它扫描类型直接发送原始报文。 这是和 Web 浏览器, P2P 客户端以及大多数其它网络应用程序用以建立连接一样的 高层系统调用。当 Nmap 连接, 然后不发送数据又关闭连接, 许多普通 UNIX 系统上的服务会在 syslog 留下记录, 有时候是一条加密的错误消息。
3. -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 ) 帮助区分真正的开放端口和被过滤的端口。
4. -sY(SCTP INIT scan)
SCTP INIT 扫描类似 TCP SYN 扫描, 他也是打开一个半开的连接, 而不是建立一个完整的 SCTP 关联。如果目标端口回复一个 INIT-ACK 数据包, 则说明端口是开放的, 如果回复一个 ABORT 数据包, 端口是关闭的, 如果没有回复, 端口会被标记标记为被过滤, 当然如果收到了 ICMP 不可达的消息( type 3, code 0, 1, 2, 3, 9, 10, or 13 )也会被标记为被过滤。
5. -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 ), 该端口就被标记为 被过滤的。
6. -sA ( TCP ACK 扫描 )
这种扫描与目前为止讨论的其它扫描的不同之处在于 它不能确定 open ( 开放的 ) 或者 open|filtered ( 开放或者过滤的 )端口。 它用于发现防火墙规则, 确定它们是有状态的还是无状态的, 哪些端口是被过滤的。
ACK 扫描探测报文只设置ACK标志位 ( 除非您使用 –scanflags ) 。当扫描未被过滤的系统时, open ( 开放的 ) 和 closed ( 关闭的 ) 端口 都会返回 RST 报文。Nmap 把它们标记为 unfiltered ( 未被过滤的 ), 意思是 ACK 报文不能到达, 但至于它们是 open ( 开放的 ) 或者 closed ( 关闭的 ) 无法确定。不响应的端口 或者发送特定的ICMP错误消息 ( 类型 3, 代号 1, 2, 3, 9, 10, 或者 13 ) 的端口, 标记为 filtered ( 被过滤的 ) 。
7. -sW(TCP窗口扫描)
在某些系统上, 开放端口用正数表示窗口大小 ( 甚至对于 RST 报文 ) 而关闭端口的窗口大小为 0 。因此, 当收到RST时, 窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是 0 , 分别把端口标记为 open 或者 closed
8. -sM(TCP Maimon扫描)
探测报文是 FIN/ACK。 根据 RFC 793 (TCP) , 无论端口开放或者关闭, 都应该对这样的探测响应 RST 报文。 然而, Uriel 注意到如果端口开放, 许多基于 BSD 的系统只是丢弃该探测报文。
9. –scanflags ( 定制的 TCP 扫描 )
–scanflags 选项可以是一个数字标记值如 9 ( PSH 和 FIN ) , 但使用字符名更容易些。 只要是 URG, ACK, PSH, RST, SYN, and FIN 的任何组合就行。例如, –scanflags URGACKPSHRSTSYNFIN 设置了所有标志位, 但是这对扫描没有太大用处。 标志位的顺序不重要。
10. -sZ(SCTP COOKIE ECHO 扫描 )
如果目标端口开放, 则会丢弃之前没有发起关联请求的 SCTP COOKIE ECHO 数据包, 如果端口是关闭的则会返回一个 SCTP ABORT 数据包。所以这个扫描技术, 无法分辨过滤和开放, 只能分辨出关闭的端口。
11. –sI < 僵尸主机地址: 端口 >( idlescan )
这种高级的扫描方法允许对目标进行真正的 TCP 端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反, side-channel 攻击 利用 zombie 主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。
如果您由于 IPID 改变希望探测 zombie 上的特定端口, 您可以在 zombie 主机后加上一个冒号和端口号。 否则 Nmap 会使用默认端口 ( 80 )。
12. -sO(IP协议扫描)
IP 协议扫描可以让您确定目标机支持哪些 IP 协议 ( TCP, ICMP, IGMP, 等等 ) 。从技术上说, 这不是端口扫描 , 既然它遍历的是 IP 协议号而不是 TCP 或者 UDP 端口号。 但是它仍使用 -p 选项选择要扫描的协议号, 用正常的端口表格式报告结果, 甚至用和真正的端口扫描一样 的扫描引擎。因此它和端口扫描非常接近, 也被放在这里讨论。
13. -b (FTP弹跳扫描)
FTP 协议的一个有趣特征 ( RFC 959 ) 是支持所谓代理 ftp 连接。
它允许用户连接到一台 FTP 服务器, 然后要求文件送到一台第三方服务器。 这个特性在很多层次上被滥用, 所以许多服务器已经停止支持它了。其中一种就是导致 FTP 服务器对其它主机端口扫描。 只要请求 FTP 服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。
这是绕过防火墙的好方法, 因为 FTP 服务器常常被置于可以访问比 Web 主机更多其它内部主机的位置。
Nmap 用 -b 选项支持 ftp 弹跳扫描。参数格式是
五、端口扫描设置
默认情况下, Nmap 用指定的协议对端口 1 到 1024 以及 nmap-services 文件中列出的更高的端口在扫描。
1. -p < 端口号, 端口列表 >
制定扫描某个或某些端口用逗号分隔, 或者用链接符号表示范围也可。
对于 -sO IP 协议扫描, 该选项用来指定协议号( 0-255 )。
2. –exclede-ports < 端口列表 >( 排除的端口 )
指定排除的端口, 如果是指定排除的协议号的话, 他的值在 0-255 之间
3. -F( 快速扫描 )
在 nmap 的 nmap-services 文件中 ( 对于 -sO , 是协议文件)指定您想要扫描的端口。 这比扫描所有 65535 个端口快得多。 因为该列表包含如此多的TCP端口( 1200 多), 这和默认的 TCP 扫描 scan ( 大约 1600 个端口)速度差别不是很大。如果用 –datadir 选项指定小的 nmap-services 文件 , 差别会很大。
4. -r(顺序扫描端口)
默认情况下, Nmap 按随机顺序扫描端口 ( 除了出于效率的考虑, 常用的端口前移 )。可以指定 -r 来顺序端口扫描。
5. –port-ratio
扫描 nmap-services 中给出的目标的一定比例, 这个值在 1.0-0.0 之间。
6. –top-ports
扫描 nmap-services 中的前多少个端口。
六.服务和版本扫描
1. -sV( 版本扫描 )
扫描服务版本, 也可以用 -A 同时进行操作系统探测和版本扫描。
2. –allports(版本扫描时, 不排除任何端口)
默认情况下, Nmap 版本探测会跳过 9100 TCP 端口, 因为一些打印机简单地打印送到该端口的 任何数据, 这回导致数十页 HTTP get 请求, 二进制 SSL 会话请求等等被打印出来。
这一行为可以通过修改或删除 nmap-service-probes 中的 Exclude 指示符改变
3. –version-intensity <强度>(版本扫描强度)
强度在 1 到 9 之间, 一般来说, 强度越大, 服务越有可能被正确识别
4. –version-light
相当于 –version-intensity 2
5. –vension-all
相当于 –version-intensity 9
6. –version-trace
打印出正在进行的版本扫描的详细信息
七、操作系统探测
1. -O (启用操作系统检测)
也可以使用 -A 来同时启用操作系统检测和版本扫描。
2. –osscan-limit
只对至少知晓一个端口开放或者关闭的主机进行操作系统探测
3. –osscan-guess;–fuzzy
无法确定操作系统类型的时候, 默认进行推测。但是使用这两项, 会让猜测更加准确。
4. –max-os-tries(操作系统识别重试次数)
默认重试五次,
八、扫描性能设置
1. 调整并行扫描组的大小
--min-hostgroup <milliseconds>; --max-hostgroup <milliseconds>
Nmap 具有并行扫描多主机端口或版本的能力, Nmap 将多个目标IP地址 空间分成组, 然后在同一时间对一个组进行扫描。通常, 大的组更有效。缺点是只有当整个组扫描结束后才会提供主机的扫描结果。如果组的大小定义为 50 , 则只有当前 50 个主机扫描结束后才能得到报告 ( 详细模式中的补充信息 除外 )。
默认方式下, Nmap 采取折衷的方法。开始扫描时的组较小, 最小为 5 , 这样便于尽快产生结果; 随后增长组的大小, 最大为 1024 。确切的 大小依赖于所给定的选项。为保证效率, 针对 UDP 或少量端口的 TCP 扫描, Nmap 使用大的组。–max-hostgroup 选项用于说明使用最大的组, Nmap 不会超出这个大小。–min-hostgroup 选项说明最小的组, Nmap 会保持组大于这个值。如果在指定的接口上没有足够的目标主机来满足所指定的最小值, Nmap 可能会采用比所指定的值小的组。这两个参数虽然很少使用, 但都用于保持组的大小在一个指定的范围之内。
这些选项的主要用途是说明一个最小组的大小, 使得整个扫描更加快速。通常选择 256 来扫描C类网段。对于端口数较多的扫描, 超出该值没有意义。对于端口数较少的扫描, 2048 或更大的组大小是有帮助的。
2. 调整探测报文的并行度
--min-parallelism <milliseconds>; --max-parallelism <milliseconds>
这些选项控制用于主机组的探测报文数量, 可用于端口扫描和主机发现。默认状态下, Nmap 基于网络性能计算一个理想的并行度, 这个值经常改变。如果报文被丢弃, Nmap 降低速度, 探测报文数量减少。随着网络性能的改善, 理想的探测报文数量会缓慢增加。这些选项确定这个变量的大小范围。默认状态下, 当网络不可靠时, 理想的并行度值 可能为 1 , 在好的条件下, 可能会增长至几百。最常见的应用是 –min-parallelism 值大于 1 , 以加快 性能不佳的主机或网络的扫描。这个选项具有风险, 如果过高则影响准确度, 同时也会降低 Nmap 基于网络条件动态控制并行度的能力。这个值设为 10 较为合适, 这个值的调整往往作为最后的手段。
–max-parallelism选项通常设为1, 以防止Nmap在同一时间 向主机发送多个探测报文, 和选择–scan-delay同时使用非常有用。
3. 调整探测报文超时
--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 。
4. 放弃低速目标主机
--host-timeout <milliseconds>
由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因, 一些主机需要很长的时间扫描。这些极少数的主机扫描往往占 据了大部分的扫描时间。因此, 最好的办法是减少时间消耗并且忽略这些主机, 使用 –host-timeout 选项来说明等待的时间(毫秒)。通常使用 1800000 来保证 Nmap 不会在单个主机上使用超过半小时的时间。需要注意的是, Nmap 在这半小时中可以 同时扫描其它主机, 因此并不是完全放弃扫描。超时的主机被忽略, 因此也没有针对该主机的 端口表、操作系统检测或版本检测结果的输出。
5. 整探测报文的时间间隔
--scan-delay <milliseconds>; --max-scan-delay <milliseconds>
这个选项用于 Nmap 控制针对一个主机发送探测报文的等待时间(毫秒), 在带宽 控制的情况下这个选项非常有效。Solaris 主机在响应 UDP 扫描探测报文报文时, 每秒 只发送一个 ICMP 消息, 因此 Nmap 发送的很多数探测报文是浪费的。–scan-delay 设为 1000, 使 Nmap 低速运行。Nmap 尝试检测带宽控制并相应地调整扫描的延迟, 但并不影响明确说明何种速度工作最佳。–scan-delay 的另一个用途是躲闭基于阈值的入侵检测和预防 系统 ( IDS/IPS )。
6. 设置时间模板
-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。
7. –max-retries < 次数 >
没有响应后的重试次数
8. –script-timeout
预防脚本的bug导致影响效率
9. 发包速度控制
--min-rate <number>; --max-rate <number>
最少每秒发多少, 最多每秒发多少。如果 0.1 的话就是 10 秒一个包的意思
10. –defeat-rst-ratelimit
忽略系统 reset 包的速率限制
11. –defeat-icmp-ratelimit
忽略系统 ICMP 错误消息速率限制
12. –nsock-engine epoll|kqueue|poll|select
选择系统 IO 模型, nmap -V 可以查看支持哪些
九、防火墙绕过/ IDS 躲避
1. -f ( 报文分段 ); –mtu ( 使用指定的MTU )
-f 选项要求扫描时 ( 包挺 ping 扫描)使用小的 IP 包分段。其思路是将 TCP 头分段在几个包中, 使得包过滤器、IDS 以及其它工具的检测更加困难。必须小心使用这个选项, 有些系统在处理这些小包时存在问题, 例如旧的网络嗅探器 Sniffit 在接收到第一个分段时会立刻出现分段错误。该选项使用一次, Nmap 在 IP 头后将包分成 8 个字节或更小。因此, 一个 20 字节的 TCP 头会被分成 3 个包, 其中 2 个包分别有TCP头的 8 个字节, 另 1 个包有 TCP 头的剩下 4 个字节。当然, 每个包都有一个 IP 头。再次使用 -f 可使用 16 字节的分段 ( 减少分段数量 ) 。
使用 –mtu 选项可以自定义偏移的大小, 使用时不需要 -f , 偏移量必须是 8 的倍数。包过滤器和防火墙对所有的 IP 分段排队, 如 Linux 核心中的 CONFIG-IP-ALWAYS-DEFRAG 配置项, 分段包不会直接使用。一些网络无法 承受这样所带来的性能冲击, 会将这个配置禁止。其它禁止的原因有分段 包会通过不同的路由进入网络。一些源系统在内核中对发送的报文进行分段, 使用 iptables 连接跟踪模块的 Linux 就是一个例子。当使用类似 Ethereal 的嗅探器时, 扫描必须保证发送的报文要分段。如果主机操作系统会产生问题, 尝试使用 –send-eth 选项以避开 IP 层而直接发送原始的以太网帧。
2. -D <肉鸡1 , 肉鸡2, …>( 结合肉鸡干扰进行扫描 )
首先必须让目标主机认为是肉鸡在扫描它, IDS 虽然能够捕捉到扫描的 IP , 但是并知道哪个是真实的攻击者, 使用逗号来分隔每个肉鸡, 如果使用了ME 选项, nmap 将不会使用本机地址, 否则 nmap 将会把本机地址放在一个随机位置。注意, 太多的欺骗包甚至可能造成 DDoS 的效果, 而且很多多 IPS 会过滤欺骗包
3. -S <IP地址>( 源地址欺骗 )
伪造扫描请求源地址。在某些情况下, Nmap 可能无法确定你的源地址 ( 如果这样, Nmap 会给出 提示 )。此时, 使用 -S 选项并说明所需发送包的接口 IP 地址。-e 选项常在这种情况下使用, 也可采用 -P0 选项。
4. -e ( 指定使用的网络接口 )
告诉 nmap 使用哪个网络接口收发报文
5. –source-port ; -g ( 源端口欺骗 )
只需要提供一个端口号, Nmap 就可以从这些 端口发送数据。为使特定的操作系统正常工作, Nmap 必须使用不同的端口号。 DNS 请求会忽略 –source-port 选项, 这是因为 Nmap 依靠系 统库来处理。大部分 TCP 扫描, 包括 SYN 扫描, 可以完全支持这些选项, UDP 扫描同样如此。
6. –date
可以用这样的格式指定值 –data 0xdeadbeef –data \xCA\xFE\x09 如果指定 0x00ff 这个的数字, 将不会做字节序转换。确保你的字节序, 对方可以接受
7. –data-string
例如, –data-string “Scan conducted by Security Ops, extension 7192” or –data-string “Ph34r my l33t skills”
8. –data-length ( 发送报文时 附加随机数据 )
这个选项告诉 Nmap 在发送的报文上 附加指定数量的随机字节。操作系统检测 ( -O )包不受影响。
9. 指定IP头
--ip-options <S|R [route]|L [route]|T|U ... >;
--ip-options <hex string> (Send packets with specified ip options)
10. 设置代理, 支持 http 代理和 socks4 代理
--proxies <Comma-separated list of proxy URLs>
11. –badsum( 让 nmap 使用一个伪造的不合法的 checksum )
这样的数据包一般都会丢弃, 如果收到任何回复, 这个回复一定来自防火墙
12. –adler32( 使用弃用的 Adler32 来代替 CRC32C 做 SCTP 的 checksum )
这是为了从旧版的 SCTP 协议设备获得响应
13. –ttl ( 设置 IP time-to-live 域)
设置 IPv4 报文的 time-to-live 域为指定的值。
14. –randomize-hosts ( 对目标主机的顺序随机排列 )
告诉 Nmap 在扫描主机前对每个组中的主机随机排列, 最多可达 8096 个主机。
15. MAC 地址哄骗
--spoof-mac <mac address, prefix, or vendor name>
要求 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。
十、输出
1. -oN (标准输出)
将结果输入制定文件
2. -oX (XML输出)
将XML输出写入指定文件
3. -oS (ScRipT KIdd|3 oUTpuT)
脚本小子输出类似于交互工具输出, 这是一个事后处理, 适合于 ’l33t HaXXorZ, 由于原来全都是大写的Nmap输出。
4. -oG (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。
5. -oA ( 输出至所有格式 )
为使用方便, 利用 -oA
-v( 提高输出信息的详细程度 )
-d level
–packet-trace( 跟踪发出的报文 )
-iflist( 列举端口和路由 )
–append-out( 在输出文件住追加 )
但对于 XML ( -oX )扫描输出 文件无效, 无法正常解析, 需要手工修改。
6. –resume ( 继续中断的扫描 )
如果标准扫描 ( -oN ) 或 Grep 扫描 ( -oG ) 日志 被保留, 用户可以要求 Nmap 恢复终止的扫描, 只需要简单地使用选项 –resume 并说明标准 /Grep 扫描输出文件, 不允许 使用其它参数, Nmap 会解析输出文件并使用原来的格式输出。使用方式如 nmap –resume
--stylesheet <path or URL> (设置XSL样式表, 转换XML输出)
--webxml
--stylesheet https://nmap.org/svn/docs/nmap.xsl 的简写。
--no-stylesheet (忽略 XML 声明的 XSL 样式表)
--open
7. 只显示开放或者可能开放的端口
--stats-every <time>(周期性的输出统计数据)
--stats-every 10s 每 10 秒输出一次, 这个输出会被输出到标准输出, 和 XML 文件
--reason(打印主机和端口状态的原因)
十一、其他选项
1. -A(强力扫描模式)
个选项启用了操作系统检测 ( -O ) 和版本扫描 ( -sV ), 以后会增加更多的功能。 目的是启用一个全面的扫描选项集合, 不需要用户记忆大量的 选项。这个选项仅仅启用功能, 不包含用于可能所需要的 时间选项 ( 如 -T4 ) 或细节选项 ( -v )。
2. –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 查找的最后一个位置是当前目录。
3. –send-ip (在原IP层发送)
要求 Nmap 通过原 IP 套接字发送报文, 而不是低层的以 太网帧。这是 –send-eth 选项的补充。
4. –send-eth
使用 raw ethernet 包来发包
5. –privileged (假定用户具有全部权限)
告诉 Nmap 假定其具有足够的权限进行源套接字包发送、 报文捕获和类似 UNIX 系统中根用户操作的权限。默认状态下, 如果由 getuid() 请求的类似操作不为 0 , Nmap 将退出。 –privileged 在具有 Linux 内核性能的类似 系统中使用非常有效, 这些系统配置允许非特权用户可以进行 原报文扫描。需要明确的是, 在其它选项之前使用这些需要权 限的选项 ( SYN 扫描、操作系统检测等 )。 Nmap-PRIVILEGED 变量 设置等价于 –privileged 选项。
6. –unprivileged( 假定用户没有特权 )
7. –interactive ( 在交互模式中启动 )
在交互模式中启动 Nmap , 提供交互式的 Nmap 提示, 便于 进行多个扫描(同步或后台方式)。对于从多用户系统中扫描 的用户非常有效, 这些用户常需要测试他们的安全性, 但不希望 系统中的其它用户知道他们扫描哪些系统。使用 –interactive 激活这种方式, 然后输入 h 可 获得帮助信息。由于需要对正确的 shell 程序和整个功能非常熟悉, 这个选项很少使用。这个选项包含了一个!操作符, 用于执行 shell 命令, 这是不安装 Nmap setuid root 的多个原因之一。
8. –release-memory ( 退出后 namp 自己释放内存)
9. –servicedb
nmap-service 文件的路径
10. –versiondb
nmap-service-probes 文件路径
11. -V;–version (查看版本)
12. -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
# 更新脚本库