Nmap和Zenmap详解

Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一。官网为: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背后有强大的社区团队支持。 

Zenmap是Nmap官方提供的图形界面,通常随Nmap的安装包发布。Zenmap是用Python语言编写而成的开源免费的图形界面,能够运行在不同操作系统平台上(Windows/Linux/Unix/Mac OS等)。Zenmap旨在为nmap提供更加简单的操作方式。简单常用的操作命令可以保存成为profile,用户扫描时选择profile即可;可以方便地比较不同的扫描结果;提供网络拓扑结构(NetworkTopology)的图形显示功能

一:探索目标主机是否在线

主机发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,那么说明目标主机是开启的。Nmap支持十多种不同的主机探测方式,比如发送ICMP echo/ICMP time stamp/ICMP address mask报文、发送TCP SYN/ACK包、发送SCTP INIT/COOKIE-ECHO包,用户可以在不同的条件下灵活选用不同的方式来探测目标机。

探测公网ip时,默认情况下( -sn),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
 例:  nmap  -sn   133.133.100.30  

依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误

通常主机发现并不单独使用,而只是作为端口扫描、版本侦测、OS侦测先行步骤。而在某些特殊应用(例如确定大型局域网内活动主机的数量),可能会单独专门适用主机发现功能来完成。

-sn: Ping Scan 只进行主机发现,不进行端口扫描。

-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。
 
-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: 追踪每个路由节点
  • -PE的ICMP Echo扫描简单来说是通过向目标发送ICMP Echo数据包来探测目标主机是否存活,但由于许多主机的防火墙会禁止这些报文,所以仅仅ICMP扫描通常是不够的。                                                                                                                    nmap   -PE   133.133.100.30

  • -PP的ICMP时间戳请求在大多数防火墙配置不当时可能会得到回复,可以以此方式来判断目标主机是否存活。倘若目标主机在线,该命令还会探测其开放的端口以及运行的服务!                                                                                                     nmap  -PP  133.133.100.30

  • -PM的ICMP地址掩码Ping扫描会试图用备选的ICMP等级Ping指定主机,通常有不错的穿透防火墙的效果                           nmap  -PM  133.133.100.30

    

探测局域网内在线的主机

在局域网内,使用  nmap  -PE/PP/PM  内网ipnmap -sn  内网ip 探测主机的开启情况,使用的是ARP请求报文,如果有ARP回复报文,说明主机在线。-PP/PE/PM命令探测到主机在线后,还会探测主机的端口的开启状态以及运行的服务,其探测端口状态原理在下一节中有介绍。在局域网内主要还是使用  nmap  -sn  内网ip 来探测目标主机的在线情况,这个命令不探测目标端口的开放情况,只探测主机是否在线。 探测一个局域网段内主机的在线情况,使用的是  nmap  -sn   网段/子网掩码 。

例:nmap  -sn  10.96.10.0/24 

   这个命令探测10.96.10.0 这个网段内主机的在线情况,返回在线主机的ip和MAC地址

二:端口扫描及其原理

端口扫描是Nmap最基本最核心的功能,用于确定目标主机的TCP/UDP端口的开放情况。

默认情况下,Nmap会扫描1000个最有可能开放的TCP端口。

Nmap通过探测将端口划分为6个状态:

  1. open:端口是开放的。
  2. closed:端口是关闭的。
  3. filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态。
  4. unfiltered:端口没有被屏蔽,但是否开放需要进一步确定。
  5. open|filtered:端口是开放的或被屏蔽。
  6. closed|filtered :端口是关闭的或被屏蔽

2.1 TCP SYN 扫描

这是Nmap默认的扫描方式,通常被称作半开放扫描。该方式发送SYN到目标端口,如果收到SYN/ACK回复,那么可以判断端口是开放的;如果收到RST包,说明该端口是关闭的。如果没有收到回复,那么可以判断该端口被屏蔽了。因为该方式仅发送SYN包对目标主机的特定端口,但不建立完整的TCP连接,所以相对比较隐蔽,而且效率比较高,适用范围广。

