nmap扫描

系统漏洞扫描之王-nmap

       NMap,也就是Network Mapper,是Linux下的网络扫描和嗅探工具包。他的图形化界面是Zenmap,分布式框架为Dnamp。Nmap是一款网络扫描和主机检测的非常有用的工具。Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。

其基本功能有三个:

(1)是扫描主机端口,嗅探所提供的网络服务

(2)是探测一组主机是否在线

(3)还可以推断主机所用的操作系统,到达主机经过的路由,系统已开放端口的软件版本。

Nmap在实际中应用场合如下:

(1)通过对设备或者防火墙的探测来审计它的安全性

(2)探测目标主机所开放的端口

(3)通过识别新的服务器审计网络的安全性

(4)探测网络上的主机

 

nmap端口状态解析

open : 应用程序在该端口接收 TCP 连接或者 UDP 报文。 

closed :关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应。但没有应用程序在其上监听。

filtered :由于包过滤阻止探测报文到达端口,nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由规则 或者主机上的软件防火墙。

unfiltered :未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这个状态。

open | filtered :无法确定端口是开放还是被过滤, 开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何反应。UDP,IP协议,FIN, Null 等扫描会引起。

closed|filtered:(关闭或者被过滤的):无法确定端口是关闭的还是被过滤的

端口扫描工具,即借助工具,试图了解所扫描IP提供的计算机网络服务类型(网络服务均与端口号相关),从而发现攻击弱点,常见服务对应端口号:

 

服务

端口号

HTTP

80

HTTPS

443

Telnet

23

FTP

21

SSH(安全登录)、SCP(文件传输)、端口重定向

22

SMTP

25

POP3

110

WebLogic

7001

TOMCAT

8080

WIN2003远程登录

3389

Oracle数据库

1521

MS SQL* SEVER数据库sever

1433

MySQL 数据库sever

3306

Nmap进行完整全面的扫描
nmap –T4 –A –v

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

Nmap实现原理

Nmap功能的实现基于TCP/IP协议,下面将曾从协议层面分析Nmap的实现原理。

1. 主机发现

        主机发现通常在端口扫描以前,确定目标主机是否在线,也可以单独运行构建局域网拓扑。Nmap主机发现的实现分为两个阶段:地址解析阶段+实际探测阶段。地址解析主要负责从主机表达式中解析出目标主机地址,将之存放在hostbatch中,并配置该主机所需的路由、网口、MAC地址、源IP等信息。实际发现分别对解析出来的目标主机,进行实际的探测以及获取RDNS相关信息,例如采用ARP包发现局域网内主机是否在线。

        Nmap从主机表达式中获取主机地址,若取得的不是IP需要进行DNS解析,获取域名对应的IP。在实际主机发现过程中,根据所利用的协议的不同,分为以下两种:

(1)利用IP层协议的方式:1)ARP方式。ARP方式一般用于Nmap对局域网进行扫描的情况下,因为基于RFC1918私有地址范围的网络中在一个给定的时间内绝大部分IP地址都是不使用的。当Nmap试图发送一个原始IP报文如ICMP回声请求时,操作系统必须确定对应于目标IP的硬件地址(需要使用ARP),所以直接放弃IP报文阶段,在得到ARP回应时就可以知道目标主机处于活跃状态。2)Ping扫描。仅仅进行ping扫描,发送ICMP数据包,将作出响应的主机进行打印。

(2)利用运输层协议的方式:1)发送SYN数据包、发送ACK数据包、发送UDP数据包。前两种分别利用了TCP三次握手中的第一次握手与第二次握手。让对方觉得正在试图建立一个TCP连接,从而做出回应,根据回应得出主机状态。UDP则是发送一个UDP数据包,得到端口不可达、主机网络不可达的回应。

2. 端口扫描

       Nmap提供的10多种类型的端口扫描方法,如TCPSYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP portunreachable/ UDP recv_from, IP protocol,SCTPINIT/SCTP COOKIE ECHO等扫描方式。这些技术全部是基于运输层与应用层的协议,原理都是基于网络数据包的特征或者网络编程API来判定端口的状态。以TCP SYN方式(Nmap的默认的TCP扫描方式)为例来简单地回顾端口扫描原理。

第一种情况表示端口处于关闭状态,第二种情况表示端口处于开放状态。

        端口扫描功能会用到nmap-services数据库文件,此文件描述互联网上常见的注册端口对应的服务名称,以及该端口开放的频率和注释信息。端口开放的频率是Nmap项目组对互联网上大量的计算机进行扫描,统计出的每个端口开放的概率值,所以根据此概率可以很方便指定扫描覆盖的范围。

3. 版本侦测

        扫描原理是服务指纹(或称签名)对比匹配。Nmap内部包含了几千种常见服务指纹的数据库(nmap-service-probes),对目标端口进行连接通信,产生当前端口的服务指纹,再与指纹数据库对比,寻找出匹配的服务类型。

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

4. 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. 如何构建端口扫描工具总结

