Nmap扫描原理与用法PDF:下载地址
Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一。最新版的Nmap6.0在2012年5月21日发布,详情请参见:www.nmap.org。
一般情况下,Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。Nmap可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。
Nmap的优点:
1. 灵活。支持数十种不同的扫描方式,支持多种目标对象的扫描。
2. 强大。Nmap可以用于扫描互联网上大规模的计算机。
3. 可移植。支持主流操作系统:Windows/Linux/Unix/MacOS等等;源码开放,方便移植。
4. 简单。提供默认的操作能覆盖大部分功能,基本端口扫描nmap targetip,全面的扫描nmap –A targetip。
5. 自由。Nmap作为开源软件,在GPL License的范围内可以自由的使用。
6. 文档丰富。Nmap官网提供了详细的文档描述。Nmap作者及其他安全专家编写了多部Nmap参考书籍。
7. 社区支持。Nmap背后有强大的社区团队支持。
8. 赞誉有加。获得很多的奖励,并在很多影视作品中出现(如黑客帝国2、Die Hard4等)。
9. 流行。目前Nmap已经被成千上万的安全专家列为必备的工具之一。
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
可以确定目标主机在线情况及端口基本状况。
如果希望对某台主机进行完整全面的扫描,那么可以使用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包,用户可以在不同的条件下灵活选用不同的方式来探测目标机。
主机发现基本原理:(以ICMP echo方式为例)
Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。如果该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来确定目标主机是否在线。
默认情况下,Nmap会发送四种不同类型的数据包来探测目标主机是否在线。
1. ICMP echo request
2. a TCP SYN packet to port 443
3. a TCP ACK packet to port 80
4. an ICMP timestamp request
依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。
通常主机发现并不单独使用,而只是作为端口扫描、版本侦测、OS侦测先行步骤。而在某些特殊应用(例如确定大型局域网内活动主机的数量),可能会单独专门适用主机发现功能来完成。
不管是作为辅助用法还是专门用途,用户都可以使用Nmap提供的丰富的选项来定制主机发现的探测方式。
-PS [portlist]
(TCP SYN Ping),-PA [portlist]
(TCP ACK Ping),-PU [portlist]
(UDP Ping),-PE
; -PP
; -PM
(ICMP Ping Types),-PR
(ARP Ping),-sP
(Ping扫描)等,详见http://nmap.org/man/zh/man-host-discovery.html
其中,比较常用的使用的是-sn,表示只单独进行主机发现过程;-Pn表示直接跳过主机发现而进行端口扫描等高级操作(如果已经确知目标主机已经开启,可用该选项);-n,如果不想使用DNS或reverse DNS解析,那么可以使用该选项。
探测scanme.nmap.org
下面以探测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提供丰富的命令行参数来指定扫描方式和扫描端口。
具体可以参见如下描述。
这里,我们以扫描局域网内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提供的版本侦测具有如下的优点:
简要的介绍版本的侦测原理。
版本侦测主要分为以下几个步骤:
版本侦测方面的命令行选项比较简单。
命令:
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提供的命令比较少。
命令:
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
使用命令:
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提供不少脚本使用的命令行参数。
配合脚本扫描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命令使用详细解释
-P0 -PT -PS -PU -PE -PP -PM -PB 当nmap进行某种类型的端口或协议扫描时,通常都会尝试先ping 主机,这种尝试可使nmap不会浪费时间在那些未开机的主机上,但是许多主机与防火墙会阻塞ICMP报文,我们希望能通过控制使用。
-P0 告诉nmap不ping 主机,只进行扫描
-PT 告诉nmap使用TCP的ping
-PS 发送SYN报文。
-PU 发送一个udp ping
-PE 强制执行直接的ICMP ping
-PB 这是默认类型,可以使用ICMP ping 也可以使用TCP ping .
-6 该标志允许IPv6支持
-v -d 使用-v选项可得到更详细的输出,而-d选项则增加调试输出。
-oN 按照人们阅读的格式记录屏幕上的输出,如果是在扫描多台机器,则该选项很有用。
-oX 以xml格式向指定的文件记录信息
-oG 以一种易于检索的格式记录信息,即每台主机都以单独的行来记录所有的端口和0s信息。
-oA 使用为基本文件名,以普通格式(-oN)、XML格式(-oX)和易于检索的格式(-oG)jilu xinxi
-oM 把输出格式化为机器可阅读的文件
-oS 把输出进行傻瓜型排版
--resume如果你取消了扫描,但生成了供人或者供机器阅读的文件,那么可以把该文件提供给nmap继续让它扫描。
-iR-iL可以不在命令行中指定目标主机,而是使用-iR选项随即产生待扫描的主机,或者使用-iL选项从一个包含主机名或IP地址列表的文件中读取目标主机,这些主机名或IP地址使用空格、制表符或换行隔开。
-F nmap只扫描在nmap内建的服务文件中已知的端口,如果不指定该选项,nmap将扫描端口1-1024及包含在nmap-services文件中的所有其他端口。如果用-sO选项扫描协议,nmap将用它内建的协议文件(nmap-protocols文件)而不是默认地扫描所有256个协议。
-A nmap使用所有的高级扫描选项
-p 参数可以是一个单独的端口、一个用逗号隔开的端口列表、一个使用“-”表示的端口范围或者上述格式的任意组合。如果没有指定该选项,nmap将对包含前1024个端口的所有端口进行一次快速扫描。
-e在多穴主机中,可以指定你用来进行网络通信的网络接口。
-g可以选择一个源端口,从该端口执行所有的扫描。
--ttlnmap其发送的任何报文在到中间路由器的跳后会失效。
--packet-trace 可以显示扫描期间nmap发送和接收的各个报文的详细列表,这对调试非常有用。要与-o选项之一联合使用,需要根权限,以将所有的数据记录到文件。
--scanflags可以使用这个选项手工的指定欲在扫描报文中设置的TCP标志。也可以指定TCP标志的OOred值的整数形式,或者标志的字符串表示形式。
Nmap Network Scanning
Nmap创始人Fyodor编写的Nmap的权威指南,非常详尽地描述Nmap的实现原理及使用方法。Nmap官方文档正是来自该书部分章节。
Secrets of Network Cartography
该书对Nmap的实现原理及使用场景有比较丰富的介绍。
Nmap in the Enterprise: Your Guide to Network Scanning
这本书描述Nmap在企业领域的运用。
Nmap mindmap.pdf
这nmap使用方法的思维导图(一页纸的图片),对Nmap用法整理很完整。
官网:www.nmap.org
安全工具排名:http://sectools.org/