2.2 TCP connent 扫描

TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭。该方式扫描速度比较慢,而且由于建立完成的TCP连接会在目标主机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑使用的方式

2.3 TCP ACK 扫描

向目标主机的端口发送ACK包,如果收到RST包,说明该端口没有被防火墙屏蔽;没有收到RST包,说明被屏蔽。该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况

2.4 TCP FIN/Xmas/NULL 扫描

这三种扫描方式被称为秘密扫描,因为相对比较隐蔽。FIN扫描向目标主机的端口发送的TCP FIN 包或Xmas tree包或NULL包,如果收到对方的RST回复包,那么说明该端口是关闭的;没有收到RST包说明该端口可能是开放的或者被屏蔽了。其中Xmas tree包是指flags中FIN URG PUSH被置为1的TCP包;NULL包是指所有的flags都为0的TCP包。

2.5 UDP扫描

UDP扫描用于判断UDP端口的情况,向目标主机的UDP端口发送探测包,如果收到回复ICMP port unreachable就说明该端口是关闭的;如果没有收到回复,那说明该UDP端口可能是开放的或者屏蔽的。因此,通过反向排除法的方式来判断哪些UDP端口是可能处于开放状态的。

2.6 其他方式

除了以上几种常用的方式外,Nmap还支持多种其他的探测方式。例如使用SCTP INIT/Cookie-ECHO方式是来探测SCTP的端口开放情况;使用IP protocol方式来探测目标主机支持的协议类型(tcp/udp/icmp/sctp等等);使用idle scan方式借助僵尸主机来扫描目标主机,以达到隐蔽自己的目的;或者使用FTP bounce scan,借助FTP允许的代理服务扫描其他的主机,同样达到隐蔽自己的目的

三:端口扫描用法

扫描方式选项

-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>: 扫描指定的端口
 
实例: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T代表TCP协议、U代表UDP协议、S代表SCTP协议)
 
-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文件

简单扫描(搜索目标主机开放的端口号,运行的服务)

nmap   xx.xx.xx.xx

例如: nmap  202.207.236.2    这个命令会按照nmap-services文件中指定的端口后进行扫描,然后列出目标主机开放的端口号,以及端口号上运行的服务。在一次简单扫描中,Nmap会以默认TCP SYN扫描方式进行,仅判断目标端口是否开放,若开放,则列出端口对应的服务名称。

 探测主机是否在线:在简单扫描中,程序会先发送ICMP ECHO/TCP SYN/TCP ACK/ICMP Timestamp包探测主机是否在线,如果其中任何一个包有回应,说明主机在线,进而开始探测目标主机哪些端口开放。当探测的是内网主机时,发送的是ARP请求包探测主机是否在线,有回复说明主机在线!

        探测端口开放过程:  确定主机在线之后,nmap会按照nmap-services文件中的端口号发送TCP SYN报文给主机相应的端口,如果主机的端口打开了,则会回复一个包含TCP SYN、ACK的报文,nmap收到了主机的回复的报文后,会再回复一个TCP RST清除连接复位。则可确定目标主机的相应端口打开了!下面的截图是nmap是和目标主机的80号端口的探测过程,由此可见,目标主机的22号端口属于开放状态!

全面扫描(详细版本信息)

nmap   -A    xx.xx.xx.xx

例如: nmap  -A  202.207.236.2    这个命令不仅列出目标主机开放的端口号,对应的服务,还较为详细的列出了服务的版本,其支持的命令,到达目标主机的每一跳路由等信息。在进行完全扫描时,扫描机与目标主机之间存在大量的数据流量交互,扫描时长随之增加。完全扫描不仅仅是TCP协议上的通信交互,还有例如ICMP、HTTP、NBSS、TDS、POP等等协议的交互,这些协议的交互是因为在完全扫描开始时首先对目标主机的开放端口进行了确认,之后再根据不同对应的不同服务进行服务版本信息探测、账户信息等信息的探测!

