nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始建立的。随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一。最新版的Nmap6.0在2012年5月21日发布,详情请参见:www.nmap.org。html
通常状况下,Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行情况。Nmap能够检测目标机是否在线、端口开放状况、侦测运行的服务类型及版本信息、侦测操做系统与设备类型等信息。git
Nmap的优势:github
Zenmap是Nmap官方提供的图形界面,一般随Nmap的安装包发布。Zenmap是用Python语言编写而成的开源免费的图形界面,可以运行在不一样操做系统平台上(Windows/Linux/Unix/Mac OS等)。Zenmap旨在为nmap提供更加简单的操做方式。简单经常使用的操做命令能够保存成为profile,用户扫描时选择profile便可;能够方便地比较不一样的扫描结果;提供网络拓扑结构(NetworkTopology)的图形显示功能。
其中Profile栏位,用于选择“Zenmap默认提供的Profile”或“用户建立的Profile”;Command栏位,用于显示选择Profile对应的命令或者用户自行指定的命令;Topology选项卡,用于显示扫描到的目标机与本机之间的拓扑结构。数据库
Nmap包含四项基本功能:编程
而这四项功能之间,又存在大体的依赖关系(一般状况下的顺序关系,但特殊应用另外考虑),首先须要进行主机发现,随后肯定端口情况,而后肯定端口上运行具体应用程序与版本信息,而后能够进行操做系统的侦测。而在四项基本功能的基础上,Nmap提供防火墙与IDS(IntrusionDetection System,入侵检测系统)的规避技巧,能够综合应用到四个基本功能的各个阶段;另外Nmap提供强大的NSE(Nmap Scripting Language)脚本引擎功能,脚本能够对基本功能进行补充和扩展。安全
Nmap主要包括四个方面的扫描功能,主机发现、端口扫描、应用与版本侦测、操做系统侦测。在详细讲解每一个具体功能以前,首先能够看看Nmap的典型用法。服务器
若是直接针对某台计算的IP地址或域名进行扫描,那么Nmap对该主机进行主机发现过程和端口扫描。该方式执行迅速,能够用于肯定端口的开放情况。网络
命令形式:架构
nmap targethost
能够肯定目标主机在线状况及端口基本情况app
若是但愿对某台主机进行完整全面的扫描,那么可使用nmap内置的-A选项。使用了改选项,nmap对目标主机进行主机发现、端口扫描、应用程序与版本侦测、操做系统侦测及调用默认NSE脚本扫描。
命令形式:
nmap –T4 –A –v targethost
其中-A选项用于使用进攻性(Aggressive)方式扫描;-T4指定扫描过程使用的时序(Timing),总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通信情况良好的状况推荐使用T4;-v表示显示冗余(verbosity)信息,在扫描过程当中显示扫描的细节,从而让用户了解当前的扫描状态。
例如,扫描局域网内地址为192.168.1.100的电脑。显而易见,扫描出的信息很是丰富,在对192.168.1.100的扫描报告部分中(以红框圈出),能够看到主机发现的结果“Host is up”;端口扫描出的结果,有996个关闭端口,4个开放端口(在未指定扫描端口时,Nmap默认扫描1000个最有可能开放的端口);而版本侦测针对扫描到的开放情况进一步探测端口上运行的具体的应用程序和版本信息;OS侦测对该目标主机的设备类型与操做系统进行探测;而绿色框图是nmap调用NSE脚本进行进一步的信息挖掘的显示结果。
主机发现(Host Discovery),即用于发现目标主机是否在线(Alive,处于开启状态)。
主机发现发现的原理与Ping命令相似,发送探测包到目标主机,若是收到回复,那么说明目标主机是开启的。Nmap支持十多种不一样的主机探测方式,好比发送ICMP ECHO/TIMESTAMP/NETMASK报文、发送TCPSYN/ACK包、发送SCTP INIT/COOKIE-ECHO包,用户能够在不一样的条件下灵活选用不一样的方式来探测目标机。
Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。若是该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来肯定目标主机是否在线。
默认状况下,Nmap会发送四种不一样类型的数据包来探测目标主机是否在线。
依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证实目标机开启。使用四种不一样类型的数据包能够避免因防火墙或丢包形成的判断错误。
一般主机发现并不单独使用,而只是做为端口扫描、版本侦测、OS侦测先行步骤。而在某些特殊应用(例如肯定大型局域网内活动主机的数量),可能会单独专门适用主机发现功能来完成。
无论是做为辅助用法仍是专门用途,用户均可以使用Nmap提供的丰富的选项来定制主机发现的探测方式。
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。 -sn: Ping Scan 只进行主机发现,不进行端口扫描。 -Pn: 将全部指定的主机视做开启的,跳过主机发现的过程。 -PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。 -PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。-PO[protocollist]: 使用IP协议包探测对方主机是否开启。 -n/-R: -n表示不进行DNS解析;-R表示老是进行DNS解析。 --dns-servers : 指定DNS服务器。 --system-dns: 指定使用系统的DNS服务器 --traceroute: 追踪每一个路由节点
注意说明
-sn: Ping Scan 只进行主机发现,不进行端口扫描。 -Pn: 将全部指定的主机视做开启的,跳过主机发现的过程。 -PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。 -PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。-PO[protocollist]: 使用IP协议包探测对方主机是否开启。 -n/-R: -n表示不进行DNS解析;-R表示老是进行DNS解析。 --dns-servers <serv1[,serv2],...>: 指定DNS服务器。 --system-dns: 指定使用系统的DNS服务器 --traceroute: 追踪每一个路由节点其中,比较经常使用的使用的是-sn,表示只单独进行主机发现过程;-Pn表示直接跳过主机发现而进行端口扫描等高级操做(若是已经确知目标主机已经开启,可用该选项);-n,若是不想使用DNS或reverse DNS解析,那么可使用该选项。
下面以探测scanme.nmap.org 的主机为例,简单演示主机发现的用法。
命令以下:
nmap –sn –PE –PS80,135 –PU53 scanme.nmap.org
使用Wireshark抓包,咱们看到,scanme.nmap.org 的IP地址182.140.147.57发送了四个探测包:ICMPEcho,80和135端口的TCP SYN包,53端口的UDP包(DNS domain)。而收到ICMP Echo的回复与80端口的回复。从而肯定了scanme.nmap.org主机正常在线。
扫描局域网192.168.1.100-192.168.1.120范围内哪些IP的主机是活动的
命令以下:
nmap –sn 192.168.1.100-120
从结果中,能够看到这个IP范围内有三台主机处于活动状态。
从Wireshark抓取的包中,能够看到发送的探测包的状况:
在局域网内,Nmap是经过ARP包来询问IP地址上的主机是否活动的,若是收到ARP回复包,那么说明主机在线。
例如,某条ARP回复的报文详细信息以下:
端口扫描是Nmap最基本最核心的功能,用于肯定目标主机的TCP/UDP端口的开放状况。
默认状况下,Nmap会扫描1000个最有可能开放的TCP端口。
Nmap经过探测将端口划分为6个状态:
Nmap在端口扫描方面很是强大,提供了十多种探测方式。
这是Nmap默认的扫描方式,一般被称做半开放扫描(Half-open scanning)。该方式发送SYN到目标端口,若是收到SYN/ACK回复,那么判断端口是开放的;若是收到RST包,说明该端口是关闭的。若是没有收到回复,那么判断该端口被屏蔽(Filtered)。由于该方式仅发送SYN包对目标主机的特定端口,但不创建的完整的TCP链接,因此相对比较隐蔽,并且效率比较高,适用范围广。
TCP SYN探测到端口关闭:
TCP SYN探测到端口开放:
TCP connect方式使用系统网络API connect向目标主机的端口发起链接,若是没法链接,说明该端口关闭。该方式扫描速度比较慢,并且因为创建完整的TCP链接会在目标机上留下记录信息,不够隐蔽。因此,TCP connect是TCP SYN没法使用才考虑选择的方式。
TCP connect探测到端口关闭:
TCP connect探测到端口开放:
向目标主机的端口发送ACK包,若是收到RST包,说明该端口没有被防火墙屏蔽;没有收到RST包,说明被屏蔽。该方式只能用于肯定防火墙是否屏蔽某个端口,能够辅助TCP SYN的方式来判断目标主机防火墙的情况。
TCP ACK探测到端口被屏蔽:
TCP ACK探测到端口未被屏蔽:
这三种扫描方式被称为秘密扫描(Stealthy Scan),由于相对比较隐蔽。FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包/Null包,若是收到对方RST回复包,那么说明该端口是关闭的;没有收到RST包说明端口多是开放的或被屏蔽的(open|filtered)。
其中Xmas tree包是指flags中FIN URG PUSH被置为1的TCP包;NULL包是指全部flags都为0的TCP包。
TCP FIN探测到主机端口是关闭的:
TCP FIN探测到主机端口是开放或屏蔽的:
UDP扫描方式用于判断UDP端口的状况。向目标主机的UDP端口发送探测包,若是收到回复“ICMP port unreachable”就说明该端口是关闭的;若是没有收到回复,那说明UDP端口多是开放的或屏蔽的。所以,经过反向排除法的方式来判定哪些UDP端口是可能出于开放状态。
UDP端口关闭:
UDP端口开放或被屏蔽:
除上述几种经常使用的方式以外,Nmap还支持多种其余探测方式。例如使用SCTP INIT/COOKIE-ECHO方式来探测SCTP的端口开放状况;使用IP protocol方式来探测目标主机支持的协议类型(TCP/UDP/ICMP/SCTP等等);使用idle scan方式借助僵尸主机(zombie host,也被称为idle host,该主机处于空闲状态而且它的IPID方式为递增。详细实现原理参见:http://nmap.org/book/idlescan.html)来扫描目标在主机,达到隐蔽本身的目的;或者使用FTP bounce scan,借助FTP容许的代理服务扫描其余的主机,一样达到隐藏本身的身份的目的。
端口扫描用法比较简单,Nmap提供丰富的命令行参数来指定扫描方式和扫描端口。具体能够参见以下描述。
-sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。 -sU: 指定使用UDP扫描方式肯定目标主机的UDP端口情况。 -sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。 --scanflags <flags>: 定制TCP包的flags。 -sI <zombiehost[:probeport]>: 指定使用idle scan方式来扫描目标主机(前提须要找到合适的zombie host) -sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的状况。 -sO: 使用IP protocol 扫描肯定目标机支持的协议类型。 -b <FTP relay host>: 使用FTP bounce scan扫描方式
-p <port ranges>: 扫描指定的端口 -F: Fast mode – 快速模式,仅扫描TOP 100的端口 -r: 不进行端口随机打乱的操做(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫描不易被对方防火墙检测到)。 --top-ports <number>:扫描开放几率最高的number个端口(nmap的做者曾经作过大规模地互联网扫描,以此统计出网络上各类端口可能开放的几率。以此排列出最有可能开放端口的列表,具体能够参见文件:nmap-services。默认状况下,nmap会扫描最有可能的1000个TCP端口) --port-ratio <ratio>: 扫描指定频率以上的端口。与上述--top-ports相似,这里以几率做为参数,让几率大于--port-ratio的端口才被扫描。显然参数必须在在0到1之间,具体范围几率状况能够查看nmap-services文件。
实例
-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T表明TCP协议、U表明UDP协议、S表明SCTP协议)
这里,咱们以扫描局域网内192.168.1.100主机为例。命令以下:
nmap –sS –sU –T4 –top-ports 300 192.168.1.100
参数-sS表示使用TCP SYN方式扫描TCP端口;-sU表示扫描UDP端口;-T4表示时间级别配置4级;--top-ports 300表示扫描最有可能开放的300个端口(TCP和UDP分别有300个端口)。
从上图中,咱们看到扫描结果,横线处写明有共有589端口是关闭的;红色框图中列举出开放的端口和多是开放的端口。
版本侦测,用于肯定目标主机开放端口上运行的具体的应用程序及版本信息。
Nmap提供的版本侦测具备以下的优势:
简要的介绍版本的侦测原理。版本侦测主要分为如下几个步骤:
版本侦测方面的命令行选项比较简单
-sV: 指定让Nmap进行版本侦测 --version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,可是运行时间会比较长。 --version-light: 指定使用轻量侦测方式 (intensity 2) --version-all: 尝试使用全部的probes进行侦测 (intensity 9) --version-trace: 显示出详细的版本侦测过程信息。
nmap –sV 192.168.1.100
对主机192.168.1.100进行版本侦测。
从结果中,咱们能够看到996个端口是关闭状态,对于4个open的端口进行版本侦测。图中红色为版本信息。红色线条划出部分是版本侦测获得的附加信息,由于从应用中检测到微软特定的应用服务,因此推断出对方运行的Windows的操做系统。
操做系统侦测用于检测目标主机运行的操做系统类型及设备类型等信息。Nmap拥有丰富的系统数据库nmap-os-db,目前能够识别2600多种操做系统与设备类型。
Nmap使用TCP/IP协议栈指纹来识别不一样的操做系统和设备。在RFC规范中,有些地方对TCP/IP的实现并无强制规定,由此不一样的TCP/IP方案中可能都有本身的特定方式。Nmap主要是根据这些细节上的差别来判断操做系统的类型的。
具体实现方式以下:
OS侦测的用法简单,Nmap提供的命令比较少。
-O: 指定Nmap进行OS侦测。 --osscan-limit: 限制Nmap只对肯定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)。 --osscan-guess: 大胆猜想对方的主机的系统类型。由此准确性会降低很多,但会尽量多为用户提供潜在的操做系统。
nmap –O 192.168.1.100
从上图中可看到,指定-O选项后先进行主机发现与端口扫描,根据扫描到端口来进行进一步的OS侦测。获取的结果信息有设备类型,操做系统类型,操做系统的CPE描述,操做系统细节,网络距离等。
防火墙与IDS规避为用于绕开防火墙与IDS(入侵检测系统)的检测与屏蔽,以便可以更加详细地发现目标主机的情况。Nmap提供了多种规避技巧,一般能够从两个方面考虑规避方式:数据包的变换(Packet Change)与时序变换(Timing Change)。
将可疑的探测包进行分片处理(例如将TCP包拆分红多个IP包发送过去),某些简单的防火墙为了加快处理速度可能不会进行重组检查,以此避开其检查。
在进行扫描时,将真实IP地址和其余主机的IP地址(其余主机须要在线,不然目标主机将回复大量数据包到不存在的主机,从而实质构成了拒绝服务攻击)混合使用,以此让目标主机的防火墙或IDS追踪检查大量的不一样IP地址的数据包,下降其追查到自身的几率。注意,某些高级的IDS系统经过统计分析仍然能够追踪出扫描者真实IP地址。
顾名思义,IP假装即将本身发送的数据包中的IP地址假装成其余主机的地址,从而目标机认为是其余主机在与之通讯。须要注意,若是但愿接收到目标主机的回复包,那么假装的IP须要位于统一局域网内。另外,若是既但愿隐蔽本身的IP地址,又但愿收到目标主机的回复包,那么能够尝试使用idle scan或匿名代理(如TOR)等网络技术。
某些目标主机只容许来自特定端口的数据包经过防火墙。例如FTP服务器配置为:容许源端口为21号的TCP包经过防火墙与FTP服务端通讯,可是源端口为其余端口的数据包被屏蔽。因此,在此类状况下,能够指定Nmap将发送的数据包的源端口都设置特定的端口。
某些防火墙针对发送过于频繁的数据包会进行严格的侦查,并且某些系统限制错误报文产生的频率(例如,Solaris 系统一般会限制每秒钟只能产生一个ICMP消息回复给UDP扫描),因此,定制该状况下发包的频率和发包延时能够下降目标主机的审查强度、节省网络带宽。
Nmap还提供多种规避技巧,好比指定使用某个网络接口来发送数据包、指定发送包的最小长度、指定发包的MTU、指定TTL、指定假装的MAC地址、使用错误检查和(badchecksum)。
更多信息http://nmap.org/book/man-bypass-firewalls-ids.html
-f; --mtu <val>: 指定使用分片、指定数据包的MTU. -D <decoy1,decoy2[,ME],...>: 用一组IP地址掩盖真实地址,其中ME填入本身的IP地址。 -S <IP_Address>: 假装成其余IP地址 -e <iface>: 使用特定的网络接口 -g/--source-port <portnum>: 使用指定源端口 --data-length <num>: 填充随机数据让数据包长度达到Num。 --ip-options <options>: 使用指定的IP选项来发送数据包。 --ttl <val>: 设置time-to-live时间。 --spoof-mac <mac address/prefix/vendor name>: 假装MAC地址 --badsum: 使用错误的checksum来发送数据包(正常状况下,该类数据包被抛弃,若是收到回复,说明回复来自防火墙或IDS/IPS)。
nmap -v -F -Pn -D192.168.1.100,192.168.1.102,ME -e eth0 -g 3355 192.168.1.1
其中,-F表示快速扫描100个端口;-Pn表示不进行Ping扫描;-D表示使用IP诱骗方式掩盖本身真实IP(其中ME表示本身IP);-e eth0表示使用eth0网卡发送该数据包;-g 3355表示本身的源端口使用3355;192.168.1.1是被扫描的目标IP地址。
咱们能够从Wireshark中看到数据包的流动状况:对于每一个探测包,Nmap都使用-D选项指定的IP地址发送不一样的数据包,从而达到扰乱对方防火墙/IDS检查的目的(更好的方式-D选项中嵌入RND随机数,这样更具备迷惑性)。当探测到80端口时候,目标主机向咱们回复了SYN/ACK包回来(固然也向其余诱骗的IP回复SYN/ACK包,咱们没法接收到),证实80端口是开放的。
NSE脚本引擎(Nmap Scripting Engine)是Nmap最强大最灵活的功能之一,容许用户本身编写脚原本执行自动化的操做或者扩展Nmap的功能。
NSE使用Lua脚本语言,而且默认提供了丰富的脚本库,目前已经包含14个类别的350多个脚本。
NSE的设计初衷主要考虑如下几个方面:
下面以daytime.nse脚本为例说明一下NSE格式。
NSE的使用Lua脚本,而且配置固定格式,以减轻用户编程负担。一般的一个脚本分为几个部分:
description字段:描述脚本功能的字符串,使用双层方括号表示。 comment字段:以--开头的行,描述脚本输出格式 author字段:描述脚本做者 license字段:描述脚本使用许可证,一般配置为Nmap相同的license categories字段:描述脚本所属的类别,以对脚本的调用进行管理。 rule字段:描述脚本执行的规则,也就是肯定触发脚本执行的条件。在Nmap中有四种类型的规则,prerule用于在Nmap没有执行扫描以前触发脚本执行,这类脚本并不需用到任何Nmap扫描的结果;hostrule用在Nmap执行完毕主机发现后触发的脚本,根据主机发现的结果来触发该类脚本;portrule用于Nmap执行端口扫描或版本侦测时触发的脚本,例如检测到某个端口时触发某个脚本执行以完成更详细的侦查。postrule用于Nmap执行完毕全部的扫描后,一般用于扫描结果的数据提取和整理。在上述实例中,只有一个portrule,说明该脚本在执行端口扫描后,若检测到TCP 13号端口开放,那么触发该脚本的执行。 action字段:脚本执行的具体内容。当脚本经过rule字段的检查被触发执行时,就会调用action字段定义的函数。
Nmap提供很多脚本使用的命令行参数。
-sC: 等价于 --script=default,使用默认类别的脚本进行扫描。 --script=<Lua scripts>: <Lua scripts>使用某个或某类脚本进行扫描,支持通配符描述 --script-args=<n1=v1,[n2=v2,...]>: 为脚本提供默认参数 --script-args-file=filename: 使用文件来为脚本提供参数 --script-trace: 显示脚本执行过程当中发送与接收的数据 --script-updatedb: 更新脚本数据库 --script-help=<Lua scripts>: 显示脚本的帮助信息,其中<Luascripts>部分能够逗号分隔的文件或脚本类别。
配合脚本扫描192.168.1.1,查看可否得到有用的信息。
nmap –sV –p 80 –v –script default,http*192.168.1.1
从上图中,咱们能够看到Nmap扫描到对方80端口是开放的,而后使用了大量的名字为http开头的脚本对其进行扫描。扫描过程发如今http-auth脚本执行,出现了“Basic relm=TP-LINK Wireless N router WR740”字样(红线划出部分),这里已经挖掘对方的设备类型与具体版本信息。若是咱们知道更多关于WR740已知的漏洞,那么就能够进行更进一步的渗透测试了。
Nmap创始人Fyodor编写的Nmap的权威指南,很是详尽地描述Nmap的实现原理及使用方法。Nmap官方文档正是来自该书部分章节。
Secrets of Network Cartography
该书对Nmap的实现原理及使用场景有比较丰富的介绍。
Nmap in the Enterprise: Your Guide to Network Scanning
这本书描述Nmap在企业领域的运用。
这nmap使用方法的思惟导图(一页纸的图片),对Nmap用法整理很完整。
官网:www.nmap.org
安全工具排名:http://sectools.org/