概念
端口扫描就是通过连接到目标系统的TCP或UDP端口,来确定什么服务正在运行。一个端口就是一个潜在的通信通道,也就是一个入侵通道。从对黑客攻击行为的分析和收集的漏洞来看,绝大多数都是针对某一个网络服务,也就是针对某一个特定的端口的。对目标计算机进行端口扫描,能得到许多有用的信息。
扫描技术分类
全连接扫描,半连接扫描,秘密扫描和其他端口扫描技术。
其中,TCP connect()扫描是端口扫描最基础的一种扫描方式。
TCP SYN扫描在扫描过程中没有建立完整的TCP连接,这和TCP connect()扫描不同,因此又称为半连接扫描。
秘密扫描包含有TCP FIN扫描、TCPACK扫描等多种扫描方式。
其他扫描技术包含有UDP扫描和IP头信息dumb扫描等。
全TCP连接扫描
这是最基本的TCP扫描,实现方法最简单,直接连到目标端口并完成一个完整的三次握手过程(SYN,SYN/ACK和ACK)。Socket API提供的Connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于监听状态,那么Connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大优点是不需要任何权限,系统中的任何用户都可以使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的Connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。这种扫描方法的缺点是很容易被目标系统检测到,并且被过滤掉。目前的系统会对连接进行记录,因此目标计算机的日志文件会显示大量密集的连接和连接出错的消息记录,并且能很快地使它关闭。如:TCP Wrapper监测程序通常用来进行监测,可以对连接请求进行控制,所以它可以用来阻止来自不明主机的全连接扫描。针对这一缺陷,便产生了TCP SYN扫描,也就是通常说的半开放扫描。
优点:
扫描速度快;
缺点:
容易被目标系统检测到,记录到日志文件。
TCP SYN扫描
在这种技术中,扫描主机向目标主机的选择端口发送SYN数据段。如果应答是RST,那么说明端口是关闭的;如果应答中包含SYN和ACK,说明目标端口处于监听状态。由于在SYN扫描时,全连接尚未建立,所以这种技术通常被称为半打开扫描或者半开放扫描。SYN扫描的优点在于即使日志中对扫描有所记录,但是尝试进行连接的记录也要比全扫描少得多。缺点是在大部分操作系统下,发送主机需要构造适用于这种扫描的IP包,并且在通常情况下必须要有超级用户权限才能建立自己的SYN数据包。
优点:
连接的记录信息少;
缺点:
需要权限建立SYN数据包。
秘密扫描
TCP FIN扫描
对某端口发送一个TCP FIN数据报给远端主机。如果主机没有任何反馈,那么这个主机是存在的,而且正在监听这个端口;主机反馈一个TCP RST回来,那么说明该主机是存在的,但是没有监听这个端口。由于这种技术不包含标准的TCP三次握手协议的任何部分,所以无法被记录下来,从而比SYN扫描隐蔽得多,也称作秘密扫描。这种扫描技术使用FIN数据包来探测端口。当一个FIN数据包到达一个关闭的端口,数据包会被丢掉,并且会返回一个RST数据包。否则,当一个FIN数据包到达一个打开的端口,数据包只是简单的丢掉(不返回RST)。这种方法和系统实现有一定的关系,有的系统不管端口是否打开,都回复RST,如:Windows,CISCO。所以,这种技术通常适用于UNIX目标主机,跟SYN扫描类似,FIN扫描也需要自己构造IP包。
优点:
隐蔽;
缺点:
通常只适用于UNIX主机。
TCP ACK扫描
这种扫描技术主要用来探测过滤性防火墙的过滤规则,无论目标端口的状态如何,如果发送ACK报文,就只能收到RST响应报文。但是对于防火墙,如果端口被过滤,要么收不到报文,要么收到ICMP(目标不可达),相反,如果没有被过滤时则收到有关RST报文。
NULL扫描
扫描主机将TCP数据包中的ACK(确认)、FIN(结束连接)、RST(重新设定连接)、SYN(连接同步化要求)、URG(紧急)、PSH(接收端将数据转由应用处理)标志位置空后发送给目标主机。若目标端口开放,目标主机将不返回任何信息。若目标主机返回RST信息,则表示端口关闭。
XMAS扫描
XMAS扫描和NULL扫描类似,将TCP数据包中的ACK、FIN、RST、SYN、URG、PSH标志位置1后发送给目标主机,在目标端口开放的情况下,目标主机将不返回任何信息,若目标端口关闭,则目标主机将返回RST信息。还需要说明的是,MS Windows、Cisco、BSDI、HP/UX、MVS以及IRIX等操作系统如果采用TCP FIN、XMAS以及NULL扫描等方式进行扫描的话,对于打开的端口也会发送RST数据包,即使所有端口都关闭,也可以进行应答。在这种情况下,就可以进行TCP SYN扫描,如果出现打开的端口,操作系统就会知道是MS Windows、Cisco、BSDI、HP/UX、MVS以及IRIX中哪类了。
SYN/ACK扫描
这种扫描故意忽略TCP的三次握手:SYN—SYN/ACK—ACK。这里,扫描主机不向目标主机发送SYN数据包,而先发送SYN/ACK数据包。目标主机将报错,并判断为一次错误的连接。若目标端口开放,目标主机将返回RST信息,若目标端口关闭,目标主机将不返回任何信息,数据包会被丢掉。
UDP ICMP端口不可达扫描
由于UDP协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。幸运的是,许多主机在你向一个未打开的UDP端口发送一个数据包时,会返回一个ICMP_PORT_UNREACH错误。这样就能发现哪个端口是关闭的。由于UDP协议是面向无连接的协议,这种扫描技术的精确性高度依赖于网络性能和系统资源。另外,如果目标主机采用了大量的分组过滤技术,那么UDP扫描过程会变的非常慢。比如大部分系统都采用了 RFC1812 的建议,限定了ICMP差错分组的速率,比如LINUX系统中只允许4秒最多只发送80个目的地不可达消息,而Solaris每秒只允许发送两个不可到达消息,然而微软仍保留了它一贯的做法,忽略了RFC1812的建议,没有对速率进行任何限制,因此,能在很短的时间内扫完WINDOWS机器上所有64K 的UDP端口。说到这里,我想大家都应该心里有数,在什么情况下可以有效的使用UDP扫描,而不是一味去埋怨扫描器的速度慢了。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。同样,这种扫描方法需要具有root权限。
优点:
能够很方便的判断哪些UDP端口是关闭的;
缺点:
扫描的精确性高度依赖于网络性能和系统资源;
Nmap扫描类型
|
|
nmap -sP 192.168.1.100
Nmap给每个扫描到的主机发送一个ICMP echo和一个ACK,被扫描主机对任何一种的响应都会被Nmap得到。这种方式可用来检测局域网内有哪些主机正在运行,还能查看到机器的MAC地址。可以使用nmap -sP 192.168.1.0/24。
nmap –sT 192.168.1.100
Nmap将使用connect()系统调用打开目标机上相关端口的连接,并完成三次TCP握手。
nmap –sS 192.168.1.100
使用半开SYN标记扫描,在一定程度上防止被扫描目标主机识别和记录。-sS命令将发送一个SYN扫描探测主机或网络。通过发送一个SYN包(是TCP协议中的第一个包)开始一次SYN的扫描。任何开放的端口都将有一个SYN|ACK响应。然而,攻击者发送一个RST替代ACK,连接中止。三次握手得不到实现,也就很少有站点能记录这样的探测。如果是关闭的端口,对最初的SYN信号的响应也会是RST,让nmap知道该端口不在监听。
nmap –sS –O 192.168.1.100
利用不同的系统对于nmap不同类型探测信号的不同响应来辨别操作系统的类型。