探测主机是否在线:全面扫描时探测主机是否在线和简单扫描完全一致

探测端口是否打开:全面扫描时探测主机端口开放和简单扫描完全一致

探测端口服务具体版本:每个协议都不一样,总之就是确定端口开放了之后,和该端口进行更多的数据交互,以获得更多的信息。在下一节的版本探测中有更深入的研究

探测主机系统:在下一节的系统探测中有更深入的研究。

nmap -T4 -A -v xx.xx.xx.xx
  • -A选项用于使用进攻性方式扫描
  • -T4指定扫描过程使用的时序,总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况较好的情况下推荐使用T4
  • -v 表示显示冗余信息,在扫描过程中显示扫描的细节,从而让用户了解当前的扫描状态

例如:nmap -T4 -A -v 10.96.10.246

全面扫描时数据流量包的截图,确定了哪些端口的协议开启了之后,进行更加深入的探测!

探测指定端口的开放状态

在默认情况下,Nmap对端口的扫描方式是从小到大进行的,或者是参照nmap-services中文件列出的端口进行扫描。-p选项可以指定一个端口号或者一个端口范围。若既想扫描TCP端口又想扫描UDP端口,则需要在端口号前加上T:或U:来分别代表TCP和UDP协议。注意,要既扫描TCP又扫描UDP,则需要指定-sU及至少一个TCP扫描类型(-sS(半连接扫描),-sT(全连接扫描)等),如果没有给定协议限定符,端口号会被加到所有协议列表。

例: nmap  -p  80-445  10.96.10.246     扫描目标主机的80-445端口的开放情况

从上面的图中可以看到,若只简单的指定一个端口范围,Nmap会默认以TCP SYN方式扫描目标端口,若既想扫描目标TCP端口又想扫描UDP的端口,则需要指定扫描方式以及端口。

例: nmap  -sS   -sU  -p   T:80,U:445   10.96.10.246     以半连接的TCP SYN方式扫描目标主机的80端口,以UDP方式扫描目标主机的445端口

探测N个最有可能开放的端口

例:nmap -sS -sU -T4 --top-ports 100 10.96.10.246

参数-sS表示使用TCP SYN方式扫描TCP端口;-sU表示扫描UDP端口;-T4表示时间级别配置4级;--top-ports 100表示扫描最有可能开放的100个端口(TCP和UDP分别100个端口)。

四:版本侦测

版本侦测,用于确定目标主机开放端口上运行的具体的应用程序及版本信息。

Nmap提供的版本侦测具有如下的优点:

  • 高速。并行地进行套接字操作,实现一组高效的探测匹配定义语法。
  • 尽可能地确定应用名字与版本名字。
  • 支持TCP/UDP协议,支持文本格式与二进制格式。
  • 支持多种平台服务的侦测,包括Linux/Windows/Mac OS/FreeBSD等系统。
  • 如果检测到SSL,会调用openSSL继续侦测运行在SSL上的具体协议(如HTTPS/POP3S/IMAPS)。
  • 如果检测到SunRPC服务,那么会调用brute-force RPC grinder进一步确定RPC程序编号、名字、版本号。
  • 支持完整的IPv6功能,包括TCP/UDP,基于TCP的SSL。
  • 通用平台枚举功能(CPE)
  • 广泛的应用程序数据库(nmap-services-probes)。目前Nmap可以识别几千种服务的签名,包含了180多种不同的协议。

4.1版本侦测原理