1)主机发现。

        对于主机的探测,需要使用网络层或者运输层协议。网络层用于测试主机可不可达的有ping,利用ICMP协议。但是有时防火墙或其他IDS会将ICMP数据包丢弃,所以这时就需要使用上层运输层的TCP或者UDP协议。TCP假装发起连接或者接受连接,根据目标机的回应判断。

2)端口探测。

        端口的概念处于运输层,所以理论上应该利用TCP/UDP协议或者更高层应用层的协议进行探测。TCP端口的扫描相对简单,利用三次握手就可以。首先client端向server某端口发送请求连接的syn包,server的该端口如果允许连接,会给client端发一个ack与syn,client端收到server的ack包后再给server端发一个ack包,tcp连接正式建立。基于连接的建立过程,可以想到,假如要扫描某一个tcp端口,可以往该端口发一个syn包,如果该端口处于打开状态,我们就可以收到一个ack,也就是说,如果收到ack,就可以判断目标扫描出于打开状态,否则,目标端口处于关闭状态。

        UDP由于是无连接的,所以其扫描比TCP麻烦很多。基本原理是发送空的UDP报头到每个目标端口。如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。如果几次重试后还没有响应,该端口就被认为是 open|filtered(开放|被过滤的)。UDP端口扫描的巨大挑战是怎样使它更快速。 开放的和被过滤的端口很少响应,让Nmap超时然后再探测,以防探测帧或者 响应丢失。关闭的端口常常是更大的问题。 它们一般发回一个ICMP端口无法到达错误。但是不像关闭的TCP端口响应SYN或者Connect 扫描所发送的RST报文,许多主机在默认情况下限制ICMP端口不可到达消息。 Linux和Solaris对此特别严格。

3)版本侦测与OS侦测:

        版本侦测与OS侦测,原理上是基于端口探测结果,综合多个端口探测结果进行加权,得到签名以后跟已有的库相比较。准确性取决于能探测的端口数量与质量以及签名库的丰富程度。

4)探测准确性与效率

        一种是根据实际网络场景,人工的调整扫描参数,在满足一定准确性的同时降低扫描时间。或者更智能化一点,能达到一种网络场景自适应的效果,系统本身能通过学习实时的网络场景,规避一些坑,提高效率与准确性。

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 <serv1[,serv2],...>: 指定DNS服务器。 

  --system-dns: 指定使用系统的DNS服务器 

  --traceroute: 追踪每个路由节点

Nmap用于端口扫描的一些用法

1.扫描方式选项

-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扫描方式 

2.端口参数与扫描顺序

-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文件。 

3.版本侦测的用法

-sV: 指定让Nmap进行版本侦测 

  --version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。 

  --version-light: 指定使用轻量侦测方式 (intensity 2) 

  --version-all: 尝试使用所有的probes进行侦测 (intensity 9) 

  --version-trace: 显示出详细的版本侦测过程信息。 

具体操作演示

  1. 扫描目标
  1. 扫描单个网络

执行NMAP 192.168.1.1或者www.baidu.com这样的主机名。

nmap扫描

用-vv对扫描结果进行详细输出

nmap扫描

  1. 扫描多个网络/目标(中间用空格隔开)

执行NMAP 192.168.1.1 192.168.1.2等,NMAP将扫描同个网段内不同的ip地址。还可以在相同的命令一次扫描多个网站/域名。这将域名转换为其对应的IP地址和扫描目标。

  1. 扫描连续的IP地址:

NMAP 192.168.2.1-192.168.2.100

NMAP也可以用使用CIDR(无类别域间路由)表示法整个子网。

命令:NMAP 192.168.2.1/24

  1. 扫描目标列表

如果你有大量的系统进行扫描,就可以在文本文件中输入IP地址(或主机名),并使用该文件作为输入。命令:NMAP -iL [LIST.TXT]

  1. 不进行ping

该-PN选项指示NMAP跳过默认的发现检查并对执行对目标的完整端口扫描。当扫描被阻止ping探针的防火墙保护的主机时,这是非常有用的。

语法:NMAP -PN 目标

nmap扫描

  1. 仅进行ping

选项-sP让NMAP仅对主机进行ping。当要探测一批ip地址中哪些是可达的时候非常有用。通过指定特定的目标,你可以得到更多的信息,比如MAC地址。

命令: NMAP -sP 目标

  1. TCP SYN扫描

在我们开始之前,我们必须知道SYN数据包是什么。基本上是一个SYN包被用于启动两个主机之间的连接。在TCP SYN ping发送一个SYN包到目标系统,并监听响应。这种替代探索方法对被配置为阻止标准ICMP ping消息主机是有用的。该-PS选项进行TCP SYN Ping。

命令:NMAP -PS主机

  1. 路由跟踪

nmap -traceroute <target ip>

nmap扫描

  1. 操作系统探测(因防火墙设置问题常导致系统版本识别不正确)

nmap -O <target ip>

  1. 强力检测(包含以下信息)

nmap -A ip   检测目标主机下述信息(时间较长),包含以下信息:

检测服务端软件版本信息  nmap -sV ip

操作系统 系统识别     nmap -O ip

脚本扫描    -sC

技术有限,文章也比较基础,希望可以帮到和我一样的技术小白共同进步。