简介
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除了可以探测主机在线和主机端口,还有更强大的功能版本探测和操作系统探测。
版本探测
端口探测发现TCP 和/或者UDP端口后,版本探测会询问这些端口,确定到底什么服务正在运行,以及其版本。
参数讲解
-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所得到的信息的子集。
-sR (RPC扫描)
这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图 确定它们是否RPC端口,如果是,是什么程序和版本号。因此可以有效地获得和rpcinfo -p一样的信息,即使目标的端口映射在防火墙后面(或者被TCP包装器保护)。Decoys目前不能和RPC scan一起工作。 这作为版本扫描(-sV)的一部分自动打开。 由于版本探测包括它并且全面得多,-sR很少被需要。
操作系统探测
Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。 在进行一打测试如TCP ISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查之后, Nmap把结果和数据库nmap-os-fingerprints中超过 1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。 每个fingerprint包括一个自由格式的关于OS的描述文本, 和一个分类信息,它提供供应商名称(如Sun),下面的操作系统(如Solaris),OS版本(如10), 和设备类型(通用设备,路由器,switch,游戏控制台, 等)。
参数讲解
-O (启用操作系统检测)
也可以使用-A来同时启用操作系统检测和版本检测。
--osscan-limit (针对指定的目标进行操作系统检测)
如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。 采用这个选项,Nmap只对满足这个条件的主机进行操作系统检测,这样可以节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O或-A 进行操作系统检测时起作用。
--osscan-guess; --fuzzy (推测操作系统检测结果)
当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。
防火墙绕过
如果被扫描主机设置了防火墙,很有可能会识别到nmap发生的探测报文。
-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层而直接 发送原始的以太网帧。
-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选项常在这种情况下使用,也可采用-P0选项。
-e <interface> (使用指定的接口)
告诉Nmap使用哪个接口发送和接收报文,Nmap可以进行自动检测, 如果检测不出会给出提示。
--source-port <portnumber>; -g <portnumber> (源端口哄骗)
仅依赖于源端口号就信任数据流是一种常见的错误配置,这个问题非常 好理解。例如一个管理员部署了一个新的防火墙,但招来了很多用户的不满,因为 他们的应用停止工作了。可能是由于外部的UDP DNS服务器响应无法进入网络,而导致 DNS的崩溃。FTP是另一个常见的例子,在FTP传输时,远程服务器尝试和内部用 建立连接以传输数据。对这些问题有安全解决方案,通常是应用级代理或协议分析防火墙模块。但也存在一些不安全的方案。注意到DNS响应来自于53端口,FTP连接 来自于20端口,很多管理员会掉入一个陷阱,即允许来自于这些端口的数据进入 网络。他们认为这些端口里不会有值得注意的攻击和漏洞利用。此外,管理员 或许认为这是一个短期的措施,直至他们采取更安全的方案。但他们忽视了安全的升级。不仅仅是工作量过多的网络管理员掉入这种陷阱,很多产品本身也会有这类 不安全的隐患,甚至是微软的产品。Windows 2000和Windows XP中包含的IPsec过滤 器也包含了一些隐含规则,允许所有来自88端口(Kerberos)的TCP和UDP数据流。另一个常见的例子是Zone Alarm个人防火墙到2.1.25版本仍然允许源端口53(DNS)或 67(DHCP)的UDP包进入。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和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。
--ttl <value> (设置IP time-to-live域)
设置IPv4报文的time-to-live域为指定的值。
--randomize-hosts (对目标主机的顺序随机排列)
告诉Nmap在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机。这会使得扫描针对不同的网络监控系统来说变得不是很 明显,特别是配合值较小的时间选项时更有效。如果需要对一个较大 的组进行随机排列,需要增大nmap.h文件中 PING-GROUP-SZ的值,并重新编译。另一种方法是使用列表扫描 (-sL -n -oN ),产生目标IP的列表, 使用Perl脚本进行随机化,然后使用-iL提供给Nmap。
--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输出直接写入指定 的文件。Nmap包含了一个文档类型定义(DTD),使XML解析器有效地 进行XML输出。这主要是为了程序应用,同时也可以协助人工解释 Nmap的XML输出。DTD定义了合法的格式元素,列举可使用的属性和值。
-oS <filespec> (ScRipT KIdd|3 oUTpuT)
脚本小子输出类似于交互工具输出,这是一个事后处理,适合于 'l33t HaXXorZ, 由于原来全都是大写的Nmap输出。
-oG <filespec> (Grep输出)
Grep输出可以包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及冒号分隔。这些域有主机,端口,协议,忽略状态, 操作系统,序列号,IPID和状态。
-oA <basename> (输出至所有格式)
为使用方便,利用-oA选项 可将扫描结果以标准格式、XML格式和Grep格式一次性输出。分别存放在 .nmap,.xml和 .gnmap文件中。也可以在文件名前 指定目录名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:hackingsco on Windows。
-v (提高输出信息的详细度)
通过提高详细度,Nmap可以输出扫描过程的更多信息。 输出发现的打开端口,若Nmap认为扫描需要更多时间会显示估计的结束时间。这个选项使用两次,会提供更详细的信息。
-d [level] (提高或设置调试级别)
当详细模式也不能为用户提供足够的数据时,使用调试可以得到更 多的信息。使用细节选项(-v)时,可启用命令行参数 (-d),多次使用可提高调试级别。也可在-d 后面使用参数设置调试级别。例如,-d9设定级别9。这是 最高的级别,将会产生上千行的输出,除非只对很少的端口和目标进行简单扫描。
如果Nmap因为Bug而挂起或者对Nmap的工作及原理有疑问,调试输出 非常有效。主要是开发人员用这个选项,调试行不具备自我解释的特点。 例如,Timeoutvals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。如果对某行输出不明白, 可以忽略、查看源代码或向开发列表(nmap-dev)求助。有些输出行会有自我解释的特点,但随着调试级别的升高,会越来越含糊。
--packet-trace (跟踪发送和接收的报文)
要求Nmap打印发送和接收的每个报文的摘要,通常用于调试,有助于新用户更好地理解Nmap的真正工作。为避免输出过多的行,可以限制扫描的端口数,如-p20-30。 如果只需进行版本检测,使用--version-trace。
--iflist (列举接口和路由)
输出Nmap检测到的接口列表和系统路由,用于调试路由问题或设备描述失误(如Nmap把PPP连接当作以太网对待)。
--append-output (在输出文件中添加)
当使用文件作为输出格式,如-oX或-oN, 默认该文件被覆盖。如果希望文件保留现有内容,将结果添加在现有文件后面,使用--append-output选项。所有指 定的输出文件都被添加。但对于XML(-oX)扫描输出 文件无效,无法正常解析,需要手工修改。
--resume <filename> (继续中断的扫描)
一些扩展的Nmap运行需要很长的时间 -- 以天计算,这类扫描往往不会结束。可以进行一些限制,禁止Nmap在工作时间运行,导致网络中断、运行Nmap的主机计划或非计划地重启、或者Nmap自己中断。运行Nmap的管理员可以因其它原因取消运行,按下ctrl-C 即可。从头开始启动扫描可能令人不快,幸运的是,如果标准扫描 (-oN)或Grep扫描(-oG)日志 被保留,用户可以要求Nmap恢复终止的扫描,只需要简单地使用选项 --resume并说明标准/Grep扫描输出文件,不允许 使用其它参数,Nmap会解析输出文件并使用原来的格式输出。使用方式 如nmap --resume 。Nmap将把新地结果添加到文件中,这种方式不支持XML输出格式,原因是将两次运行结果合并至一个XML文件比较困难。
--stylesheet <path or URL> (设置XSL样式表,转换XML输出)
Nmap提从了XSL样式表nmap.xsl,用于查看或转换XML输出至HTML。XML输出包含了一个xml-stylesheet,直接指向nmap.xml文件,该文件由Nmap安装(或位于Windows当前工作目录)。在Web浏览器中打开Nmap的XML输出时,将会在文件系统中寻找nmap.xsl文件,并使用它输出结果。如果希望使用不同的样式表,将它作为 --stylesheet的参数,必段指明完整的路径或URL。
--no-stylesheet (忽略XML声明的XSL样式表)
使用该选项禁止Nmap的XML输出关联任何XSL样式表。xml-stylesheet指示被忽略。
结语
以上是我官网学习后结合自己的理解对官网文档重新整理的。官网文档最为详细准确(基本所有的计算机相关技术),如果有官方文档,要学会查看官方文档,而不是从网上查找各种各样的照抄他人的辣鸡帖子。