版本侦测主要分为以下几个步骤:

  1. 首先检查open与open|filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
  2. 如果是TCP端口,尝试建立TCP连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中Probe TCP NULL q||对应的totalwaitms)。通常在等待时间内,会接收到目标机发送的“WelcomeBanner”信息。nmap将接收到的Banner与nmap-services-probes中NULL probe中的签名进行对比。查找对应应用程序的名字与版本信息。
  3. 如果通过“Welcome Banner”无法确定应用程序版本,那么nmap再尝试发送其他的探测包(即从nmap-services-probes中挑选合适的probe),将probe得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
  4. 如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配。根据结果对比分析出UDP应用服务类型。
  5. 如果探测到应用程序是SSL,那么调用openSSL进一步的侦查运行在SSL之上的具体的应用类型。
  6. 如果探测到应用程序是SunRPC,那么调用brute-force RPC grinder进一步探测具体服务。

4.2版本侦测用法

-sV: 指定让Nmap进行版本侦测
 
--version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。
 
--version-light: 指定使用轻量侦测方式 (intensity 2)
 
--version-all: 尝试使用所有的probes进行侦测 (intensity 9)
 
--version-trace: 显示出详细的版本侦测过程信息
例:  nmap  -sV  10.96.10.246

五:OS侦测

操作系统侦测用于检测目标主机运行的操作系统类型及设备类型等信息。

Nmap拥有丰富的系统数据库nmap-os-db,目前可以识别2600多种操作系统与设备类型。

5.1 OS侦测原理

Nmap使用TCP/IP协议栈指纹来识别不同的操作系统和设备。在RFC规范中,有些地方对TCP/IP的实现并没有强制规定,由此不同的TCP/IP方案中可能都有自己的特定方式。Nmap主要是根据这些细节上的差异来判断操作系统的类型的。

具体实现方式如下:

  1. Nmap内部包含了2600多已知系统的指纹特征(在文件nmap-os-db文件中)。将此指纹数据库作为进行指纹对比的样本库。
  2. 分别挑选一个open和closed的端口,向其发送经过精心设计的TCP/UDP/ICMP数据包,根据返回的数据包生成一份系统指纹。
  3. 将探测生成的指纹与nmap-os-db中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。

5.2 OS侦测用法

-O: 指定Nmap进行OS侦测。
 
--osscan-limit: 限制Nmap只对确定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)。
 
--osscan-guess: 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统
例: nmap -O 10.96.10.246

六:

Zenmap的扫描参数及其意义

Intense scan

(nmap -T4 -A -v)

一般来说,Intense scan可以满足一般扫描

-T4

 加快执行速度

-A

 操作系统及版本探测

-v

 显示详细的输出

Intense scan plus UDP

(nmap -sS -sU -T4 -A -v)

即UDP扫描

-sS

  TCP SYN 扫描

-sU

  UDP 扫描

Intense scan,all TCP ports

(nmap -p 1-65536 -T4 -A -v)

扫描所有TCP端口,范围在1-65535,试图扫描所有端口的开放情况,速度比较慢。

-p

 指定端口扫描范围

Intense scan,no ping

(nmap -T4 -A -v -Pn)

非ping扫描

-Pn

 非ping扫描

Ping scan

(nmap -sn)

Ping 扫描

优点:速度快。

缺点:容易被防火墙屏蔽,导致无扫描结果

-sn

 ping扫描

Quick scan

(nmap -T4 -F)

快速的扫描

-F

 快速模式。

Quick scan plus

(nmap -sV -T4 -O -F --version-light)

快速扫描加强模式

-sV

 探测端口及版本服务信息。

-O

 开启OS检测

--version-light

 设定侦测等级为2。

Quick traceroute

(nmap -sn --traceroute)

路由跟踪

-sn Ping

扫描,关闭端口扫描

-traceroute

 显示本机到目标的路由跃点。

Regular scan

规则扫描

Slow comprehensive scan

(nmap -sS -sU -T4 -A -v -PE -PP -PS80,443,-PA3389,PU40125 -PY -g 53 --script all)

慢速全面扫描。

猜你喜欢

转载自blog.csdn.net/qq_36119192/article/details/82079150