Nmap的详细使用
Nmap的详细使用
介绍
常用参数选项
主机发现
端口扫描
服务和版本探测
操作系统探测
性能优化
防火墙/IDS 躲避和哄骗
输出
(一)介绍
Nmap — 网络探测工具和安全/端口扫描器。
Nmap (“Network Mapper(网络映射器)”) 是一款开放源代码的 网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个 主机也没有问题。Nmap 以新颖的方式使用原始 IP 报文来发现网络上有哪些主机,那些 主机提供什么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息), 它们使用什么类型的报文过滤器/ 防火墙,以及一堆其它功能。虽然Nmap 通常用于安全审核, 许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。
Nmap 输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项。 “所感兴趣的端口表格”是其中的关键。那张表列出端口号,协议,服务名称和状态。状态可能是 open(开放的),filtered(被过滤的), closed(关闭的),或者unfiltered(未被过滤的)。 Open( 开放的) 意味着目标机器上的应用程序正在该端口监听连接/ 报文。filtered(被过滤的) 意味着防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap 无法得知 它是 open(开放的) 还是 closed(关闭的)。 closed(关闭的) 端口没有应用程序在它上面监听,但是他们随时可能开放。 当端口对Nmap 的探测做出响应,但是Nmap 无法确定它们是关闭还是开放时,这些端口就被认为是 unfiltered(未被过滤的) 如果Nmap 报告状态组合 open|filtered 和 closed|filtered 时,那说明Nmap 无法确定该端口处于两个状态中的哪一个状态。 当要求进行版本探测时,端口表也可以包含软件的版本信息。当要求进行 IP 协议扫描时 (-sO),Nmap 提供关于所支持的IP 协议而不是正在监听的端口的信息。除了所感兴趣的端口表,Nmap 还能提供关于目标机的进一步信息,包括反向域名,操作系统猜测,设备类型,和MAC 地址。
参数选项
Nmap支持主机名,ip,网段的表示方式 例如:blah.highon.coffee, namp.org/24, 192.168.0.1;10.0.0-25.1-254 -iL filename 从文件中读取待检测的目标,文件中的表示方法支持机名,ip,网段 -iR hostnum 随机选取,进行扫描.如果-iR指定为0,则是无休止的扫描 --exclude host1[, host2] 从扫描任务中需要排除的主机 --exculdefile exclude_file 排除文件中的IP,格式和-iL指定扫描文件的格式相同 主机发现 -sL 仅仅是显示,扫描的IP数目,不会进行任何扫描 -sn ping扫描,即主机发现 -Pn 不检测主机存活 -PS/PA/PU/PY[portlist] TCP SYN Ping/TCP ACK Ping/UDP Ping发现 -PE/PP/PM 使用ICMP echo, timestamp and netmask 请求包发现主机 -PO[prococol list] 使用IP协议包探测对方主机是否开启 -n/-R 不对IP进行域名反向解析/为所有的IP都进行域名的反响解析 扫描技巧 -sS/sT/sA/sW/sM TCP SYN/TCP connect()/ACK/TCP窗口扫描/TCP Maimon扫描 -sU UDP扫描 -sN/sF/sX TCP Null,FIN,and Xmas扫描 --scanflags 自定义TCP包中的flags -sI zombie host[:probeport] Idlescan -sY/sZ SCTP INIT/COOKIE-ECHO 扫描 -sO 使用IP protocol 扫描确定目标机支持的协议类型 -b “FTP relay host” 使用FTP bounce scan 指定端口和扫描顺序 -p 特定的端口 -p80,443 或者 -p1-65535 -p U:PORT 扫描udp的某个端口, -p U:53 -F 快速扫描模式,比默认的扫描端口还少 -r 不随机扫描端口,默认是随机扫描的 --top-ports "number" 扫描开放概率最高的number个端口,出现的概率需要参考nmap-services文件,ubuntu中该文件位于/usr/share/nmap.nmap默认扫前1000个 --port-ratio "ratio" 扫描指定频率以上的端口 服务版本识别 -sV 开放版本探测,可以直接使用-A同时打开操作系统探测和版本探测 --version-intensity "level" 设置版本扫描强度,强度水平说明了应该使用哪些探测报文。数值越高,服务越有可能被正确识别。默认是7 --version-light 打开轻量级模式,为--version-intensity 2的别名 --version-all 尝试所有探测,为--version-intensity 9的别名 --version-trace 显示出详细的版本侦测过程信息 脚本扫描 -sC 根据端口识别的服务,调用默认脚本 --script=”Lua scripts” 调用的脚本名 --script-args=n1=v1,[n2=v2] 调用的脚本传递的参数 --script-args-file=filename 使用文本传递参数 --script-trace 显示所有发送和接收到的数据 --script-updatedb 更新脚本的数据库 --script-help=”Lua script” 显示指定脚本的帮助 OS识别 -O 启用操作系统检测,-A来同时启用操作系统检测和版本检测 --osscan-limit 针对指定的目标进行操作系统检测(至少需确知该主机分别有一个open和closed的端口) --osscan-guess 推测操作系统检测结果,当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认进行这种匹配 防火墙/IDS躲避和哄骗 -f; --mtu value 指定使用分片、指定数据包的MTU. -D decoy1,decoy2,ME 使用诱饵隐蔽扫描 -S IP-ADDRESS 源地址欺骗 -e interface 使用指定的接口 -g/ --source-port PROTNUM 使用指定源端口 --proxies url1,[url2],... 使用HTTP或者SOCKS4的代理 --data-length NUM 填充随机数据让数据包长度达到NUM --ip-options OPTIONS 使用指定的IP选项来发送数据包 --ttl VALUE 设置IP time-to-live域 --spoof-mac ADDR/PREFIX/VEBDOR MAC地址伪装 --badsum 使用错误的checksum来发送数据包 Nmap 输出 -oN 将标准输出直接写入指定的文件 -oX 输出xml文件 -oS 将所有的输出都改为大写 -oG 输出便于通过bash或者perl处理的格式,非xml -oA BASENAME 可将扫描结果以标准格式、XML格式和Grep格式一次性输出 -v 提高输出信息的详细度 -d level 设置debug级别,最高是9 --reason 显示端口处于带确认状态的原因 --open 只输出端口状态为open的端口 --packet-trace 显示所有发送或者接收到的数据包 --iflist 显示路由信息和接口,便于调试 --log-errors 把日志等级为errors/warings的日志输出 --append-output 追加到指定的文件 --resume FILENAME 恢复已停止的扫描 --stylesheet PATH/URL 设置XSL样式表,转换XML输出 --webxml 从namp.org得到XML的样式 --no-sytlesheet 忽略XML声明的XSL样式表 时间性能优化 -T 时间优化(0-5)(paranoid|sneaky|polite|normal|aggressive|insane) -F 快速扫描。 --max-retries 调整重传次数。 --min-hostgroup/--max-hostgroup size 设置组的大小 --min-parallelism/--max-parellelism time 指定时间内的探针数 --min-rtt-timrout/--max-rtt-timrout/initial-rtt-timrouttime 指定探针超时 --scan-delay/-max-scan-delay time 指定探针之间的时延 --max-retries tries 指定探针重传转发数 --host-timeout time 设置扫描主机的最大时间 --defeat-rst-ratelimit 设置rst的限制 其他nmap选项 -6 开启IPv6 -A OS识别,版本探测,脚本扫描和traceroute --datedir DIRNAME 说明用户Nmap数据文件位置 --send-eth / --send-ip 使用原以太网帧发送/在原IP层发送 --privileged 假定用户具有全部权限 --unprovoleged 假定用户不具有全部权限,创建原始套接字需要root权限 -V 打印版本信息 -h 输出帮助
(3)主机发现
1.指定目标的格式
指定单个目标
namp -sS 192.168.14.144 -A
指定多个目标(使用逗号分隔)
namp -sS 192.168.14.144,192.192.10.22 -A
指定扫描范围
namp -sS 192.168.14.0-255 或者 namp -sS 192.168.14.0/24
从列表中输入(-iL <inputfilename> )
只要生成要扫描的主机的列表,用-iL 把文件名作为选项传给Nmap。列表中的项可以是Nmap 在 命令行上接受的任何格式(IP 地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望Nmap 从标准输入而不是实际文件读取列表, 您可以用一个连字符(-)作为文件名
例子: namp -iL ip.txt
随机选择目标(-iR <hostnum> )
对于互联网范围内的调查和研究 您也许想随机地选择目标
例子: nmap -sS - PS80 -iR 0 -p 80
注意:选项0意味永无休止的扫描
排除主机/网络(--exclude <host1[,host2][,host3],...>)
如果在您指定的扫描范围有一些主机或网络不是您的目标, 那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Nmap 语法, 因此它可以包括主机名,CIDR,八位字节范围等等。 当您希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的 系统或者被其它人看管的子网时,这也许有用。
例子: namp -sS 192.168.10.0/24 --exclude 192.168.10.157,192.168.10.188
排除文件中的列表(--excludefile <excludefile> )
这和--exclude 选项的功能一样,只是所排除的目标是用以 换行符,空格,或者制表符分隔的 <excludefile>提供的,而不是在命令行上输入的。
例子: namp -sS 192.168.14.0/24 --excludefile ip.txt
2.主机发现
列表扫描 -sL
只是打印目标主机的列表
Ping 扫描 -sP
只会打印活着的主机 。没有进一步的测试 (如端口扫描或者操作系统探测)。 它可以很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行。 注意:需要root权限,如果不是root权限,PING扫描将会使用connect()调用。
无ping扫描 -P0
对所有指定目标进行扫描,不管这个目标是不是活的。
TCP SYN Ping -PS [portlist]
该选项发送一个设置了 SYN 标志位的空 TCP 报文。 默认目的端口为80。 SYN 标志位告诉对方您正试图建立一个连接 通常目标端口是关闭的,一个 RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行 TCP 三步握手的第二步,回应 一个SYN/ACK TCP 报文。然后运行 Nmap 的机器则会扼杀这个正在建立的连接 发送一个RST 而非 ACK 报文,否则,一个完全的连接将会建立。 RST 报文是运行Nmap 的机器而不是Nmap 本身响应的,因为它对收到 的SYN/ACK 感到很意外。 Nmap 并不关心端口开放还是关闭。 无论 RST 还是 SYN/ACK 响应都告诉 Nmap 该主机正在运行。
TCP ACK Ping -PA [portlist]
TCP ACK ping 和刚才讨论的SYN ping 相当类似,区别就是设置TCP 的 ACK 标志位而不是SYN 标志位。 提供SYN 和ACK 两种ping 探测的原因是使通过防火墙的机会尽可能大 许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN 报文,除非 连接目标是那些公开的服务器像公司网站或者邮件服务器。 这可以阻止其它进入组织的连接,同时也允许用户访问互联网。 这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器 广泛支持 Linux Netfilter/iptables 防火墙软件提供方便的 --syn 选项来实现这种无状态的方法 。当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYN ping 探测 (-PS) 很可能被封锁。这种情况下,ACK 探测格外有闪光点,因为它正好利用了 这样的规则。 另外一种常用的防火墙用有状态的规则来封锁非预期的报文。 这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。 Linux Netfilter/iptables 通过 --state 选项支持这一特性,它根据连接状态把报文 进行分类。SYN 探测更有可能用于这样的系统,由于没头没脑的 ACK 报文 通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS 又指定-PA 来即发送SYN 又发送ACK。
UDP Ping -PU [portlist]
还有一个主机发现的选项是 UDP ping,它发送一个空的(除非指定了--data-length UDP 报文到给定的端口。端口列表的格式和前面讨论过的-PS 和-PA 选项还是一样 如果不指定端口 , 默 认 是 31338 。 该 默 认 值 可 以 通 过 在 编 译 时 改 变 nmap.h 文 件 中 的 DEFAULT_UDP_PROBE_PORT 值进行配置。默认使用这样一个奇怪的端口是因为对开放端口 进行这种扫描一般都不受欢迎。 该扫描类型的主要优势是它可以穿越只过滤TCP 的防火墙和过滤器。
ARP Ping -PR
最常见的Nmap 使用场景之一是扫描一个以太局域网。 在大部分局域网上,特别是那些使用基于 RFC1918私有地址范围的网络,在一个给定的时间绝大部分 IP 地址都是不使用的当 Nmap 试图发送一个原始IP 报文如ICMP 回声请求时 操作系统必须确定对应于目标IP 的硬件 地址(ARP),这样它才能把以太帧送往正确的地址。 这一般比较慢而且会有些问题 , 因为操作系统设计者认为一般不会在短时间内 对没有运行的机器作几百万次的ARP 请求。 当进行 ARP 扫描时,Nmap 用它优化的算法管理ARP 请求。 当它收到响应时, Nmap 甚至不需要担心基于IP 的ping 报文,既然它已经知道该主机正在运行了。 这使得ARP 扫描比基于IP 的扫描更快更可靠。 所以默认情况下,如果 Nmap 发现目标主机就在它所在的局域网上,它会进行 ARP 扫描。 即使指定了不同的ping 类型(如 -PI 或者 -PS) ,Nmap 也会对任何相同局域网上的目标机使用ARP。 如果您真的不想要ARP 扫描,指定 --send-ip。
不用域名解析 -n
告诉Nmap 永不对它发现的活动IP 地址进行反向域名解析。 既然DNS 一般比较慢,这可以让事情更快些。
为所有目标解析域名 -R
告诉Nmap 永远 对目标IP 地址作反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。
使用系统域名解析器 --system_dns
默认情况下,Nmap 通过直接发送查询到您的主机上配置的域名服务器 来解析域名。为了提高性能,许多请求 (一般几十个 ) 并发执行。如果您希望使用系统自带的解析器,就指定该选项 (通过 getnameinfo()调用一次解析一个 IP)。除非 Nmap 的 DNS 代码有 bug--如果是这样,请联系我们。 一般不使用该选项,因为它慢多了。系统解析器总是用于 IPv6扫描 。
(四)端口扫描
Nmap把端口分成六个状态: open(开放的), closed(关闭的),filtered(被过滤的),unfiltered(未被过滤的), open|filtered(开放或者被过滤的),或者 closed|filtered(关闭或者未被过滤的)。
1.Nmap 所识别的6个端口状态
open(开放的) 应用程序正在该端口接收TCP 连接或者UDP 报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。 closed(关闭的) 关闭的端口对于Nmap 也是可访问的(它接受Nmap 的探测报文并作出响应), 但没有应用程序在其上监听 它们可以显示该IP 地址上(主机发现,或者 ping 扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下, 可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。 filtered(被过滤的) 由于包过滤阻止探测报文到达端口, Nmap 无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折, 因为它们几乎不提供 任何信息。有时候它们响应ICMP 错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使 Nmap 重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。 unfiltered(未被过滤的) 未被过滤状态意味着端口可访问,但Nmap 不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK 扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN 扫描,或者FIN 扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。 open|filtered(开放或者被过滤的) 当无法确定端口是开放还是被过滤的,Namp 就把该端口划分成 这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应。因此 Nmap 无法确定该端口是开放的还是被过滤的。 UDP,IP 协议, FIN,Null, 和 Xmas 扫描可能把端口归入此类。 closed|filtered(关闭或者被过滤的) 该状态用于Nmap 不能确定端口是关闭的还是被过滤的 它只可能出现在IPID Idle 扫描中 。
2.扫描技术
TCP SYN 扫描 -sS (匿名扫描,默认不加类型,需要root权限,扫描速度快)
TCP connect()扫描 -sT (TCP全连接扫描,不需要root权限,TCP扫描的默认模式,端口状态和SYN相同,耗时长)
UDP 扫描 -sU
注意:UDP 扫描用-sU 选项激活。它可以和TCP 扫描如 SYN 扫描 (-sS)结合使用来同时检查两种协议。
IP 协议扫描 -sO
IP 协议扫描可以让您确定目标机支持哪些IP 协议 (TCP,ICMP,IGMP,等等),从技术上说,这不是端口扫描,既然它遍历的是IP 协议号而不是TCP 或者 UDP 端口号。
3.端口说明和扫描顺序
除了所有前面讨论的扫描方法, Nmap 提供选项说明那些端口被扫描以及扫描是随机还是顺序进行。 默认情况下,Nmap 用指定的协议对端口1到1024以及 nmap-services 文件中列出的更高的端口在扫描。
只扫描指定的端口 -p <port ranges>
该选项指明您想扫描的端口,覆盖默认值 单个端口和用连字符表示的端口范围(如 1-1023) 都可以。 范围的开始以及/或者结束值可以被省略, 分别导致 Nmap 使用1和65535。所以您可以指定 -p-从端口1扫描到65535。 如果您特别指定,也可以扫描端口0。 对于IP 协议扫描(-sO),该选项指定您希望扫描的协议号 (0-255)。 当既扫描TCP 端口又扫描UDP 端口时,您可以通过在端口号前加上T: 或者U:指定协议 协议限定符一直有效您直到指定另一个 例如,参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描UDP 端口53,111,和137,同时扫描列出的TCP 端口。注意,要既扫描 UDP 又扫描 TCP,您必须指定 -sU ,以及至少一个TCP 扫描类型(如 -sS,-sF,或者 -sT)。如果没有给定协议限定符, 端口号会被加到所有协议列表。
快速 (有限的端口) 扫描 -F
在 nmap 的nmap-services 文件中(对于-sO,是协议文件)指定您想要扫描的端口。 这比扫描所有65535个端口快得多。 因为该列表包含如此多的 TCP 端口(1200多),这和默认的 TCP 扫描 scan (大约1600个端口)速度差别不是很大。如果您用--datadir 选项指定您自己的 小小的 nmap-services 文件 ,差别会很惊人。
不要按随机顺序扫描端口 -r
默认情况下,Nmap 按随机顺序扫描端口 (除了出于效率的考虑,常用的端口前移)。这种随机化通常都是受欢迎的, 但您也可以指定-r 来顺序端口扫描。
(5)服务和版本探测
版本探测 -sV
打开版本探测。 您也可以用-A 同时打开操作系统探测和版本探测。
不为版本探测排除任何端口 --allports
默认情况下,Nmap 版本探测会跳过9100 TCP 端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页HTTP get 请求,二进制 SSL 会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的 Exclude 指示符改变, 您也可以不理会任何Exclude 指示符,指定--allports 扫描所有端口
设置 版本扫描强度 --version-intensity <intensity>
当进行版本扫描(-sV)时,nmap 发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 一般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文通过 nmap- service-probes ports 指示符 注册到目标端口时,无论什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL 探测将在443端口尝试,等等。
打开轻量级模式 --version-light
这是 --version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。
尝试每个探测 --version-all
--version-intensity 9的别名, 保证对每个端口尝试每个探测报文。
--version-trace 跟踪版本扫描活动
这导致 Nmap 打印出详细的关于正在进行的扫描的调试信息。 它是您用--packet-trace 所得到的信息的子集。
RPC 扫描 -sR
这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的 TCP/UDP 端口执行 SunRPC 程序 NULL 命令,来试图 确定它们是否RPC 端口,如果是, 是什么程序和版本号。因此您可以有效地获得和 rpcinfo -p 一样的信息 即使目标的端口映射在防火墙后面(或者被TCP 包装器保护)。Decoys 目前不能和RPC scan 一起工作。 这作为版本扫描(-sV)的一部分自动打开。 由于版本探测包括它并且全面得多,-sR 很少被需要。
(六)操作系统探测
启用操作系统检测 -O
也可以使用-A 来同时启用操作系统检测和版本检测。
针对指定的目标进行操作系统检测 --osscan-limit
如果发现一个打开和关闭的TCP 端口时,操作系统检测会更有效。 采用这个选项,Nmap 只对满足这个条件的主机进行操作系统检测,这样可以 节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O 或-A 进行操作系统检测时起作用。
推测操作系统检测结果 --osscan-guess; --fuzzy
当 Nmap 无法确定所检测的操作系统时,会尽可能地提供最相近的匹配, Nmap 默认 进行这种匹配,使用上述任一个选项使得Nmap 的推测更加有效。
(七)优化性能
调整并行扫描组的大小 --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 或更大的组大小是有帮助的。
调整探测报文的并行度 --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 仅将超时时间降至最小值,这个情况是不正常的,需要向namp-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。
(八)防火墙/IDS 躲避和哄骗
报文分段 -f
要求扫描时(包挺 ping 扫描)使用 小的 IP 包分段。其思路是将 TCP 头分段在几个包中,使得包过滤器、 IDS 以及其它工具的检测更加困难。
使用指定的MTU --mtu
使用--mtu 选项可 以自定义偏移的大小,使用时不需要-f,偏移量必须 是8的倍数。
使用诱饵隐蔽扫描 -D <decoy1 [,decoy2][,ME],...>
为使诱饵扫描起作用,需要使远程主机认为是诱饵在扫描目标网络 IDS 可能会报个某个IP 的5-10个端口扫描,但并不知道哪个IP 在扫描以及 哪些不是诱饵。但这种方式可以通过路由跟踪、响应丢弃以及其它主动 机制在解决。这是一种常用的隐藏自身 IP 地址的有效技术 。 使用逗号分隔每个诱饵主机,也可用自己的真实 IP 作为诱饵,这时可使用 ME 选项说明。如果在第6 个位置或 更后的位置使用 ME 选项,一些常用 端口扫描检测器( 如 Solar Designer's excellent scanlogd)就不会报告 这个真实IP。如果不使用ME 选项,Nmap 将真实 IP 放在一个随机的位置 注意,作为诱饵的主机须在工作状态,否则会导致目标主机的 SYN 洪水攻击。 如果在网络中只有一个主机在工作,那就很容易确定哪个主机在扫描。也可 使用IP 地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)。 诱饵可用在初始的ping 扫描(ICMP、SYN、ACK 等)阶段或真正的端口扫描 阶段。诱饵也可以用于远程操作系统检测(-O)。在进行版 本检测或TCP 连接扫描时,诱饵无效。 使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。 此外,一些ISP 会过滤哄骗的报文,但很多对欺骗IP 包没有任何限制。
源地址哄骗 -S <IP_Address>
在某些情况下,Nmap 可能无法确定你的源地址(如果这样,Nmap 会给出 提示)。此时,使用-S 选项并说明所需发送包的接口IP 地址。 这个标志的另一个用处是哄骗性的扫描,使得目标认为是另 一个地址在进行扫描。
使用指定的接口 -e <interface>
告诉 Nmap 使用哪个接口发送和接收报文,Nmap 可以进行自动检测, 如果检测不出会给出提示。
源端口哄骗 --source-port <portnumber>; -g <portnumber>
依赖于源端口号就信任数据流是一种常见的错误配置,Nmap 提供了-g 和--source-port 选项(它们是等价的),用于利用上述弱点。只需要提供一个端口号,Nmap 就可以从这些端口发送数据。为使特定的操作系统正常工作,Nmap 必须使用不同的端口号。 DNS 请求会忽略--source-port 选项,这是因为 Nmap 依靠系统库来处理。大部分TCP 扫描,包括SYN 扫描,可以完全支持这些选项,UDP 扫描同样如此。
发送报文时 附加随机数据 --data-length <number>
正常情况下,Nmap 发送最少的报文,只含一个包头。因此 TCP 包通常 是40字节,ICMP ECHO 请求只有28字节。这个选项告诉 Nmap 在发送的报文上 附加指定数量的随机字节。操作系统检测(-O)包不受影响, 但大部分ping 和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。
设置IP time-to-live 域 --ttl <value>
设置IPv4报文的time-to-live 域为指定的值。
对目标主机的顺序随机排列 --randomize-hosts
告诉Nmap 在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机。这会使得扫描针对不同的网络监控系统来说变得不是很 明显,特别是配合值较小的时间选项时更有效。如果需要对一个较大 的组进行随机排列,需要增大 nmap.h 文件中 PING_GROUP_SZ 的值 , 并重新编译。另一种方法是使用列表扫描 (-sL -n -oN <filename>),产生目标 IP 的列表, 使用 Perl 脚本进行随机化,然后使用-iL 提供给Nmap。
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.
(九)输出
Nmap 输出格式
-oN <filespec> (标准输出)
要求将标准输出直接写入指定 的文件。
-oX <filespec> (XML 输出)
要求 XML 输出直接写入指定 的文件。
-oS <filespec> (ScRipT KIdd|3 oUTpuT)
将所有的输出都改为大写。
-oG <filespec> (Grep 输出)
一种便于通过bash或者perl处理的格式,不建议使用。XML 输格式很强大,便于有经验的用户使用。XML 是一种标准,由许多解析器构成,而Grep 输出更简化。XML 是可扩展的,以支持新发布的 Nmap 特点。使用Grep 输出的目的是忽略这些特点,因为没有足够的空间。 Grep 输出可以包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及冒号分隔。 这些域有主机,端口, 协议,忽略状态, 操作系统,序列号, IPID 和状态。 这些域中最重要的是Ports,它提供了所关注的端口的细节,端口项由逗号分隔。每个端口项代表一个所关注的端口,每个子域由/分隔。这些子域有:端口号, 状态,协议, 拥有者,服务, SunRPCinfo 和版本信息。
-oA <basename> (输出至所有格式)
为使用方便,利用-oA<basename>选项 可将扫描结果以标准格式、XML 格式和Grep 格式一次性输出。 分别存放在 <basename>.nmap,<basename>.xml 和 <basename>.gnmap 文件 中。也可以在文件名前 指定目录名,如在 UNIX 中,使用~/nmaplogs/foocorp/, 在 Window 中,使用c:\hacking\sco on Windows。